Получение всех нулей при векторизации моего текстового набора данных после обработки с помощью CountVectorizer - PullRequest
1 голос
/ 08 января 2020

Я делаю очистку и предварительную обработку текстовых данных. после токенизации и необходимых шагов я сейчас пытаюсь сгенерировать матрицу из данных с помощью sklearn CountVectorizer, но когда я запускаю код, он выводит только нули

Это фактический текст, с которым я работаю после того, как я остановил ит.

# Stemming
from nltk.stem import PorterStemmer

ps = PorterStemmer()

stemmed_words=[]
for w in filtered_sent:
    stemmed_words.append(ps.stem(w))

print("Filtered Sentence:",filtered_sent[0:50])
print("Stemmed Sentence:",stemmed_words[0:50])

это вывод текста stemmed_words

print("Stemmed Sentence:",stemmed_words[0:50])
Stemmed Sentence: ['0', 'crack', 'adam', 'disco', 'cooki', 'ecstasi', 'discard', 'travel', '...', '1', 'o.k', '.', 'o.k', '.', 'o.k', '.', 'o.k', '.', 'lar', 'play', 'joke', 'joke', 'joke', 'jo', '...', '2', 'free', 'peopl', 'introduct', 'record', 'entranc', 'entra', '...', '3', 'brawl', 'caus', 'doctor', 'osteopathi', 'unreal', '...', '4', 'nobelium', 'nobelium', 'brawl', 'act', 'doctor', 'osteop', '...', '5', 'freemsg']

Это код для генерации матрицы

from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer

cv = CountVectorizer(analyzer='word', ngram_range=(2, 2))
text_counts = cv.fit_transform(stemmed_words)
print(text_counts[0:10].toarray())

это мой вывод

print(text_counts[0:10].toarray())
[[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]

Я хочу знать, почему я получаю только нули и никаких смешанных значений. спасибо

1 Ответ

0 голосов
/ 08 января 2020

Вам нужно подать неотмеченные предложения к CountVectorizer или TfidfVectorizer, иначе каждое слово понимается как отдельное предложение. Следовательно, есть только нули, потому что он не может найти биграммы в ваших входных данных.

Более простой подход - это изменить метод build_analyzer векторизатора (после self.analyzer == 'word':), так что вам не придется сделай это отдельно.

from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer
from nltk.stem import PorterStemmer
import pandas as pd

ps = PorterStemmer()

class CustomVectorizer(CountVectorizer): 

    # overwrite the build_analyzer method, allowing one to
    # create a custom analyzer for the vectorizer
    def build_analyzer(self):
        """Return a callable that handles preprocessing and tokenization"""
        if callable(self.analyzer):
            return self.analyzer

        preprocess = self.build_preprocessor()

        if self.analyzer == 'char':
            return lambda doc: self._char_ngrams(preprocess(self.decode(doc)))

        elif self.analyzer == 'char_wb':
            return lambda doc: self._char_wb_ngrams(
                preprocess(self.decode(doc)))

        elif self.analyzer == 'word':


            tokenize = self.build_tokenizer()

            lemmatize = lambda doc: \
                    [ps.stem(token) for token in doc]

            stop_words = self.get_stop_words()

            return lambda doc: self._word_ngrams(
                lemmatize(tokenize(preprocess(self.decode(doc)))),
                stop_words)


        else:
            raise ValueError('%s is not a valid tokenization scheme/analyzer' %
                             self.analyzer)

sentences= [" crack adam disco cooki ecstasi discard another sentence", "another sentences"]

vec = CustomVectorizer(analyzer='word', ngram_range=(2, 2))
text_counts = vec.fit_transform(sentences)    
print(pd.DataFrame(text_counts.toarray(),columns=vec.get_feature_names()))
   adam disco  anoth sentenc  cooki ecstasi  crack adam  discard anoth  disco cooki  ecstasi discard
0           1              1              1           1              1            1                1
1           0              1              0           0              0            0                0
...