使用 countVectorizer 计算 Skip-gram 频率
Posted
技术标签:
【中文标题】使用 countVectorizer 计算 Skip-gram 频率【英文标题】:Computing Skip-gram Frequency with countVectorizer 【发布时间】:2019-10-20 10:02:58 【问题描述】:我正在尝试计算文本文件中出现频率最高的 skip-gram。 我正在使用 nltk 的 skipgram 和 scikit-learn 的 countVectorizer,但它给了我一个 distinct skip-gram 的列表。因此,当我将它们放入字典中进行计数时,我得到每个 skip-gram 的频率 = 1。
我相信这是因为我使用了 vectorizer.vocabulary_ 方法,它会跳过重复的 skip-gram。
我正在使用此代码https://github.com/nltk/nltk/issues/1428#issuecomment-231647710
在这个原始代码中,他们并没有尝试计算频率,所以不同的skip-grams(词汇)很好。就我而言,如何更改代码以获得由 countVectorizer 生成的所有跳过语法的完整列表?
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)
例如,如果我有一个包含两个字符串“我爱苹果”和“我爱西瓜”的文本 print(d) 应该给出:
('i', 'love'):2
('i', 'apple'):1
('i', 'watermelon'):1
但是现在我到处都是 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
【讨论】:
以上是关于使用 countVectorizer 计算 Skip-gram 频率的主要内容,如果未能解决你的问题,请参考以下文章
我可以在 scikit-learn 中使用 CountVectorizer 来计算未用于提取标记的文档的频率吗?
如何使用 Scikit Learn CountVectorizer 在语料库中获取词频?
如何使用 sklearn CountVectorizer and() 来获取包含任何标点符号作为单独标记的 ngram?