NLP(1) - 使用gensim训练Word2vec

Word2vec

在NLP中,想要处理文本,避不开的问题就是如何表示词。在Word2vec出现之前,词以one-hot形式的编码表示,即一个词由一个仅包含0或1的向量表示,出现的单词位置置为1,其余单词位置置为0。这样的编码方式有一些缺点,其中之一就是任意两个单词计算欧氏距离均相同,这样显然是不太合理的。比如apple和banana应该更加接近,而apple和dog举例应该更远。

顾名思义,Word2vec就是将一个单词转换为一个向量,但是不同于one-hot的编码方式,他更能表现词与词之间的关系。Word2vec所转换的向量的维度是一个参数,需要在训练前手动指定,维度越高,所包含的信息越多,但在训练时时间和空间开销也就越大。

由于本篇主要介绍如何训练Word2vec,算法原理就不展开了。

第三方库

gensim

gensim是一个python主题模型第三方工具包,主要用于自然语言处理(NLP)和信息检索(IR),其中包含了许多高效、易于训练的算法,如Latent Semantic Analysis (LSA/LSI/SVD), Latent Dirichlet Allocation (LDA), Random Projections (RP), Hierarchical Dirichlet Process (HDP) 和 word2vec。本篇主要使用的是gensim中的word2vec模型。

安装gensim也很简单,可以选择使用pip或者conda进行安装。

pip install gensim
conda install gensim

nltk

nltk的全称是Natural Language Toolkit,是一个用于自然语言处理的第三方库。nltk提供了超过50个语料库和字典资源,同时也提供文本方法如分类、分词、标注等。本篇中主要使用到的是nltk中的分词和停用词。

安装nltk的方法同安装gensim,使用pip或者conda。

pip install nltk
conda install nltk

安装完成后,还需要下载nltk中的资源(其内置的语料、模块需要单独下载),在命令行启动python,执行

>>> import nltk
>>> nltk.download('stopwords')
>>> nltk.download('punkt')

Windows用户,可以在C:\Users\你的用户名\AppData\Roaming\nltk_data中看到下载的内容,网络状态不好的情况下,可能会下载失败,此时可以从网上下载对应的压缩,放入指定的文件夹后解压,这样不需要安装上述的方式下载也是可以使用的。

官方下载地址有两个,其中一个是http://www.nltk.org/nltk_data/,另外一个是https://github.com/nltk/nltk_data/tree/gh-pages/packages,找到需要下载的zip压缩包。

其中,stopwords.zip解压到C:\Users\你的用户名\AppData\Roaming\nltk_data\corpora中,punkt.zip解压到C:\Users\你的用户名\AppData\Roaming\nltk_data\tokenizers中。

训练Word2vec

语料库(corpus)

本篇选用的语料库为**20 Newsgroups。**语料库共有20个类别,每个类别有若干篇短文。可以从这里下载到语料库。使用这个语料库训练出的Word2vec,可以应用到下游的分类任务中。

预处理

在训练之前,首先要对文本进行预处理。gensim中的word2vec模型接收的是完整的分词结果,如[‘At’, ‘eight’, “o’clock”, ‘on’, ‘Thursday’, ‘morning’,‘Arthur’, ‘did’, “n’t”, ‘feel’, ‘very’, ‘good’]。

查看数据集中/alt/atheism/49960,前21行均不是正文,引入这些文本会对模型造成一定影响(数据集中的每一个文件都有类似的前缀)。所以首先需要对文本进行清洗。清洗的要求有:

  1. 不包含标点符号;
  2. 所有单词应该转换为小写;
  3. 不包含空行;

总之,我们希望得到的是文章的单词组成的列表。考虑到文本内容的复杂性,分得的词中可能包含数字,或者由符号组成的字符串,或者一些停用词等等,需要进一步加入过滤的条件。

对于本数据集,一个简单的清洗方法是,判断冒号:是否存在于一行内容中,若是的话,则为文件前缀,否则为正文内容,这样对正文造成的影响十较小。代码如下:

with open(file_path, 'r', encoding='utf-8') as file:
		for line in file:
				line = line.lower()
				if ':' in line or line == '':
						continue
				else:
						pass

接着过滤所有的中英文符号,并且使用nltk分词,将分词中的纯数字和停用词过滤掉,考虑到文章中可能有一些不可读取的字节码,引入异常处理,代码如下:

def fetch_tokens(file_path):
        result = []
        tot_words = []
        with open(file_path, 'r', encoding='utf-8') as file:
            try:
                for line 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值