Как передать вектор Word2Ve c в классификатор в python? - PullRequest
0 голосов
/ 06 марта 2020

мой код в python предназначен для классификации по нескольким меткам; используя векторизатор TF-IDF для кучки твитов. Я просто поместил соответствующую часть кода ниже. мой словарный запас - это лексикон из 14182 слов, а train_array.shape - (6838,14182). также train_labels.shape (6838, 11):

#Vectorizing
vector_maker = TfidfVectorizer(stop_words= set(stopwords.words('english')), vocabulary= vocab) #Vectorizer
train_array = vector_maker.fit_transform(train_tweets).toarray() #Making vector for train tweets
test_array = vector_maker.fit_transform(test_tweets).toarray() #Making vector for test tweets

clf = tree.DecisionTreeClassifier()
clf.fit(train_array,train_labels)
predicted= clf.predict(test_array)
print("Accuracy = ",accuracy_score(test_gold_labels,predicted))

код работает хорошо. Теперь я хочу использовать Word2Ve c в качестве векторизатора. я изменил код на:

#Vectorizing 
vector_maker = Word2Vec(vocab, size=50, window=5, min_count=1, workers=8) #Vectorizer
train_array = vector_maker.train(train_tweets, total_examples=vector_maker.corpus_count, epochs=15) #Making vector for train tweets
test_array = vector_maker.train(test_tweets, total_examples=vector_maker.corpus_count, epochs=15) #Making vector for test tweets

clf = tree.DecisionTreeClassifier()
clf.fit(train_array,train_labels)
predicted= clf.predict(test_array)
print("Accuracy = ",accuracy_score(test_gold_labels,predicted))

, затем я получаю эту ошибку:

ValueError                                Traceback (most recent call last)
<ipython-input-8-3977a56bf1df> in <module>
     71 #clf = RandomForestClassifier()
     72 clf = tree.DecisionTreeClassifier()
---> 73 clf.fit(train_array,train_labels)
     74 predicted= clf.predict(test_array)
     75 print("Accuracy = ",accuracy_score(test_gold_labels,predicted))

~\Anaconda3\lib\site-packages\sklearn\tree\tree.py in fit(self, X, y, sample_weight, check_input, X_idx_sorted)
    814             sample_weight=sample_weight,
    815             check_input=check_input,
--> 816             X_idx_sorted=X_idx_sorted)
    817         return self
    818 

~\Anaconda3\lib\site-packages\sklearn\tree\tree.py in fit(self, X, y, sample_weight, check_input, X_idx_sorted)
    128         random_state = check_random_state(self.random_state)
    129         if check_input:
--> 130             X = check_array(X, dtype=DTYPE, accept_sparse="csc")
    131             y = check_array(y, ensure_2d=False, dtype=None)
    132             if issparse(X):

~\Anaconda3\lib\site-packages\sklearn\utils\validation.py in check_array(array, accept_sparse, accept_large_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, warn_on_dtype, estimator)
    519                     "Reshape your data either using array.reshape(-1, 1) if "
    520                     "your data has a single feature or array.reshape(1, -1) "
--> 521                     "if it contains a single sample.".format(array))
    522 
    523         # in the future np.flexible dtypes will be handled like object dtypes

ValueError: Expected 2D array, got 1D array instead:
array=[1249397. 9119055.].
Reshape your data either using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample.

, тогда я узнаю, что train_array не является массивом. Я имею в виду, я узнаю, что для получения обученных векторов Word2Ve c вы должны использовать vector_maker.wv.vectors. но сначала я попробовал это, чтобы увидеть измерение векторов:

print(vector_maker.wv.vectors.shape)

но я получаю (30, 50). я не должен получить (6838,50)? или что? на самом деле я не знаю так много о том, как работает Word2Ve c. Я прочитал много, но не получил так много. ребята, скажите, что мне делать, чтобы использовать созданные векторы для классификации?

Ответы [ 2 ]

0 голосов
/ 14 марта 2020
#Vectorizing
vector_maker = TfidfVectorizer(stop_words= set(stopwords.words('english')), vocabulary= vocab) #Vectorizer
train_array = vector_maker.fit_transform(train_tweets).toarray() #Making vector for train tweets
test_array = vector_maker.transform(test_tweets).toarray()

clf = tree.DecisionTreeClassifier()
clf.fit(train_array,train_labels)
predicted= clf.predict(test_array)
print("Accuracy = ",accuracy_score(test_gold_labels,predicted))
0 голосов
/ 07 марта 2020

Не повторно .fit() ваши TfidfVectorizer к вашим тестовым данным: это изменит индексы слов и веса, чтобы соответствовать тестовым данным. Скорее, подгонка к тренировочным данным, затем используйте ту же модель подгонки данных поезда к тестовым данным, чтобы отразить тот факт, что вы анализируете тестовые данные только на основе того, что было изучено без него, и имеют совместимую

Ваш код не использует класс gensim Word2Vec правильно:

  • что такое 'vocab'? (Класс Word2Vec нуждается либо в итерируемом учебном корпусе с уже написанным токеном, либо вообще в нем ничего, чтобы вы могли выполнять более поздние шаги вручную. Для этого не требуется ничего, что было бы описано как vocab, и вы не показали, что такое vocab, и если бы вы предоставили корпус для создания экземпляра Word2Vec(), вы бы не назвали train() для этой модели.)

  • . train() не возвращает массивы, соответствующие ни каждому тексту, ни каждому слову: только некоторые сводные цифры об обучении. Позже вы должны спросить модель для каждого изученного слова-вектора, который вам нужен. И словосочетания не являются краткими текстами из нескольких слов (если вы не сделаете что-то вроде усреднения их вместе).

  • Непонятно, если вы предварительно токенизировали тексты в списки слов, как этого требует Word2Vec. Если вы передали необработанные строки вместо слов-токенов, модель будет изучать бессмысленные векторы для каждого символа. Если в ваших текстах всего 30 уникальных символов, это объясняет model.wv.vectors.shape из (30, 50): вы создали ровно 30 словосочетаний по 50 измерений каждый.

Ваш код достаточно далек от работы, поэтому лучше всего было бы пройтись по некоторым функциональным Word2Vec документациям-учебникам, чтобы найти правильный способ его использования, прежде чем пытаться встраивать это в больший scikit-learn учебный конвейер. См., Например, вступительный блокнот OK из предыдущей версии gensim:

https://github.com/RaRe-Technologies/gensim/blob/ff107d6c5cb50d9ab99999cb898ff0aceb192592/docs/notebooks/word2vec.ipynb

...