2012-09-17 6 views
0

텍스트 문서의 가장 빈번한 단어 10 개를 인쇄하는 작은 파이썬 스크립트가 있으며 (각 단어는 2 자 이상입니다) 인쇄하려면 스크립트를 계속해야합니다. 문서에서 가장 드문 단어 10 개. 나는 상대적으로 작동하는 스크립트를 가지고 있습니다. 단, 단어가 될 때 가장 빈번하게 발생하는 10 개의 단어 (숫자와 정수)가 인쇄됩니다. 단어 만 반복하고 숫자를 제외하려면 어떻게해야합니까? 여기에 내 전체 스크립트입니다파이썬을 사용하여 텍스트 문서의 가장 드문 단어 10 개를 인쇄하십시오.

# Most Frequent Words: 
from string import punctuation 
from collections import defaultdict 

number = 10 
words = {} 

with open("charactermask.txt") as txt_file: 
    words = [x.strip(punctuation).lower() for x in txt_file.read().split()] 

counter = defaultdict(int) 

for word in words: 
    if len(word) >= 2: 
    counter[word] += 1 

top_words = sorted(counter.iteritems(), 
        key=lambda(word, count): (-count, word))[:number] 

for word, frequency in top_words: 
    print "%s: %d" % (word, frequency) 


# Least Frequent Words: 
least_words = sorted(counter.iteritems(), 
        key=lambda (word, count): (count, word))[:number] 

for word, frequency in least_words: 
    print "%s: %d" % (word, frequency) 

편집 : 문서합니다 (# Least Frequent Words 주석 아래 부분)의 끝은 고정이 필요한 부분이다.

답변

1

당신은 필터 필요 해요 - 당신은 "단어"를 정의 할 수 있지만 일치하는 정규 표현식을 변경 : 당신이 번호를 포함하지 않도록 단어 주파수 테이블을 원하는가 지금

import re 
alphaonly = re.compile(r"^[a-z]{2,}$") 

을 처음에는입니까? 아니면 그냥 테이블에서 최소 자주 단어를 추출 할 때 숫자 건너 뛸

counter = defaultdict(int) 

with open("charactermask.txt") as txt_file: 
    for line in txt_file: 
     for word in line.strip().split(): 
      word = word.strip(punctuation).lower() 
      if alphaonly.match(word): 
       counter[word] += 1 

을 원하는가?

words_by_freq = sorted(counter.iteritems(), 
         key=lambda(word, count): (count, word)) 

i = 0 
for word, frequency in words_by_freq: 
    if alphaonly.match(word): 
     i += 1 
     sys.stdout.write("{}: {}\n".format(word, frequency)) 
    if i == number: break 
+0

잘 작동합니다. 철저한 답변 주셔서 감사합니다. –

1

[0-9]과 일치하는 정규 표현식을 실행하는 함수 letters_only()이 필요합니다. 일치하는 것이 있으면 거짓을 반환합니다. 당신이 for word in filter(letters_only, words) 말 대신, for word in words 말을 어디에서 이런 식으로 뭔가가, 그리고

def letters_only(word): 
    return re.search(r'[0-9]', word) is None 

을 ::.

+0

굉장한 답변은 완벽하게 작동했습니다. –

+0

좋아요. 또한 내 대답을 wim이 제안한 짧은 형식으로 변경했습니다. 나는 더 긴 형태가 더 분명하다고 생각하지만, 아마도 그것은 내가 쫓아 내야 할 코드 틱 일뿐입니다. :) downvote에 의해 약간 당황하게되었지만 그렇게 간다. – syrion

관련 문제