python - 使用 countVectorizer 计算 Skip-gram 频率

标签 python scikit-learn nlp nltk n-gram

我正在尝试计算文本文件中出现频率最高的 skip-grams。 我正在使用 nltk 的 skipgram 和 scikit-learn 的 countVectorizer,但它给了我一个 distinct skip-grams 的列表。因此,当我将它们放入字典中进行计数时,我得到每个 skip-gram 的频率 = 1。

我相信这是因为我使用的是 vectorizer.vocabulary_ 方法,它会跳过重复的 skip-grams。

我正在使用此代码 https://github.com/nltk/nltk/issues/1428#issuecomment-231647710

在这个原始代码中,他们并没有尝试计算频率,因此不同的 skip-grams(词汇表)很好。就我而言,如何更改代码以便获得 countVectorizer 生成的所有 skip-gram 的完整列表?

import functools
from nltk.util import skipgrams
from nltk import word_tokenize
from sklearn.feature_extraction.text import CountVectorizer

text = [word_tokenize(line.strip()) for line in open('test.txt', 'r')]
skipper = functools.partial(skipgrams, n=2, k=2)
vectorizer = CountVectorizer(analyzer=skipper)
vectorizer.fit(text)
vectorizer.vocabulary_

dict = {}
dict = vectorizer.vocabulary_

def getList(dict): 
    return dict.keys() #get all the skip-grams

#store all skip-grams in a list to count their frequencies
newlist = []
for key in getList(dict):
  newlist.append(key) 

#count frequency of items in list
def count(listOfTuple):       
    count_map = {} 
    for i in listOfTuple: 
        count_map[i] = count_map.get(i, 0) +1
    return count_map 

d = count(newlist)
print(d)

例如,如果我有一个包含两个字符串“i love apple”和“i love watermelon”的文本 print(d) 应该给出:

('i', 'love'):2
('i', 'apple'):1
('i', 'watermelon'):1

但是现在我到处都是 1。

任何帮助将不胜感激!!

最佳答案

您很好地识别了问题,您不应该使用 vectorizer.vocabulary_。所以你可以保留这个:

import functools
from nltk.util import skipgrams
from nltk import word_tokenize
from sklearn.feature_extraction.text import CountVectorizer

text = [word_tokenize(line.strip()) for line in ["I love apple","I love 
pineapple"]]
skipper = functools.partial(skipgrams, n=2, k=2)
vectorizer = CountVectorizer(analyzer=skipper)
vectorizer.fit(text)

但在这里,使用您的矢量化器对象将您的文本实际转换为其矢量化版本:

vectorized_text = vectorizer.transform(text)
print(dict(zip(vectorizer.get_feature_names(),vectorized_text.toarray().sum(axis = 0))))

然后你会如预期的那样得到:

>>> {('I', 'apple'): 1,
     ('I', 'love'): 2,
     ('I', 'pineapple'): 1,
     ('love', 'apple'): 1,
     ('love', 'pineapple'): 1}

关于python - 使用 countVectorizer 计算 Skip-gram 频率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56451249/

相关文章:

machine-learning - 在线设置中 scikit-learn 中使用 PassiveAggressiveClassifier 的正确方法

python - NLTK 正则表达式和 CFG

python - Scrapy 重试中间件失败并显示非标准 http 状态代码

python - 使用 python 从终端读取字符串

python - scikit 中的 pipeline 和 make_pipeline 有什么区别?

python - Gensim 3.8.0 到 Gensim 4.0.0

python - 训练新的 AutoTokenizer 拥抱脸部

python - 管道长时间运行的进程

python - 如何从这个字典列表中找到具有玩家 ID 的 5 个最大分数?

python - 如何使用 python 的 scikit-learn 制作推荐模型