首页 > 其他 > 详细

【文本分类-01】Word2vec

时间:2020-07-22 23:43:03      阅读:97      评论:0      收藏:0      [点我收藏+]

目录

  1. 大纲概述
  2. 数据集合
  3. 数据处理
  4. 预训练word2vec模型

一、大纲概述

文本分类这个系列将会有8篇左右文章,从github直接下载代码,从百度云下载训练数据,在pycharm上导入即可使用,包括基于word2vec预训练的文本分类,与及基于近几年的预训练模型(ELMo,BERT等)的文本分类。总共有以下系列:

word2vec预训练词向量

textCNN 模型

charCNN 模型

Bi-LSTM 模型

Bi-LSTM + Attention 模型

Transformer 模型

ELMo 预训练模型

BERT 预训练模型

二、数据集合

数据集为IMDB 电影影评,总共有三个数据文件,在/data/rawData目录下,包括unlabeledTrainData.tsv,labeledTrainData.tsv,testData.tsv。在进行文本分类时需要有标签的数据(labeledTrainData),但是在训练word2vec词向量模型(无监督学习)时可以将无标签的数据一起用上。

训练数据地址:链接:https://pan.baidu.com/s/1-XEwx1ai8kkGsMagIFKX_g 提取码:rtz8

三、数据处理,也即是数据提取  

IMDB 电影影评属于英文文本,本序列主要是文本分类的模型介绍,因此数据预处理比较简单,只去除了各种标点符号,HTML标签,小写化等。 使用pandas直接处理数据,建议使用apply方法,处理速度比较快,数据处理完之后将有标签和无标签的数据合并,并保存成txt文件,放在了preProcess里面。

代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

?

import pandas as pd

from bs4 import BeautifulSoup #灵活又方便的网页解析库,处理高效,支持多种解析器。利用它不用编写正则表达式即可方便地实现网页信息的提取。

# IMDB 电影影评属于英文文本,本序列主要是文本分类的模型介绍,因此数据预处理比较简单,

# 只去除了各种标点符号,HTML标签,小写化等。代码如下:

With open ("../data/rawData/unlabeledTrainData.tsv", "r", encoding=‘UTF-8‘) as f:

unlabeledTrain = [line.strip().split("\t") for line in f.readlines() if len(line.strip().split("\t")) == 2]

? ?

with open("../data/rawData/labeledTrainData.tsv", "r", encoding=‘UTF-8‘) as f:

labeledTrain = [line.strip().split("\t") for line in f.readlines() if len(line.strip().split("\t")) == 3]

? ?

unlabel = pd.DataFrame(unlabeledTrain[1:], columns=unlabeledTrain[0])

label = pd.DataFrame(labeledTrain[1:], columns=labeledTrain[0]) #多一列数据 sentiment 0/1

# print("```````````")

# print(unlabeledTrain)

# print(label)

def cleanReview(subject):

# 数据处理函数

beau = BeautifulSoup(subject)

newSubject = beau.get_text()

newSubject = newSubject.replace("\\", "").replace("\‘", "").replace(‘/‘,‘‘).replace(‘"‘, ‘‘).replace(‘,‘, ‘‘).replace(‘.‘, ‘‘).replace(‘?‘, ‘‘).replace(‘(‘, ‘‘).replace(‘)‘, ‘‘)

newSubject = newSubject.strip().split(" ")

newSubject = [word.lower() for word in newSubject]

newSubject = " ".join(newSubject)

return newSubject

? ?

unlabel["review"] = unlabel["review"].apply(cleanReview)

label["review"] = label["review"].apply(cleanReview)

? ?

# 将有标签的数据和无标签的数据合并

newDf = pd.concat([unlabel["review"], label["review"]], axis=0)

# 保存成txt文件

newDf.to_csv("../data/preProcess/wordEmbdiing.txt", index=False)

四、预训练word2vec模型

  关于word2vec模型的介绍见这篇。我们使用gensim中的word2vec API来训练模型。官方API介绍如下:

class gensim.models.word2vec.Word2Vec(sentences=None, corpus_file=None, size=100, alpha=0.025, window=5, min_count=5, max_vocab_size=None, sample=0.001, seed=1, workers=3, min_alpha=0.0001, sg=0, hs=0, negative=5, ns_exponent=0.75, cbow_mean=1, hashfxn=<built-in function hash>, iter=5, null_word=0, trim_rule=None, sorted_vocab=1, batch_words=10000, compute_loss=False, callbacks=(), max_final_vocab=None)

1) sentences:我们要分析的语料,可以是一个列表,或者从文件中遍历读出(word2vec.LineSentence(filename) )。

