2012-10-22 34 views
3

所以我有一個文本文件,其中有一首來自羅密歐和朱麗葉戲劇的動作1的劇本,我想指出有人說了多少次單詞。如何根據名稱將文本文件中的單詞添加到字典中?

以下是全文:http://pastebin.com/X0gaxAPK

有3人在講文:格雷戈裏,桑普森和亞伯拉罕。

基本上我想爲三位演講者分別製作3個不同的詞典(如果這是最好的方法?)。用字詞分別填充詞典,然後統計整個腳本中每個單詞的多少次。

我該怎麼做呢?我想我可以計算出字數,但我對如何區分誰說什麼並將其分成3個不同的字典給每個人都有點困惑。

我的輸出應該是這個樣子(這是不正確的,但爲例):

Gregory - 
25: the 
15: a 
5: from 
3: while 
1: hello 
etc 

在數量是這個詞的頻率在文件中說。

現在我編寫的代碼可以讀取文本文件,去除標點符號並將文本編譯到列表中。我也不想使用任何外部模塊,我想以老式的方式學習,謝謝。

你不必發佈確切的代碼,只是解釋我需要做什麼,並希望我能弄明白。我正在使用Python 3.

+0

您可能需要使用字典,其中鍵是名稱和值都像字典你在描述 – JeffS

回答

1
import collections 
import string 
c = collections.defaultdict(collections.Counter) 
speaker = None 

with open('/tmp/spam.txt') as f: 
    for line in f: 
    if not line.strip(): 
     # we're on an empty line, the last guy has finished blabbing 
     speaker = None 
     continue 
    if line.count(' ') == 0 and line.strip().endswith(':'): 
     # a new guy is talking now, you might want to refine this event 
     speaker = line.strip()[:-1] 
     continue 
    c[speaker].update(x.strip(string.punctuation).lower() for x in line.split()) 

輸出示例:

In [1]: run /tmp/spam.py 

In [2]: c.keys() 
Out[2]: [None, 'Abraham', 'Gregory', 'Sampson'] 

In [3]: c['Gregory'].most_common(10) 
Out[3]: 
[('the', 7), 
('thou', 6), 
('to', 6), 
('of', 4), 
('and', 4), 
('art', 3), 
('is', 3), 
('it', 3), 
('no', 3), 
('i', 3)] 
1

你不想立即剝離標點符號。前面有一個新行的冒號告訴你一個人的報價開始和結束的位置。這一點很重要,因此您可以知道哪個詞典在給定的引用中附加了單詞。您可能需要某種if-else,根據當前正在說話的人,將其附加到不同的詞典中。

1

這裏是一個天真的實現:

from collections import defaultdict 

import nltk 

def is_dialogue(line): 
    # Add more rules to check if the 
    # line is a dialogue or not 
    if len(line) > 0 and line.find('[') == -1 and line.find(']') == -1: 
     return True 

def get_dialogues(filename, people_list): 
    dialogues = defaultdict(list) 
    people_list = map(lambda x: x+':', people_list) 
    current_person = None 
    with open(filename) as fin: 
     for line in fin: 
      current_line = line.strip().replace('\n','') 
      if current_line in people_list: 
       current_person = current_line 
      if (current_person is not None) and (current_line != current_person) and is_dialogue(current_line): 
       dialogues[current_person].append(current_line) 
    return dialogues 

def get_word_counts(dialogues): 
    word_counts = defaultdict(dict) 
    for (person, dialogue_list) in dialogues.items(): 
     word_count = defaultdict(int) 
     for dialogue in dialogue_list: 
      for word in nltk.tokenize.word_tokenize(dialogue): 
       word_count[word] += 1 
     word_counts[person] = word_count 
    return word_counts 

if __name__ == '__main__': 
    dialogues = get_dialogues('script.txt', ['Sampson', 'Gregory', 'Abraham']) 
    word_counts = get_word_counts(dialogues) 
    print word_counts 
相關問題