使用Python从语料库中提取最频繁的单词

7 投票
4 回答
21478 浏览
提问于 2025-04-17 13:31

也许这个问题有点傻,但我在用Python提取一个文本库中出现频率最高的十个单词时遇到了问题。这是我目前的代码。(顺便说一下,我在用NLTK这个工具来读取一个包含两个子类别的文本库,每个子类别有10个.txt文件)

import re
import string
from nltk.corpus import stopwords
stoplist = stopwords.words('dutch')

from collections import defaultdict
from operator import itemgetter

def toptenwords(mycorpus):
    words = mycorpus.words()
    no_capitals = set([word.lower() for word in words]) 
    filtered = [word for word in no_capitals if word not in stoplist]
    no_punct = [s.translate(None, string.punctuation) for s in filtered] 
    wordcounter = {}
    for word in no_punct:
        if word in wordcounter:
            wordcounter[word] += 1
        else:
            wordcounter[word] = 1
    sorting = sorted(wordcounter.iteritems(), key = itemgetter, reverse = True)
    return sorting 

当我用我的文本库来运行这个函数时,它给我打印出一个所有单词的列表,每个单词后面都有个'1'。它给我一个字典,但我所有的值都是1。我知道,比如说单词'baby'在我的文本库中出现了五六次……但它还是显示'baby: 1'……所以它并没有按照我想要的方式工作……
有人能帮我吗?

4 个回答

3

问题出在你使用的 set 上。

一个集合(set)里不能有重复的东西,所以当你用小写字母创建一个单词集合时,从那以后每个单词只会出现一次。

假设你的 words 是:

 ['banana', 'Banana', 'tomato', 'tomato','kiwi']

在你用 lambda 函数把所有字母变成小写后,你得到:

 ['banana', 'banana', 'tomato', 'tomato','kiwi']

但接下来你做了:

 set(['banana', 'Banana', 'tomato', 'tomato','kiwi'])

这时返回的是:

 ['banana','tomato','kiwi']

从那时起,你的计算都是基于 no_capitals 这个集合的,所以每个单词只会出现一次。如果不创建 set,你的程序可能就能正常工作了。

9

用Python的方式:

In [1]: from collections import Counter

In [2]: words = ['hello', 'hell', 'owl', 'hello', 'world', 'war', 'hello', 'war']

In [3]: counter_obj = Counter(words)

In [4]: counter_obj.most_common() #counter_obj.most_common(n=10)
Out[4]: [('hello', 3), ('war', 2), ('hell', 1), ('world', 1), ('owl', 1)]
12

如果你已经在使用NLTK这个工具,可以试试FreqDist(samples)这个函数。它可以根据你给定的样本生成一个词频分布。然后,你可以使用most_common(n)这个属性,找出样本中出现频率最高的n个单词,结果会按出现频率从高到低排序。大概是这样的:

from nltk.probability import FreqDist
fdist = FreqDist(stoplist)
top_ten = fdist.most_common(10)

撰写回答