gpt4 book ai didi

python - NLTK - Bigram 的计数频率

转载 作者:IT老高 更新时间:2023-10-28 20:54:24 26 4
gpt4 key购买 nike

这是一个 Python 和 NLTK 新手问题。

我想找出同时出现 10 次以上且 PMI 最高的二元组的频率。

为此,我正在使用此代码

def get_list_phrases(text):

tweet_phrases = []

for tweet in text:
tweet_words = tweet.split()
tweet_phrases.extend(tweet_words)


bigram_measures = nltk.collocations.BigramAssocMeasures()
finder = BigramCollocationFinder.from_words(tweet_phrases,window_size = 13)
finder.apply_freq_filter(10)
finder.nbest(bigram_measures.pmi,20)

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

但是,这并不将结果限制在前 20 位。我看到频率 < 10 的结果。我是 Python 世界的新手。

有人可以指出如何修改它以仅获得前 20 名。

谢谢

最佳答案

问题在于您尝试使用 apply_freq_filter 的方式。我们正在讨论单词搭配。如您所知,单词搭配是关于单词之间的依赖关系。 BigramCollocationFinder 类继承自一个名为 AbstractCollocationFinder 的类,函数 apply_freq_filter 属于该类。 apply_freq_filter 不应该完全删除某些单词搭配,而是在其他一些函数尝试访问列表时提供过滤的搭配列表。

现在为什么呢?想象一下,如果过滤搭配只是简单地删除它们,那么有许多概率度量,例如似然比或 PMI 本身(计算一个词相对于语料库中其他词的概率),在从随机位置删除词后将无法正常工作在给定的语料库中。通过从给定的单词列表中删除一些搭配,许多潜在的功能和计算将被禁用。此外,在删除之前计算所有这些度量,会带来巨大的计算开销,用户可能根本不需要。

现在,问题是如何正确使用apply_freq_filter函数?有几种方法。在下文中,我将展示问题及其解决方案。

让我们定义一个样本语料库并将其拆分为与您所做的类似的单词列表:

tweet_phrases = "I love iphone . I am so in love with iphone . iphone is great . samsung is great . iphone sucks. I really really love iphone cases. samsung can never beat iphone . samsung is better than apple"
from nltk.collocations import *
import nltk

出于实验目的,我将窗口大小设置为 3:

finder = BigramCollocationFinder.from_words(tweet_phrases.split(), window_size = 3)
finder1 = BigramCollocationFinder.from_words(tweet_phrases.split(), window_size = 3)

请注意,为了比较,我只在 finder1 上使用过滤器:

finder1.apply_freq_filter(2)
bigram_measures = nltk.collocations.BigramAssocMeasures()

现在如果我写:

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

输出是:

(('.', 'is'), 3)
(('iphone', '.'), 3)
(('love', 'iphone'), 3)
(('.', 'iphone'), 2)
(('.', 'samsung'), 2)
(('great', '.'), 2)
(('iphone', 'I'), 2)
(('iphone', 'samsung'), 2)
(('is', '.'), 2)
(('is', 'great'), 2)
(('samsung', 'is'), 2)
(('.', 'I'), 1)
(('.', 'am'), 1)
(('.', 'sucks.'), 1)
(('I', 'am'), 1)
(('I', 'iphone'), 1)
(('I', 'love'), 1)
(('I', 'really'), 1)
(('I', 'so'), 1)
(('am', 'in'), 1)
(('am', 'so'), 1)
(('beat', '.'), 1)
(('beat', 'iphone'), 1)
(('better', 'apple'), 1)
(('better', 'than'), 1)
(('can', 'beat'), 1)
(('can', 'never'), 1)
(('cases.', 'can'), 1)
(('cases.', 'samsung'), 1)
(('great', 'iphone'), 1)
(('great', 'samsung'), 1)
(('in', 'love'), 1)
(('in', 'with'), 1)
(('iphone', 'cases.'), 1)
(('iphone', 'great'), 1)
(('iphone', 'is'), 1)
(('iphone', 'sucks.'), 1)
(('is', 'better'), 1)
(('is', 'than'), 1)
(('love', '.'), 1)
(('love', 'cases.'), 1)
(('love', 'with'), 1)
(('never', 'beat'), 1)
(('never', 'iphone'), 1)
(('really', 'iphone'), 1)
(('really', 'love'), 1)
(('samsung', 'better'), 1)
(('samsung', 'can'), 1)
(('samsung', 'great'), 1)
(('samsung', 'never'), 1)
(('so', 'in'), 1)
(('so', 'love'), 1)
(('sucks.', 'I'), 1)
(('sucks.', 'really'), 1)
(('than', 'apple'), 1)
(('with', '.'), 1)
(('with', 'iphone'), 1)

