在Python中查找词干后查找单词的频率

时间:2016-12-23 09:20:27

标签: python data-cleaning word-frequency

我正在对一个充满句子的文本文件进行数据清理任务。在完成这些句子后,我想得到我的词干列表中单词的频率。但是我遇到了一个问题,因为在打印词干列表时,我会为每个句子获取一个列表:

[u'anyon', u'think', u'forgotten', u'day', u'parti', u'friend', u'friend', u'paymast', u'us', u'longer', u'memori']

[u'valu', u'friend', u'bought', u'properti', u'actual', u'relev', u'repres', u'actual', u'valu', u'properti']

[u'monster', u'wreck', u'reef', u'cargo', u'vessel', u'week', u'passeng', u'ship', u'least', u'24', u'hour', u'upload', u'com']

我想获得所有单词的频率,但我只是通过使用以下代码获得每个句子的频率:

   fdist = nltk.FreqDist(stem_list)
   for word, frequency in fdist.most_common(50):
         print(u'{};{}'.format(word, frequency))

这产生以下输出:            的朋友; 2 paymast; 1 长; 1 memori; 1 杂色; 1 美国1 天; 1 任意子; 1 遗忘; 1 想; 1 实际; 2 properti; 2 VALU; 2 的朋友; 1 repres; 1 relev; 1 买1 周; 1 货物; 1 怪物; 1 小时; 1 破坏; 1 上传1 passeng; 1 至少1 礁1 24; 1 容器; 1 船舶; 1 COM; 1 内; 1 区域; 1 territori; 1 自1 水; 1 3; 1

“朋友”这个词被计算两次,因为它是两个不同的句子。我怎么能把它算作朋友一次并展示朋友;在这种情况下是3?

3 个答案:

答案 0 :(得分:0)

您可以在一个列表中连接所有内容:

stem_list = [inner for outer in stem_list for inner in outer]

并以与您相同的方式处理。

否则,您可以保留相同的代码,但不是打印,而是创建一个字典并用您获得的值填充它。每次获得新单词时,都会创建该键,然后添加该值。

all_words_count = dict()
for word, frequency in fdist.most_common(50):
    if word in all_words_count : # Already found
        all_words_count[word] += frequency
    else : # Not found yet
        all_words_count[word] = frequency

for word in all_words_count : 
    print(u'{};{}'.format(word, all_words_count[word]))

答案 1 :(得分:0)

我认为最简单的方法是在将数组传递给函数之前组合数组。

allwords = [inner for outer in stem_list for inner in outer]

fdist = nltk.FreqDist(allwords)
    for word, frequency in fdist.most_common(50):
        print(y'{};{}'.format(word, frequency))

或更短:

fdist = nltk.FreqDist([inner for outer in stem_list for inner in outer])
    for word, frequency in fdist.most_common(50):
        print(y'{};{}'.format(word, frequency))

我认为您的输入如下:

stem_list = [[u'anyon', u'think', u'forgotten', u'day', u'parti', u'friend', u'friend', u'paymast', u'us', u'longer', u'memori'],

            [u'valu', u'friend', u'bought', u'properti', u'actual', u'relev', u'repres', u'actual', u'valu', u'properti'],

            [u'monster', u'wreck', u'reef', u'cargo', u'vessel', u'week', u'passeng', u'ship', u'least', u'24', u'hour', u'upload', u'com'],

            [.....], etc for the other sentences ]

所以你有两个数组 - 第一个用于句子,第二个用于sentenc中的单词。使用allwords = [inner for outer in outer in outer in outer],你可以浏览句子并将它们组合成一个单词数组。

答案 2 :(得分:0)

You could flatten your 2D array first with chain.from_iterable:

fdist = nltk.FreqDist(chain.from_iterable(stem_list)):
    for word, frequency in fdist.most_common(50):
        print(u'{};{}'.format(word, frequency))