我目前正在运行此代码,用于搜索整个文本处理的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和文本处理都很陌生,所以我的解释不会那么清楚。
答案 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)