首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在python中给分类器提供Word2Vec向量?

如何在python中给分类器提供Word2Vec向量?
EN

Stack Overflow用户
提问于 2020-03-06 23:00:22
回答 2查看 1.1K关注 0票数 0

我的python代码用于多标签分类;使用TF-IDF向量器处理大量tweet。我只需将相应的代码部分放在下面。我的词库是14182个单词的词典,train_array.shape是(6838,14182)。train_labels.shape也是(6838,11):

代码语言:javascript
运行
复制
#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))

代码运行良好。现在我想使用Word2Vec作为向量器。我将代码更改为:

代码语言:javascript
运行
复制
#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))

然后我得到了这个错误:

代码语言:javascript
运行
复制
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不是一个数组。我的意思是,我发现为了获得Word2Vec的训练向量,你应该使用vector_maker.wv.vectors。但首先我试着看看向量的维度:

代码语言:javascript
运行
复制
print(vector_maker.wv.vectors.shape)

但我得到(30,50)。我不应该得到(6838,50)吗?不然呢?实际上,我对Word2Vec的工作原理知之甚少。我读了很多书,但没有读到那么多。你们能告诉我应该怎么做才能使用创建的向量进行分类吗?

EN

回答 2

Stack Overflow用户

发布于 2020-03-07 05:53:46

不要将TfidfVectorizer重新添加到测试数据中:它会更改单词索引和权重以匹配测试数据。相反,在训练数据上进行拟合,然后在测试数据上使用相同的训练数据拟合模型,以反映这样一个事实,即您只根据在没有训练数据的情况下学到的知识来分析测试数据,并且具有兼容性

您的代码没有正确使用gensim Word2Vec类:

  • 什么是“单词”?( Word2Vec类需要一个已经标记化的文本的可迭代训练语料库,或者什么都不需要,这样您就可以手动执行后面的步骤。它不需要任何被描述为vocab的东西,并且您还没有展示vocab是什么,如果您在Word2Vec()实例化中提供了一个语料库,那么您就不会在model.)
  • .train()上调用train(),因为它不会返回与每个文本或每个单词对应的数组:只是一些关于训练的汇总数字。你必须稍后向模型询问你所需要的每个学习的单词向量。而且,单词向量不是多单词文本的摘要(除非您将它们平均在一起)。
  • 不清楚您是否按照Word2Vec的要求将文本预标记化为单词列表。如果您传递的是原始字符串,而不是单词标记,则模型将学习每个字符的无意义向量。如果你的文本中只有30个独特的字符,这就解释了(30, 50)model.wv.vectors.shape:你恰好创建了30个词向量,每个词向量50维。

在尝试将其嵌入到更大的scikit-learn培训管道之前,您的代码还远远不能正常工作,因此您最好的办法就是阅读一些函数式Word2Vec文档-教程,了解正确的使用方法。例如,请参阅先前版本的gensim中的OK intro笔记本:

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

票数 0
EN

Stack Overflow用户

发布于 2020-03-14 20:32:05

代码语言:javascript
运行
复制
#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))
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60566647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档