Вычисление частоты пропуска грамм с помощью countVectorizer - PullRequest
3 голосов
/ 04 июня 2019

Я пытаюсь вычислить наиболее частые пропуски в текстовом файле. Я использую скипграмму nltk и countVectorizer scikit-learn, но она дает мне список различных скип-грамм. Следовательно, когда я помещаю их в словарь для подсчета, я получаю частоту = 1 для каждой скипграммы.

Мне кажется, это потому, что я использую метод vectorizer.vocabulary_, который пропускает повторяющиеся скип-граммы.

Я использую этот код https://github.com/nltk/nltk/issues/1428#issuecomment-231647710

В этом оригинальном коде они не пытались вычислить частоту, поэтому отдельные скип-граммы (словарный запас) были в порядке. В моем случае, как я могу изменить код, чтобы получить полный список всех скип-грамм, созданных 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 Ответ

2 голосов
/ 05 июня 2019

Вы хорошо определили проблему, вы не должны использовать 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}
...