2015-02-07 6 views
0

미리 정의 된 단어 목록과 일치하는 텍스트에서 빈도 분포를 만드는 또 다른 파이썬 문제가 있습니다. 사실, 약 10,000 개 이상의 텍스트 파일 (각 단어는 약 15,000 단어로 구성)을 가지고 작업하며 약 6,000 개의 단어/표현 목록 (vocabulary_dict)과 비교하여 일치 시키려고합니다. 결과는 해당 빈도로 첨부 된 모든 항목의 사전이어야합니다.단어/표현식 목록 빈도 분포 - 성능 향상

sample text = "As the prices of U.S. homes started to falter, doubts arose throughout the global financial system. Banks became weaker, private credit markets stopped functioning, and by the end of the year it was clear that the world banks had sunk into a global recession." 

vocabulary_dict = ['prices', 'banks', 'world banks', 'private credit marktes', 'recession', 'global recession'] 

def list_textfiles(directory): 
    # Creates a list of all files stored in DIRECTORY ending on '.txt' 
    textfiles = [] 
    for filename in listdir(directory): 
     if filename.endswith(".txt"): 
      textfiles.append(directory + "/" + filename) 
    return textfiles 

for filename in list_textfiles(directory): 
    # inread each report as textfile, match tokenized text with predefined wordlist and count number of occurences of each element of that wordlist 
    sample_text = read_textfile(filename).lower() 
    splitted = nltk.word_tokenize(sample_text) 
    c = Counter() 
    c.update(splitted) 
    outfile = open(filename[:-4] + '_output' + '.txt', mode = 'w') 
    string = str(filename) # write certain part of filename to outfile 
    string_print = string[string.rfind('/')+1:string.find('-')] + ':' + string[-6:-4] + '.' + string[-8:-6] + '.' + string[-12:-8] 
    for k in sorted(vocabulary_dict): 
    # recognize if wordlist element consist of one or more tokens, accordingly find matching token length in text file (report) 
     spl = k.split() 
     ln = len(spl) 
     if ln > 1: 
      if re.findall(r'\b{0}\b'.format(k),sample_text): 
       vocabulary_dict[k.lower()] += 1 
     elif k in sample_text.split(): 
      vocabulary_dict[k.lower()] += c[k] 
    outfile.write(string_print + '\n') 
    # line wise write each entry of the dictionary to the corresponding outputfile including comapany name, fiscal year end and tabulated frequency distribution 
    for key, value in sorted(vocabulary_dict.items()): 
     outfile.write(str(key) + '\t' + str(value) + '\n') 
    outfile.close() 

# Output accoring to the above stated example should be in the form: 
"selected part of filename (=string1)" 
'prices' 1 
'banks' 2 
'world banks' 1 
'private credit marktes' 1 
'recession' 1 
'global recession' 1 

코드는 아주 잘, 여전히 나는 TEXTFILE을 처리 할 수있는 시간이 약이기 때문에 최적화를위한 공간이 있다고 생각 작품 : 여기에 내가 현재하고있는 무슨이다 1 분. 내 질문 : 단어/표현식 목록에 텍스트를 더 빨리 매칭시킬 수있는 방법이 있습니까? 도움을 많이 주셔서 감사합니다.

답변

0

이것이 더 빠를 지 모르겠지만 확실히 짧습니다. 스핀을 줘? 어떤 경우

text = "As the prices of U.S. homes started to falter, doubts arose throughout the global financial system. Banks became weaker, private credit markets stopped functioning, and by the end of the year it was clear that the world banks had sunk into a global recession." 

newDict = dict((k, text.count(k) + text.count(k.title())) for k in vocabulary_dict) 

, 당신은 CodeReview

에이 질문을해야한다