【问题标题】:Sorting Bigram by number of occurrence NLTK按出现次数 NLTK 对 Bigram 进行排序
【发布时间】:2017-02-21 00:03:19
【问题描述】:

我目前正在运行此代码以搜索二元组以进行整个文本处理。

变量 alltext 是非常长的文本(超过 100 万字)

我运行这段代码来提取二元组

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

上面的代码搜索可能出现的二元组的频率。

代码向我打印了很多二元组及其出现次数。

输出与此类似。

(('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 和文本处理还很陌生,所以我的解释不太清楚。

【问题讨论】:

  • 使用for k,v in sorted(finder.ngram_fd.items(), key=lambda t:t[-1], reverse=True)

标签: python nltk


【解决方案1】:

看起来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() 内置函数即可。

或者,您可以将 lambda 替换为 operator.itemgetter 模块,其作用相同:

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

【讨论】:

    猜你喜欢
    • 2023-03-11
    • 2018-03-19
    • 1970-01-01
    • 2019-10-25
    • 2016-08-16
    • 1970-01-01
    • 2016-10-06
    • 1970-01-01
    • 2012-08-04
    相关资源
    最近更新 更多