按发生次数排序Bigram NLTK

时间:2016-10-12 08:48:52

标签: python nltk

我目前正在运行此代码,用于搜索整个文本处理的bigram。

变量alltext实际上是长文本(超过100万字)

我运行此代码来提取bigram

from nltk.tokenize import RegexpTokenizer
from nltk.corpus import stopwords
import re



tokenizer = RegexpTokenizer(r'([A-za-z]{2,})')
tokens = tokenizer.tokenize(alltext)
stopwords_list = stopwords.words('english')
tokens = [word for word in tokens if word not in stopwords.words('english')]
finder = BigramCollocationFinder.from_words(tokens, window_size = 2)
bigram_measures = nltk.collocations.BigramAssocMeasures()

for k,v in finder.ngram_fd.items():
    print k,v

上面的代码搜索可能的双字母组的频率出现。

代码会打印出很多bigrams及其出现次数。

输出类似于此。

(('upper', 'front'), 1)
(('pad', 'Teething'), 1)
(('shoulder', 'strap'), 1)
(('outer', 'breathable'), 1)
(('memory', 'foam'), 1)
(('shields', 'inner'), 1)
(('The', 'garment'), 2)
......

type(finder.ngram_fd.items()) is a list.

如何从最高到最低出现次数对频率进行排序。我的愿望结果将是。

(('The', 'garment'), 2)
(('upper', 'front'), 1)
(('pad', 'Teething'), 1)
(('shoulder', 'strap'), 1)
(('outer', 'breathable'), 1)
(('memory', 'foam'), 1)
(('shields', 'inner'), 1)

非常感谢,我对nltk和文本处理都很陌生,所以我的解释不会那么清楚。

1 个答案:

答案 0 :(得分:4)

看起来finder.ngram_fd是一本字典。在这种情况下,在Python 3中,items()方法不返回列表,因此您必须将其强制转换为一个列表。

获得列表后,您只需使用sort()方法的key=参数,该参数指定我们要排序的内容:

ngram = list(finder.ngram_fd.items())
ngram.sort(key=lambda item: item[-1], reverse=True)

您必须添加reverse=True,否则结果将按升序排列。请注意,这会对列表进行排序。当您想要避免复制时,这是最好的。如果您希望获得一个新列表,只需使用具有相同参数的sorted()内置函数。

或者,你可以用operator.itemgetter模块替换lambda,它执行相同的操作:

ngram.sort(key=operator.itemgetter(-1), reverse=True)