如何根据名称将文本文件中的单词添加到字典中?

时间:2012-10-22 00:22:46

标签: python file list dictionary

所以我有一个文本文件,里面有罗密欧与朱丽叶剧中的第一幕剧本,我想算一个人说一句话多少次。

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

文中有3个人在说:格雷戈里,桑普森和亚伯拉罕。

基本上我想为三个发言者中的每一个制作3个不同的词典(如果这是最好的方法吗?)。用人们分别说出的词汇填充词典,然后计算他们在整个剧本中说出每个词的次数。

我该怎么做呢?我想我可以算出字数,但我对于如何将每个人分别说出什么并将其分成三个不同的字典感到困惑。

我的输出看起来像这样(这不正确,但是一个例子):

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

其中数字是文件中所说单词的频率。

现在我编写的代码读取文本文件,删除标点符号,并将文本编译成列表。我也不想使用任何外部模块,我想用老式的方式来学习,谢谢。

您不必发布确切的代码,只需解释我需要做的事情,希望我能搞清楚。我正在使用Python 3。

3 个答案:

答案 0 :(得分:1)

你不想立即剥离标点符号。以新行开头的冒号告诉您一个人的引用开始和结束的位置。这将非常重要,因此您可以知道要在给定引号中附加单词的字典。您可能需要某种if-else,根据当前正在讲话的人,将其附加到不同的字典中。

答案 1 :(得分: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)]

答案 2 :(得分: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