`
韩悠悠
  • 浏览: 828382 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

机器学习之第二部分:词向量

阅读更多

 

第二部分:词向量
Code
2部分的教程代码住在这里。
 
引入分布式词向量
这部分的教程将重点关注使用分布式Word2Vec创建的词向量算法。(深度学习的概述,以及一些额外的指针教程,看到深度学习是什么?”页面)
 
2部分和第3部分比第1部分承担更多熟悉Python。我们开发了下面的代码在一个双核Macbook Pro,然而,我们还没有成功地在Windows上运行代码。如果你是一个Windows用户,你让它工作,请注意如何在论坛!更多细节,请参见系统设置页面。
 
Word2vec,谷歌于2013年出版,是一个学习的神经网络实现分布式表示单词。其他深或复发性神经网络架构提出了学习单词表示在此之前,但是这些主要问题是需要长时间训练模型。相对于其他模型Word2vec训练很快。
 
Word2Vec不需要标签为了创建有意义的陈述。这是非常有用的,因为在现实世界中大多数数据标记。如果网络是给予足够的训练数据(数百亿的话),它产生有趣的特色词向量。词的意思出现在集群和集群间距为这样一些词的关系,如类比,可以复制使用向量的数学。著名的例子是,训练有素的词向量,“国王-+=王后。
 
看看Google的代码,那样,以及随之而来的论文。本课程也有帮助。原来的代码是在C语言中,但是它已经被移植到其他语言,包括Python。我们鼓励你玩原来的C工具,但警告说,它不是用户友好的开始,如果你是一个程序员(我们不得不手动编辑编译它的头文件)
 
 
最近的工作的斯坦福大学也应用深度学习句子分析;他们的代码在Java中是可用的。然而,他们的方法,这依赖于句子解析,不能应用于一个简单的段落任意长度的方法。
 
分布式词向量是强大的,可用于许多应用程序,尤其是单词预测和翻译。在这里,我们将努力将它们应用于文本分析。
 
Python中使用word2vec
Python,我们将使用优秀的实现word2vec实现包 gensim。如果你不已经安装了gensim,您将需要安装它。有一个很好的教程指导Python Word2Vec实现,在这里。
 
尽管Word2Vec不需要图形处理单元(gpu)和许多学习算法,它是计算密集型的。谷歌的版本和Python版本依赖多线程(并行运行多个进程在你的电脑上节省时间)ln来训练你的模型在合理的时间内,您将需要安装cython(指令)。没有cython Word2Vec将运行安装,但需要几天跑而不是分钟。
 
准备训练模型
现在说清楚讲明白!首先,我们从pandas读到数据,正如我们在第1部分中所做的一样。在第1部分,我们现在使用unlabeledTrain.tsv,其中包含50000额外的评论没有标签。当我们建立了袋单词模型在第1部分中,额外的标记训练评论并不有用。然而,由于Word2Vec可以从无标号数据,现在可以使用这些额外的50000条评论。
import pandas as pd

# Read data from files
train = pd.read_csv( "labeledTrainData.tsv", header=0,
delimiter="\t", quoting=3 )
test = pd.read_csv( "testData.tsv", header=0, delimiter="\t", quoting=3 )
unlabeled_train = pd.read_csv( "unlabeledTrainData.tsv", header=0,
delimiter="\t", quoting=3 )


# Verify the number of reviews that were read (100,000 in total)
print "Read %d labeled train reviews, %d labeled test reviews, " \
"and %d unlabeled reviews\n" % (train["review"].size,
test["review"].size, unlabeled_train["review"].size )
 
我们写的清理data函数和part1部分类似,虽然现在有一些差异。首先,训练Word2Vec最好不要删除停止词因为算法依赖于更广泛的上下文句子为了生产高品质的词向量。出于这个原因,我们将停止词删除下面的功能可选。它还可能最好不要删除数据,但是我们离开它留给读者作为练习。
# Import various modules for string cleaning
from bs4 import BeautifulSoup
import re
from nltk.corpus import stopwords

def review_to_wordlist( review, remove_stopwords=False ):
# Function to convert a document to a sequence of words,
# optionally removing stop words. Returns a list of words.
#
# 1. Remove HTML
review_text = BeautifulSoup(review).get_text()
#
# 2. Remove non-letters
review_text = re.sub("[^a-zA-Z]"," ", review_text)
#
# 3. Convert words to lower case and split them
words = review_text.lower().split()
#
# 4. Optionally remove stop words (false by default)
if remove_stopwords:
stops = set(stopwords.words("english"))
words = [w for w in words if not w in stops]
#
# 5. Return a list of words
return(words)
接下来,我们想要一个特定的输入格式。Word2Vec预计单个的句子,每一个单词列表。换句话说,输入格式列表的列表。
 
它不是简单的如何一个段落分割成句子。有各种各样的陷阱在自然语言。英语句子结尾?”“!“”“”.“”,除此之外,间距和大小写也不是可靠的指导。出于这个原因,我们将使用NLTKpunkt记号赋予器对句子分割。为了使用它,您将需要安装NLTK和使用nltk.download()punkt下载相关训练文件。
# Download the punkt tokenizer for sentence splitting
import nltk.data
nltk.download()

# Load the punkt tokenizer
tokenizer = nltk.data.load('tokenizers/punkt/english.pickle')

# Define a function to split a review into parsed sentences
def review_to_sentences( review, tokenizer, remove_stopwords=False ):
# Function to split a review into parsed sentences. Returns a
# list of sentences, where each sentence is a list of words
#
# 1. Use the NLTK tokenizer to split the paragraph into sentences
raw_sentences = tokenizer.tokenize(review.strip())
#
# 2. Loop over each sentence
sentences = []
for raw_sentence in raw_sentences:
# If a sentence is empty, skip it
if len(raw_sentence) > 0:
# Otherwise, call review_to_wordlist to get a list of words
sentences.append( review_to_wordlist( raw_sentence, \
remove_stopwords ))
#
# Return the list of sentences (each sentence is a list of words,
# so this returns a list of lists
return sentences
 
现在,我们可以将这个函数应用到我们的数据,准备输入到Word2Vec(这将需要几分钟):
sentences = [] # Initialize an empty list of sentences


print "Parsing sentences from training set"
for review in train["review"]:
sentences += review_to_sentences(review, tokenizer)

print "Parsing sentences from unlabeled set"
for review in unlabeled_train["review"]:
sentences += review_to_sentences(review, tokenizer)
你可能会获得一些警告BeautifulSoup关于url的句子。这些都是没有什么可担心的(虽然你可能想考虑删除url来清洁文本)
 
我们可以看一下输出,看看这不同于第1部分:
>>> # Check how many sentences we have in total - should be around 850,000+
... print len(sentences)
857234

>>> print sentences[0]
[u'with', u'all', u'this', u'stuff', u'going', u'down', u'at', u'the', u'moment', u'with', u'mj', u'i', u've', u'started', u'listening', u'to', u'his', u'music', u'watching', u'the', u'odd', u'documentary', u'here', u'and', u'there', u'watched', u'the', u'wiz', u'and', u'watched', u'moonwalker', u'again']

>>> print sentences[1]
[u'maybe', u'i', u'just', u'want', u'to', u'get', u'a', u'certain', u'insight', u'into', u'this', u'guy', u'who', u'i', u'thought', u'was', u'really', u'cool', u'in', u'the', u'eighties', u'just', u'to', u'maybe', u'make', u'up', u'my', u'mind', u'whether', u'he', u'is', u'guilty', u'or', u'innocent']
一个小细节注意的区别是“+ =”“append”,Python列表。在许多应用程序中这两个是可以互换的,但他们不是。如果你是apepnd列表到另一个列表,列表的列表,“append”只会添加第一个列表;您需要使用“+ =”为了加入所有的列表。
 
 
训练和保存您的模型
列表解析句子,我们准备训练模型。有很多影响运行时的参数选择和最终的质量模型。下面的算法细节,请参阅word2vec API文档以及谷歌文档。
 
Architecture: Architecture选项(默认) skip-gram或连续词袋。我们发现skip-gram略微慢一点但产生更好的结果。
Training algorithm:分层softmax(默认)或负面抽样。对我们来说,默认运行良好。
Downsampling of frequent words:谷歌文档推荐值是0.000010.001之间。对我们来说,值接近0.001似乎提高最终模型的准确性。
词向量维度(Word vector dimensionality):更多的特性导致长时间运行时,通常,但不总是,导致更好的模型。合理的值可以在数十到数百;我们使用300
Context / window size:多少个单词的上下文应该训练算法考虑?10似乎适合层次softmax(越多越好,在一定程度上)
工作线程(Worker threads):并行流程运行的数量。大多数系统上工作在46之间。
最低字数(Minimum word count):这有助于词汇的大小限制为有意义的单词。任何单词,至少不会发生这许多次在所有文件将被忽略。合理的值可能是介于10100之间。在这种情况下,由于每个电影发生的30,我们设置了最低字数到40,避免过分重视个人电影标题。这导致了整体的词汇量的大小在15000字左右。更高的价值也有助于限制运行时。
 
选择参数并不容易,但是一旦我们选择参数,创建Word2Vec模型很直观:
# Import the built-in logging module and configure it so that Word2Vec
# creates nice output messages
import logging
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s',\
level=logging.INFO)
# Set values for various parameters
num_features = 300 # Word vector dimensionality
min_word_count = 40 # Minimum word count
num_workers = 4 # Number of threads to run in parallel
context = 10 # Context window size
downsampling = 1e-3 # Downsample setting for frequent words
# Initialize and train the model (this will take some time)
from gensim.models import word2vec
print "Training model..."
model = word2vec.Word2Vec(sentences, workers=num_workers, \
size=num_features, min_count = min_word_count, \
window = context, sample = downsampling)
# If you don't plan to train the model any further, calling
# init_sims will make the model much more memory-efficient.
model.init_sims(replace=True)
# It can be helpful to create a meaningful model name and
# save the model for later use. You can load it later using Word2Vec.load()
model_name = "300features_40minwords_10context"
model.save(model_name)
 
双核Macbook Pro,这花了不到15分钟运行使用4工作线程。然而,这将取决于你的电脑。幸运的是,有打印信息消息日志记录功能。
 
如果你在MacLinux系统上,您可以使用“top”命令从内部终端(不是在Python)您的系统是否成功的并行模型的训练。类型
 
> top -o cpu
变成一个终端窗口,而模型的训练。4worker,应该Python列表中的第一个进程,它应该显示300 - 400%CPU使用率。
如果你的CPU使用率较低,这可能是因为cython并不在你的机器上正常工作。
 
探索模型的结果
祝贺使它成功地通过一切到目前为止!让我们看看我们创建我们的75000训练评估模型。
 
“doesnt_match”函数将试图推断出它在一组词是不是来自另外的组:
>>> model.doesnt_match("man woman child kitchen".split())
'kitchen'
我们的模型可以区分不同的意义!它知道,男人,妇女和儿童比他们更相似的厨房。更多勘探表明,该模型是敏感的细微差别的意义,比如国家和城市之间的差异:
>>> model.doesnt_match("france england germany berlin".split())
'berlin'
虽然我们使用的相对较小的训练集,这当然不是完美:
>>> model.doesnt_match("paris berlin london austria".split())
'paris'
我们也可以使用“most_similar”功能来获得洞察集群模型的词:
>>> model.most_similar("man")
[(u'woman', 0.6056041121482849), (u'guy', 0.4935004413127899), (u'boy', 0.48933547735214233), (u'men', 0.4632953703403473), (u'person', 0.45742249488830566), (u'lady', 0.4487500488758087), (u'himself', 0.4288588762283325), (u'girl', 0.4166809320449829), (u'his', 0.3853422999382019), (u'he', 0.38293731212615967)]

>>> model.most_similar("queen")
[(u'princess', 0.519856333732605), (u'latifah', 0.47644317150115967), (u'prince', 0.45914226770401), (u'king', 0.4466976821422577), (u'elizabeth', 0.4134873151779175), (u'antoinette', 0.41033703088760376), (u'marie', 0.4061327874660492), (u'stepmother', 0.4040161967277527), (u'belle', 0.38827288150787354), (u'lovely', 0.38668593764305115)]
鉴于我们特定的训练集,这并不奇怪,“Latifah”是最高达到相似的“Queen”
 
或者,更多文本相关分析:
>>> model.most_similar("awful")
[(u'terrible', 0.6812670230865479), (u'horrible', 0.62867271900177), (u'dreadful', 0.5879652500152588), (u'laughable', 0.5469599962234497), (u'horrendous', 0.5167273283004761), (u'atrocious', 0.5115568041801453), (u'ridiculous', 0.5104714632034302), (u'abysmal', 0.5015234351158142), (u'pathetic', 0.4880446791648865), (u'embarrassing', 0.48272213339805603)]
看来我们有相当好的模型语义——至少一样好袋的话。但是我们如何使用这些华丽的词分布向量为监督学习?下一节将尝试。
 
分享到:
评论

相关推荐

    机器学习工程师从算法基础到实战案例

    第二阶段:机器学习经典算法 回归算法 决策树与随机森林 贝叶斯算法 Xgboost 支持向量机算法 时间序列AIRMA模型 神经网络基础 神经网络架构 PCA降维与SVD矩阵分解 聚类算法 推荐系统 Word2Vec 第三阶段:机器学习...

    text-classification-cn:中文文本分类实践,基于搜狗新闻语料库,采用传统机器学习方法以及预训练模型等方法

    第2部分:基于预训练词向量模型,使用Keras工具进行文本分类,用到了CNN 本文语料:,密码:P9M4。更多新闻标注语料,。 预训练词向量模型来自,下载地址: 。 第1部分:基于scikit-learn机器学习的文本分类方法 ...

    Fake-News-Detector:基于机器学习的虚假新闻检测器

    以将原始文本标记为fake或not_fake fake知识比较当今使用的词嵌入应用程序的不同方法在两者上都使用像Gensim这样的神经嵌入实现词向量化和段落矢量化超调谐神经嵌入算法作为端到端流水线的一部分使用标准的行业分类...

    基于Python机器学习深度学习实现酒店评论的中文情感分析.rar

    基于Python机器学习bert实现酒店评论的中文情感分析.rar 1.Python环境 在python官网https://www.python.org/downloads/ 下载计算机对应的python版本,本人使用的是Python2.7.13的版本。 2.第三方模块 本实例代码的...

    颜色分类leetcode-coding-blocks-machine-learning:编码块机器学习

    机器学习简介 Python 回顾 中级 Python 机器学习简介 数据生成和可视化 Python 中的线性代数 第 2 部分:监督学习算法 线性回归 局部加权回归 多元回归 逻辑回归 K-最近邻 朴素贝叶斯 支持向量机 决策树和随机森林 ...

    机器学习实战之朴素贝叶斯(二)文本分类

    朴素贝叶斯(二)文本分类朴素贝叶斯的一般流程用python进行文本分类准备数据:从文本中构建词向量训练算法:从词向量计算概率测试算法:朴素贝叶斯分类函数文档词袋模型 朴素贝叶斯的一般流程 (1)收集数据:任何...

    基础篇:大模型实战-Embedding(第三节课)

    3、在机器学习中,表示学习的主要目标是什么? A. 最小化损失函数 B. 寻找数据的最佳表示 C. 增加模型的准确性 D. 避免过拟合 答:B 4、Word2Vec 模型主要用于什么任务? A. 图像分类 B. 语音识别 C. 单词嵌入学习 ...

    Python 笔记源码.7z

    03-Python基础第二部分 04-Python基础第三部分 05-面向对急 06-MysQL 07-网络编程 08-多线程 09-MongoDB数据库 10-正则表达式 11-Git 12-电子词典 13-HTMLCSS第一部分 14-HTML&CSS第二部分 15-前端项目 16- fask 17-...

    python源码笔记实战 物超所值

    python笔记包括基础和实战+源码,物超所值。 目录: 01-Linux基础 ...24-机器学习介绍 25-决策树 26-朴素贝叶斯分类 27-支持向量机,聚类 28-推荐引擎,自然语言 29-语言识别。图像识别 30-人脸识别

    基于深度学习的文本大数据辅助量刑规则挖掘

    随着大数据时代的到来,人工智能技术在法学领域中得到空前发展,智慧司 法系统和计算法学学科应运而生,文本分析、深度学习等关键技术逐渐被应用到 ...第二部分,文本向量化,首先通过 TF-IDF 方法构造词向

    Python 笔记源码【笔记+教程+示例源码】.zip

    24-机器学习介绍 20-天天果园项目 06-MySQL 19-Django 22-爬虫高级 18-博客项目 14-HTML&CSS第二部分 15-前端项目 08-多线程 16- flask 23-Numpy基础,数据分析 31-股票分析系统 21-爬虫基础 12-电子词典 07-网络编程...

    documentclustering:文档聚类,实现了分层凝聚聚类方法,这是一种机器学习方法,可根据上下文对相似文档进行分组

    文档聚类文档聚类,实现了分层凝聚聚类方法,这是一种机器学习方法,可根据上下文对相似文档进行分组。 #How It Works Urdu Document Clustering 系统分层工作。 ####Feature Extraction 在第一层中,从数据集中提取...

    论文研究-集成多种特征匹配中文实体名称.pdf

    准确匹配实体名称在信息系统集成中有广泛的应用,而在中文环境中,实体名称的...第二种方法利用支持向量机来判断两个名称是否指向同一实体。在中文实体名称的数据集上的实验表明,这些方法和特征有效提高了匹配的效果。

    2022 51杯数学建模C 火灾报警系统问题

    第二问中我们使用了一个复合机器学习模型,同时使用了随机森林, K 最近 邻,支持向量机,逻辑回归 4 种模型,同时使用 CountVectorize 来对文本特征进 行量化,将 4 种模型的结果剔除一个离另外 3 个较远的,再取...

    JDDC大赛第4名解决方案参赛源码+学习说明.zip

    2)使用word2vec创建词向量,构建句子向量后计算余弦相似性;3)LSI等。这些方案的最终得分都没能超越经过优化的tfidf基线。 ## 决赛阶段思路及算法模型 决赛刚开始阶段,我们顺延初赛的思路,继续尝试了一些检索...

    《计算语言学》讲义-中科院 刘群教授

    第二章 词典 词典编纂,组织,检索等。 第三章 语料库 语料库收集,整理,对齐,检索,基于语料库的知识获取。 第四章 词法分析 正则语法与有限状态自动机,HMM与词性标注,汉语词语切分,未定义词识别等。 ...

    python数据分析随书代码

    第 10章 预测性分析与机器学习 225 10.1 scikit-learn概貌 226 10.2 预处理 228 10.3 基于逻辑回归的分类 230 10.4 基于支持向量机的分类 232 10.5 基于ElasticNetCV的回归分析 235 10.6 支持向量回归 237 ...

    大数据整理——数据集成.pdf

    随着⼈ ⼯智能技术的发展,基于决策树、Logistic回归、⽀持向量机(sup port vector machine,SVM)的机器学习⽅法以及基于词向量(word embedding)的深度学习⽅法被应⽤于实体对齐,以提⾼算法的性能。 4.4.4 实体...

    伯禹学习第二次打卡

    seq2seq模型 定义 sequence to sequence模型是一类End-to-End的算法框架,也就是从序列到序列的...输出C称为语义向量,用来表示输入的整个序列的含义,得到语义向量之后,就来到解码过程,把语义向量输入到另一个RNN,R

Global site tag (gtag.js) - Google Analytics