创建文本中单词的字典

Creating a dictionary of the words in text

我想创建一个包含文本中所有不同单词的字典。键是单词,值是单词的频率

dtt = ['you want home at our peace', 'we went our home', 'our home is nice', 'we want peace at home']
word_listT = str(' '.join(dtt)).split()
wordsT = {v:k for (k, v) in enumerate(word_listT)}
print wordsT

我期待这样的事情:

{'we': 2, 'is': 1, 'peace': 2, 'at': 2, 'want': 2, 'our': 3, 'home': 4, 'you': 1, 'went': 1, 'nice': 1}

但是,我收到了这个:

{'we': 14, 'is': 12, 'peace': 16, 'at': 17, 'want': 15, 'our': 10, 'home': 18, 'you': 0, 'went': 7, 'nice': 13}

显然,我滥用了功能或做错了什么。

求求你帮忙

你正在做的事情的问题是你正在存储单词所在的数组索引而不是这些单词的计数。

要实现这一点,您只需使用 collections.Counter

from collections import Counter

dtt = ['you want home at our peace', 'we went our home', 'our home is nice', 'we want peace at home']
counted_words = Counter(' '.join(dtt).split())
# if you want to see what the counted words are you can print it
print counted_words

>>> Counter({'home': 4, 'our': 3, 'we': 2, 'peace': 2, 'at': 2, 'want': 2, 'is': 1, 'you': 1, 'went': 1, 'nice': 1})

一些清理工作: 如评论中所述

str() 对您的 ' '.join(dtt).split()

来说是不必要的

您也可以删除列表分配并在同一行上进行计算

Counter(' '.join(dtt).split())

关于列表索引的更多细节;首先你必须明白你的代码在做什么。

dtt = [
    'you want home at our peace', 
    'we went our home', 
    'our home is nice', 
    'we want peace at home'
]

注意这里有 19 个单词; print len(word_listT) returns 19. 现在在下一行 word_listT = str(' '.join(dtt)).split() 你要列出所有单词,看起来像这样

word_listT = [
    'you', 
    'want', 
    'home', 
    'at', 
    'our', 
    'peace', 
    'we', 
    'went', 
    'our', 
    'home', 
    'our', 
    'home', 
    'is', 
    'nice', 
    'we', 
    'want', 
    'peace', 
    'at', 
    'home'
] 

再数一数:19 个字。最后一个词是'home'。列表索引从 0 开始,因此 0 到 18 = 19 个元素。 yourlist[18] 是 'home'。这与字符串位置或任何东西无关,只是新数组的索引。 :)

试试这个:

from collections import defaultdict

dtt = ['you want home at our peace', 'we went our home', 'our home is nice', 'we want peace at home']
word_list = str(' '.join(dtt)).split()
d = defaultdict(int)
for word in word_list:
    d[word] += 1

enumerate returns 带有索引的单词列表,而不是频率。也就是说,当您创建 wordsT 字典时,每个 v 实际上是 k 的最后一个实例的 word_listT 中的索引。做你想做的事,使用 for 循环可能是最直接的。

wordsT = {}
for word in word_listT:
    try:
        wordsT[word]+=1
    except KeyError:
        wordsT[word] = 1