第3部分:词向量的更多的乐趣
Code
本教程代码第3部分住在这里。
数字表示的单词
现在,我们已经训练模型的语义理解的话,我们应该如何使用它呢?如果你看下,Word2Vec模型训练在第2部分中包含一个特征向量的每个单词词汇表,存储在一个numpy数组称为“syn0”:
>>> # Load the model that we created in Part 2 >>> from gensim.models import Word2Vec >>> model = Word2Vec.load("300features_40minwords_10context") 2014-08-03 14:50:15,126 : INFO : loading Word2Vec object from 300features_40min_word_count_10context 2014-08-03 14:50:15,777 : INFO : setting ignored attribute syn0norm to None >>> type(model.syn0) <type 'numpy.ndarray'> >>> model.syn0.shape (16492, 300) |
行数syn0是单词的数量模型的词汇,和数量的列对应特征向量的大小,我们将在第2部分中。设置最低字数40与16492年给了我们一个16492字的总词汇特征。个别单词向量可以访问在以下方式:
>>> model["flower"] |
…返回一个1×300 numpy数组。
从单词到段落,尝试1:向量平均
IMDB数据集的一个挑战是可变长度的评论。我们需要找到一种方法来做个别词向量和变换成一个相同的特性集长度为每个review。
因为每个单词300 -维空间向量,我们可以使用向量操作合并每个review。一个方法我们尝试简单平均向量这个词在一个给定的评论(为此,我们停止的话,这只会增加噪音)。
下面的代码平均特征向量,建立在我们的代码从第2部分。
import numpy as np # Make sure that numpy is imported def makeFeatureVec(words, model, num_features): # Function to average all of the word vectors in a given # paragraph # # Pre-initialize an empty numpy array (for speed) featureVec = np.zeros((num_features,),dtype="float32") # nwords = 0. # # Index2word is a list that contains the names of the words in # the model's vocabulary. Convert it to a set, for speed index2word_set = set(model.index2word) # # Loop over each word in the review and, if it is in the model's # vocaublary, add its feature vector to the total for word in words: if word in index2word_set: nwords = nwords + 1. featureVec = np.add(featureVec,model[word]) # # Divide the result by the number of words to get the average featureVec = np.divide(featureVec,nwords) return featureVec def getAvgFeatureVecs(reviews, model, num_features): # Given a set of reviews (each one a list of words), calculate # the average feature vector for each one and return a 2D numpy array # # Initialize a counter counter = 0. # # Preallocate a 2D numpy array, for speed reviewFeatureVecs = np.zeros((len(reviews),num_features),dtype="float32") # # Loop through the reviews for review in reviews: # # Print a status message every 1000th review if counter%1000. == 0.: print "Review %d of %d" % (counter, len(reviews)) # # Call the function (defined above) that makes average feature vectors reviewFeatureVecs[counter] = makeFeatureVec(review, model, \ num_features) # # Increment the counter counter = counter + 1. return reviewFeatureVecs |
现在,我们可以调用这些函数创建每一段的平均向量。以下操作将花几分钟:
# **************************************************************** # Calculate average feature vectors for training and testing sets, # using the functions we defined above. Notice that we now use stop word # removal. clean_train_reviews = [] for review in train["review"]: clean_train_reviews.append( review_to_wordlist( review, \ remove_stopwords=True )) trainDataVecs = getAvgFeatureVecs( clean_train_reviews, model, num_features ) print "Creating average feature vecs for test reviews" clean_test_reviews = [] for review in test["review"]: clean_test_reviews.append( review_to_wordlist( review, \ remove_stopwords=True )) testDataVecs = getAvgFeatureVecs( clean_test_reviews, model, num_features ) |
下一步,使用平均段落向量训练随机森林。注意,在第1部分中,我们只能使用标记训练评价训练模型。
# Fit a random forest to the training data, using 100 trees from sklearn.ensemble import RandomForestClassifier forest = RandomForestClassifier( n_estimators = 100 ) print "Fitting a random forest to labeled training data..." forest = forest.fit( trainDataVecs, train["sentiment"] ) # Test & extract results result = forest.predict( testDataVecs ) # Write the test results output = pd.DataFrame( data={"id":test["id"], "sentiment":result} ) output.to_csv( "Word2Vec_AverageVectors.csv", index=False, quoting=3 ) |
我们发现,这产生的结果比较好,但表现词袋模型的几个百分点。
自element-wise平均向量没有产生惊人的结果,也许我们可以以更智能的方式吗?词权重向量的标准方法是应用“tf-idf”权重,衡量给定单词的重要性在一个给定的一组文件。在Python中提取tf-idf权重的一种方法是通过使用scikit-learn TfidfVectorizer,具有一个接口类似于CountVectorizer第1部分中,我们使用。然而,当我们试图以这种方式加权词向量,我们没有发现实质性的改善性能。
从单词到段落,尝试2:clusters
Word2Vec创建clusters的语义相关的话,那么另一个可能的方法是利用词语的相似度在一个clusters中。分组向量以这种方式被称为“向量量化。“为了实现这个目标,我们首先需要找到这个词的中心clusters,我们可以通过使用诸如k - means聚类算法。
在K - means,我们需要设置一个参数是“K”或clusters的数量。我们应该如何决定clusters创建多少个?反复试验表明,小型clusters,平均只有5单词或clusters,给出更好的结果比大clusters用许多话。聚类的代码如下所示。我们使用scikit-learn执行k - means。
K - means聚类大K可以很慢;下面的代码我电脑上花了40多分钟。下面,我们设置一个定时器在k - means函数需要多长时间。
from sklearn.cluster import KMeans import time start = time.time() # Start time # Set "k" (num_clusters) to be 1/5th of the vocabulary size, or an # average of 5 words per cluster word_vectors = model.syn0 num_clusters = word_vectors.shape[0] / 5 # Initalize a k-means object and use it to extract centroids kmeans_clustering = KMeans( n_clusters = num_clusters ) idx = kmeans_clustering.fit_predict( word_vectors ) # Get the end time and print how long the process took end = time.time() elapsed = end - start print "Time taken for K Means clustering: ", elapsed, "seconds." |
每个词的clusters作业现在存储在idx,从原来的Word2Vec模型和词汇仍然是存储在model.index2word。为了方便起见,我们这些压缩到一个字典如下:
# Create a Word / Index dictionary, mapping each vocabulary word to # a cluster number word_centroid_map = dict(zip( model.index2word, idx )) |
这是有点抽象,所以让我们仔细看看我们的cluster包含什么。您的cluster可能有所不同,因为Word2Vec依赖一个随机数种子。这是一个循环,打印出cluster0到9的单词:
# For the first 10 clusters for cluster in xrange(0,10): # # Print the cluster number print "\nCluster %d" % cluster # # Find all of the words for that cluster number, and print them out words = [] for i in xrange(0,len(word_centroid_map.values())): if( word_centroid_map.values()[i] == cluster ): words.append(word_centroid_map.keys()[i]) print words |
结果非常有趣:
Cluster 0 [u'passport', u'penthouse', u'suite', u'seattle', u'apple'] Cluster 1 [u'unnoticed'] Cluster 2 [u'midst', u'forming', u'forefront', u'feud', u'bonds', u'merge', u'collide', u'dispute', u'rivalry', u'hostile', u'torn', u'advancing', u'aftermath', u'clans', u'ongoing', u'paths', u'opposing', u'sexes', u'factions', u'journeys'] Cluster 3 [u'lori', u'denholm', u'sheffer', u'howell', u'elton', u'gladys', u'menjou', u'caroline', u'polly', u'isabella', u'rossi', u'nora', u'bailey', u'mackenzie', u'bobbie', u'kathleen', u'bianca', u'jacqueline', u'reid', u'joyce', u'bennett', u'fay', u'alexis', u'jayne', u'roland', u'davenport', u'linden', u'trevor', u'seymour', u'craig', u'windsor', u'fletcher', u'barrie', u'deborah', u'hayward', u'samantha', u'debra', u'frances', u'hildy', u'rhonda', u'archer', u'lesley', u'dolores', u'elsie', u'harper', u'carlson', u'ella', u'preston', u'allison', u'sutton', u'yvonne', u'jo', u'bellamy', u'conte', u'stella', u'edmund', u'cuthbert', u'maude', u'ellen', u'hilary', u'phyllis', u'wray', u'darren', u'morton', u'withers', u'bain', u'keller', u'martha', u'henderson', u'madeline', u'kay', u'lacey', u'topper', u'wilding', u'jessie', u'theresa', u'auteuil', u'dane', u'jeanne', u'kathryn', u'bentley', u'valerie', u'suzanne', u'abigail'] Cluster 4 [u'fest', u'flick'] Cluster 5 [u'lobster', u'deer'] Cluster 6 [u'humorless', u'dopey', u'limp'] Cluster 7 [u'enlightening', u'truthful'] Cluster 8 [u'dominates', u'showcases', u'electrifying', u'powerhouse', u'standout', u'versatility', u'astounding'] Cluster 9 [u'succumbs', u'comatose', u'humiliating', u'temper', u'looses', u'leans'] |
我们可以看到,不同质量的cluster。一些有意义——cluster3主要包含名字,和cluster6 - 8包含相关的形容词(cluster6是我最喜欢的)。另一方面, cluster5有点神秘:龙虾和鹿有什么共同点(除了两只动物)? cluster0更糟:小棚屋和套房似乎属于彼此,但他们似乎不属于苹果和护照。cluster2包含…也许战争相关的单词?也许我们的算法效果最好的形容词。
无论如何,现在我们有一个cluster (或“重心”)转让对于每一个单词,我们可以定义一个函数来检查转换成bags-of-centroids。这个作品就像袋单词但使用语义相关的cluster,而不是个别单词:
def create_bag_of_centroids( wordlist, word_centroid_map ): # # The number of clusters is equal to the highest cluster index # in the word / centroid map num_centroids = max( word_centroid_map.values() ) + 1 # # Pre-allocate the bag of centroids vector (for speed) bag_of_centroids = np.zeros( num_centroids, dtype="float32" ) # # Loop over the words in the review. If the word is in the vocabulary, # find which cluster it belongs to, and increment that cluster count # by one for word in wordlist: if word in word_centroid_map: index = word_centroid_map[word] bag_of_centroids[index] += 1 # # Return the "bag of centroids" return bag_of_centroids |
上面的函数对每个评审将给我们一个numpy数组,每个的功能等于cluster的数量。最后,我们创建包的质心为训练集和测试集,然后训练随机森林和提取结果:
# Pre-allocate an array for the training set bags of centroids (for speed) train_centroids = np.zeros( (train["review"].size, num_clusters), \ dtype="float32" ) # Transform the training set reviews into bags of centroids counter = 0 for review in clean_train_reviews: train_centroids[counter] = create_bag_of_centroids( review, \ word_centroid_map ) counter += 1 # Repeat for test reviews test_centroids = np.zeros(( test["review"].size, num_clusters), \ dtype="float32" ) counter = 0 for review in clean_test_reviews: test_centroids[counter] = create_bag_of_centroids( review, \ word_centroid_map ) counter += 1 |
# Fit a random forest and extract predictions forest = RandomForestClassifier(n_estimators = 100) # Fitting the forest may take a few minutes print "Fitting a random forest to labeled training data..." forest = forest.fit(train_centroids,train["sentiment"]) result = forest.predict(test_centroids) # Write the test results output = pd.DataFrame(data={"id":test["id"], "sentiment":result}) output.to_csv( "BagOfCentroids.csv", index=False, quoting=3 ) |
我们发现,上面的代码给了相同的(或稍差)结果相比袋的话在第1部分中。
相关推荐
在本压缩包“机器学习资料第三部分”中,包含了丰富的机器学习和深度学习入门资源,旨在帮助初学者或有志于提升技能的人士系统性地掌握这一领域的重要知识。我们来详细探讨一下其中包含的书籍内容及其价值。 首先,...
3. **机器翻译**:词向量有助于建立源语言和目标语言之间的映射关系,从而提高翻译质量。 4. **问答系统**:词向量可以帮助系统更好地理解问题的含义,并准确地从文档中抽取答案。 #### 六、总结 GoogleNews训练好...
总之,词向量是连接自然语言与机器学习的桥梁,它使得计算机能够理解和处理文本,为对话机器人和其他NLP任务提供强大的支持。通过Keras,我们可以方便地利用和训练词向量模型,提升我们的应用程序的智能水平。
2. 语义理解:FastText词向量能较好地捕捉词的语义关系,例如“国王”和“王后”的向量距离可能比“国王”和“城市”的向量距离更近,这对于语义分析、问答系统和机器翻译等任务大有裨益。 3. 文本分类:FastText...
- **文本分类**:作为输入特征,词向量可以增强机器学习模型对文本的理解能力。 - **问答系统**:词向量有助于理解问题和答案之间的关联,提高问答匹配的准确性。 6. **训练和优化** - **训练参数**:包括窗口...
"深度学习方法训练词向量.pdf" 本文主要介绍了深度学习方法训练词向量的过程。深度学习是一个人工神经网络,它是非监督学习和监督学习相结合的一种模型,旨在用机器学习的思想模拟人脑进行思考的方式去解决问题。...
人工智能和机器学习之分类算法:支持向量机(SVM):人工智能和机器学习概论.docx
在文本分类和情感分析中,可以利用词向量表示文本,再通过机器学习算法进行分类;在自然语言生成中,词向量可以帮助模型理解上下文,生成更连贯的文本。 总的来说,停用词列表和词向量是NLP中的基础工具。停用词...
- **机器翻译**:利用词向量可以更好地理解源语言和目标语言之间的对应关系。 - **语音识别**:通过将语音转录为文本后,再利用词向量来提高识别精度。 - **推荐系统**:通过理解用户兴趣和内容之间的关系,提供个性...
例如,用简单的神经网络模型通过上下文窗口的滑动来预测目标词,使词向量学习更具有自适应性和深度。 在词向量的基础上,深度学习技术可以通过反向传播算法和梯度下降等优化方法,自动学习到能够捕捉词语复杂语义...
这里提到的部分习题解答涵盖了书中的多个重要章节,包括第三章、第四章以及第十章的部分内容,同时也提供了第六章的一个习题解答。尽管解答主要以英文呈现,但质量可靠,对于正在学习这门课程或者准备相关考试的学生...
本资源摘要信息将对贝叶斯统计机器学习的主要内容进行概括,从贝叶斯决策理论到机器学习问题实例,涵盖了机器学习的主要模型、模式识别与机器学习的基本问题等多个方面。 贝叶斯决策理论是机器学习中一个重要的理论...
机器学习导论 第06章 支持向量机 共24页.pdf 机器学习导论 第07章 贝叶斯分类器 共23页.pdf 机器学习导论 第08章 集成学习 共14页.pdf 机器学习导论 第09章 聚类 共16页.pdf 机器学习导论 第10章 降维与度量学习 共...
机器学习导论 第06章 支持向量机 共24页.pdf 机器学习导论 第07章 贝叶斯分类器 共23页.pdf 机器学习导论 第08章 集成学习 共14页.pdf 机器学习导论 第09章 聚类 共16页.pdf 机器学习导论 第10章 降维与度量学习 共...
《Python3机器学习实战教程》是一份深度剖析机器学习理论与实践的综合资源包,它以Python3编程语言为工具,旨在帮助读者掌握各种机器学习算法,并通过实战案例加深理解。教程涵盖了从基础到进阶的多个主题,包括K-...
这些成果极大地推动了机器学习领域的发展,使得支持向量机成为现代机器学习的重要组成部分之一。 综上所述,支持向量机作为一种经典的机器学习算法,在理论和实践上都有着极其重要的地位。无论是在线性分类还是非...
Python期末大作业基于机器学习朴素贝叶斯算法和支持向量机算法的微博评论情感分析可视化项目源码Python期末大作业基于机器学习朴素贝叶斯算法和支持向量机算法的微博评论情感分析可视化项目源码Python期末大作业基于...
机器学习算法是机器学习的核心部分,涉及了多种算法,如线性回归、决策树、随机森林、支持向量机、神经网络等。线性回归是最简单的机器学习算法之一,用于预测连续型标签。决策树是一种常用的分类算法,用于解决分类...
搜狗公司基于海量新闻数据构建的词向量模型,是自然语言处理(NLP)领域的重要工具,其核心作用是将词语转换为数值向量,以使计算机能够理解并处理自然语言。这种模型的构建通常涉及到对神经网络,如Word2Vec或GloVe...
实验部分,研究者设计了一个基于混合词向量的深度学习模型,并与基于字符级别词向量的模型进行了比较。结果表明,基于混合词向量的方法在检测DGA域名以及在多类分类任务中表现更优,尤其是在样本较少的小型DGA家族中...