如果我为 finder1 编写相同的内容,我将得到相同的结果。所以,乍一看,过滤器不起作用。但是,看看它是如何工作的:诀窍是使用 score_ngrams

如果我在 finder 上使用 score_ngrams,它将是:

finder.score_ngrams (bigram_measures.pmi)

输出是:

[(('am', 'in'), 5.285402218862249), (('am', 'so'), 5.285402218862249), (('better', 'apple'), 5.285402218862249), (('better', 'than'), 5.285402218862249), (('can', 'beat'), 5.285402218862249), (('can', 'never'), 5.285402218862249), (('cases.', 'can'), 5.285402218862249), (('in', 'with'), 5.285402218862249), (('never', 'beat'), 5.285402218862249), (('so', 'in'), 5.285402218862249), (('than', 'apple'), 5.285402218862249), (('sucks.', 'really'), 4.285402218862249), (('is', 'great'), 3.7004397181410926), (('I', 'am'), 3.7004397181410926), (('I', 'so'), 3.7004397181410926), (('cases.', 'samsung'), 3.7004397181410926), (('in', 'love'), 3.7004397181410926), (('is', 'better'), 3.7004397181410926), (('is', 'than'), 3.7004397181410926), (('love', 'cases.'), 3.7004397181410926), (('love', 'with'), 3.7004397181410926), (('samsung', 'better'), 3.7004397181410926), (('samsung', 'can'), 3.7004397181410926), (('samsung', 'never'), 3.7004397181410926), (('so', 'love'), 3.7004397181410926), (('sucks.', 'I'), 3.7004397181410926), (('samsung', 'is'), 3.115477217419936), (('.', 'am'), 2.9634741239748865), (('.', 'sucks.'), 2.9634741239748865), (('beat', '.'), 2.9634741239748865), (('with', '.'), 2.9634741239748865), (('.', 'is'), 2.963474123974886), (('great', '.'), 2.963474123974886), (('love', 'iphone'), 2.7004397181410926), (('I', 'really'), 2.7004397181410926), (('beat', 'iphone'), 2.7004397181410926), (('great', 'samsung'), 2.7004397181410926), (('iphone', 'cases.'), 2.7004397181410926), (('iphone', 'sucks.'), 2.7004397181410926), (('never', 'iphone'), 2.7004397181410926), (('really', 'love'), 2.7004397181410926), (('samsung', 'great'), 2.7004397181410926), (('with', 'iphone'), 2.7004397181410926), (('.', 'samsung'), 2.37851162325373), (('is', '.'), 2.37851162325373), (('iphone', 'I'), 2.1154772174199366), (('iphone', 'samsung'), 2.1154772174199366), (('I', 'love'), 2.115477217419936), (('iphone', '.'), 1.963474123974886), (('great', 'iphone'), 1.7004397181410922), (('iphone', 'great'), 1.7004397181410922), (('really', 'iphone'), 1.7004397181410922), (('.', 'iphone'), 1.37851162325373), (('.', 'I'), 1.37851162325373), (('love', '.'), 1.37851162325373), (('I', 'iphone'), 1.1154772174199366), (('iphone', 'is'), 1.1154772174199366)]

现在请注意,当我为过滤到频率 2 的 finder1 计算相同的值时会发生什么:

finder1.score_ngrams(bigram_measures.pmi)

和输出:

[(('is', 'great'), 3.7004397181410926), (('samsung', 'is'), 3.115477217419936), (('.', 'is'), 2.963474123974886), (('great', '.'), 2.963474123974886), (('love', 'iphone'), 2.7004397181410926), (('.', 'samsung'), 2.37851162325373), (('is', '.'), 2.37851162325373), (('iphone', 'I'), 2.1154772174199366), (('iphone', 'samsung'), 2.1154772174199366), (('iphone', '.'), 1.963474123974886), (('.', 'iphone'), 1.37851162325373)]

请注意,该列表中不存在频率小于 2 的所有搭配;这正是您正在寻找的结果。所以过滤器起作用了。此外,文档给出了关于这个问题的最小提示。

我希望这已经回答了您的问题。否则,请告诉我。

免责声明:如果您主要处理推文,则 13 的窗口大小太大了。如果您注意到,在我的样本语料库中,我的样本推文的大小太小,以至于应用 13 的窗口大小可能会导致查找不相关的搭配。

关于python - NLTK - Bigram 的计数频率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19145332/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com