html标签 对word2vec,文本分类实战(一)—— word2vec预训练词向量

1 大纲概述html

文本分类这个系列将会有十篇左右,包括基于word2vec预训练的文本分类,与及基于最新的预训练模型(ELMo,BERT等)的文本分类。总共有如下系列:git

2 数据集

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

3 数据预处理

IMDB 电影影评属于英文文本,本序列主要是文本分类的模型介绍,所以数据预处理比较简单,只去除了各类标点符号,HTML标签,小写化等。代码以下:

importpandas as pdfrom bs4 importBeautifulSoup

with open("/data4T/share/jiangxinyang848/textClassifier/data/unlabeledTrainData.tsv", "r") as f:

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

with open("/data4T/share/jiangxinyang848/textClassifier/data/labeledTrainData.tsv", "r") 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])defcleanReview(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 innewSubject]

newSubject= " ".join(newSubject)returnnewSubject

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("/data4T/share/jiangxinyang848/textClassifier/data/preProcess/wordEmbdiing.txt", index=False)

咱们使用pandas直接处理数据,建议使用apply方法,处理速度比较快,数据处理完以后将有标签和无标签的数据合并,并保存成txt文件。

4 预训练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=, 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给出了最小的迭代步。

训练模型的代码以下:

importloggingimportgensimfrom gensim.models importword2vec

# 设置输出日志

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

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

sentences= word2vec.LineSentence("/data4T/share/jiangxinyang848/textClassifier/data/preProcess/wordEmbdiing.txt")

# 训练模型,词向量的长度设置为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格式的模型

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值