使用countVectorizer

时间:2019-06-04 20:56:42

标签: python scikit-learn nlp nltk n-gram

我正在尝试计算文本文件中最频繁的跳过语法。 我使用的是nltk的skipgram和scikit-learn的countVectorizer,但是它提供了 distinct 跳过gram的列表。因此,当我将它们放在字典中进行计数时,每个跳过语法的频率都为1。

我相信这是因为我正在使用vectorizer.vocabulary_方法,该方法会跳过重复的跳过语法。

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

在此原始代码中,他们并没有尝试计算频率,因此可以使用不同的skip-gram(词汇)。就我而言,如何更改代码,以便获得由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 个答案:

答案 0 :(得分:2)

您已很好地确定了问题,不应该使用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)

但是在这里,请使用vectorizer对象将文本实际转换为其矢量化版本:

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}