2) size:词向量的维度,默认值是100。这个维度的取值一般与我们的语料的大小相关,如果是不大的语料,比如小于100M的文本语料,则使用默认值一般就可以了。如果是超大的语料,建议增大维度。

3) window:即词向量上下文最大距离,window越大,则和某一词较远的词也会产生上下文关系。默认值为5,在实际使用中,可以根据实际的需求来动态调整这个window的大小。如果是小语料则这个值可以设的更小。对于一般的语料这个值推荐在[5;10]之间。

4) sg:即我们的word2vec两个模型的选择了。如果是0, 则是CBOW模型;是1则是Skip-Gram模型;默认是0即CBOW模型。

5) hs:即我们的word2vec两个解法的选择了。如果是0, 则是Negative Sampling;是1的话并且负采样个数negative大于0, 则是Hierarchical Softmax。默认是0即Negative Sampling。

6) negative:即使用Negative Sampling时负采样的个数,默认是5。推荐在[3,10]之间。这个参数在我们的算法原理篇中标记为neg。

7) cbow_mean:仅用于CBOW在做投影的时候,为0,则算法中的xw为上下文的词向量之和,为1则为上下文的词向量的平均值。在我们的原理篇中,是按照词向量的平均值来描述的。个人比较喜欢用平均值来表示xw,默认值也是1,不推荐修改默认值。

8) min_count:需要计算词向量的最小词频。这个值可以去掉一些很生僻的低频词,默认是5。如果是小语料,可以调低这个值。

9) iter:随机梯度下降法中迭代的最大次数,默认是5。对于大语料,可以增大这个值。

10) alpha:在随机梯度下降法中迭代的初始步长。算法原理篇中标记为η,默认是0.025。

11) min_alpha: 由于算法支持在迭代的过程中逐渐减小步长,min_alpha给出了最小的迭代步长值。随机梯度下降中每轮的迭代步长可以由iter,alpha, min_alpha一起得出。这部分由于不是word2vec算法的核心内容,因此在原理篇我们没有提到。

对于大语料,需要对alpha, min_alpha,iter一起调参,来选择合适的三个值。

word2vec是可以进行增量式训练的,因此可以实现

一:在输入值时可以将数据用生成器的形式导入到模型中;

二:可以将数据一个磁盘中读取出来,然后训练完保存模型;之后加载模型再从其他的磁盘上读取数据进行模型的训练。初始化模型的相似度之后,模型就无法再进行增量式训练了,相当于锁定模型了。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

import logging

import gensim

from gensim.models import word2vec

# 设置输出日志

logging.basicConfig(format=%(asctime)s : %(levelname)s : %(message)s, level=logging.INFO)

# 直接用gemsim提供的API去读取txt文件,读取文件的APILineSentence Text8Corpus, PathLineSentences等。

sentences = word2vec.LineSentence("../data/preProcess/wordEmbdiing.txt")

# a = list(sentences)

# print(len(a))

# 训练模型,词向量的长度设置为200, 迭代次数为8,采用skip-gram模型,模型保存为bin格式

model = gensim.models.Word2Vec(sentences, size=200, sg=1, iter=8)

model.wv.save_word2vec_format("./word2Vec" + ".bin", binary=True)

# 加载bin格式的模型

word2Vec = gensim.models.KeyedVectors.load_word2vec_format("word2Vec.bin",binary=True)

主要参考:

【1】 https://home.cnblogs.com/u/jiangxinyang/

2https://www.cnblogs.com/pinard/p/7278324.html

【文本分类-01】Word2vec

原文:https://www.cnblogs.com/yifanrensheng/p/13363387.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!