文本分类实战(一)—— word2vec预训练词向量

1 大纲概述

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

  word2vec预训练词向量

  textCNN 模型

  charCNN 模型

  Bi-LSTM 模型

  Bi-LSTM + Attention 模型

  RCNN 模型

  Adversarial LSTM 模型

  Transformer 模型

  ELMo 预训练模型

  BERT 预训练模型

  所有代码均在textClassifier仓库中, 觉得有帮助,请给个小星星。

2 数据集

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

3 数据预处理

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

import pandas as pd
from bs4 import BeautifulSoup

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])

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("/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=<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给出了最小的迭代步。

  训练模型的代码如下:

import logging
import gensim
from gensim.models import word2vec
# 设置输出日志
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)

原文地址:https://www.cnblogs.com/jiangxinyang/p/10207273.html

时间: 2024-10-05 04:25:15

文本分类实战(一)—— word2vec预训练词向量的相关文章

文本分类实战(五)—— Bi-LSTM + Attention模型

1 大纲概述 文本分类这个系列将会有十篇左右,包括基于word2vec预训练的文本分类,与及基于最新的预训练模型(ELMo,BERT等)的文本分类.总共有以下系列: word2vec预训练词向量 textCNN 模型 charCNN 模型 Bi-LSTM 模型 Bi-LSTM + Attention 模型 RCNN 模型 Adversarial LSTM 模型 Transformer 模型 ELMo 预训练模型 BERT 预训练模型 所有代码均在textClassifier仓库中,觉得有帮助,请

文本分类实战(六)—— RCNN模型

1 大纲概述 文本分类这个系列将会有十篇左右,包括基于word2vec预训练的文本分类,与及基于最新的预训练模型(ELMo,BERT等)的文本分类.总共有以下系列: word2vec预训练词向量 textCNN 模型 charCNN 模型 Bi-LSTM 模型 Bi-LSTM + Attention 模型 RCNN 模型 Adversarial LSTM 模型 Transformer 模型 ELMo 预训练模型 BERT 预训练模型 所有代码均在textClassifier仓库中,觉得有帮助,请

文本分布式表示(二):用tensorflow和word2vec训练词向量

博客园的markdown用起来太心塞了,现在重新用其他编辑器把这篇博客整理了一下. 目前用word2vec算法训练词向量的工具主要有两种:gensim 和 tensorflow.gensim中已经封装好了word2vec这个包,用起来很方便,只要把文本处理成规范的输入格式,寥寥几行代码就能训练词向量.这样比较适合在做项目时提高效率,但是对理解算法的原理帮助不大.相比之下,用tensorflow来训练word2vec比较麻烦,生成batch.定义神经网络的各种参数,都要自己做,但是对于理解算法原理

文本分类实战

文本分类实战 分类任务 算法流程 数据标注 特征抽取 特征选择 分类器 训练与评估 坑 分词 特征重要度 有偏训练集 模型大小优化 One More Thing… term 扩展 Distributed Representation 分类任务 其实工程上对于文本分类的需求还是挺多的,主要可以分为下面两类,并对每类给了两个例子. 二分类   色情新闻分类 这是一个非平衡数据集的二分类问题,因为色情新闻数是远小于非色情新闻数的.   判断是否医疗Query 这个就关系到搜索变现了,还记得莆田系”事件

文本情感分析(二):基于word2vec和glove词向量的文本表示

上一篇博客用词袋模型,包括词频矩阵.Tf-Idf矩阵.LSA和n-gram构造文本特征,做了Kaggle上的电影评论情感分类题. 这篇博客还是关于文本特征工程的,用词嵌入的方法来构造文本特征,也就是用word2vec词向量和glove词向量进行文本表示,训练随机森林分类器. 一.训练word2vec词向量 Kaggle情感分析题给出了三个数据集,一个是带标签的训练集,共25000条评论,一个是测试集,无标签的,用来做预测并提交结果,这两个数据集是上一篇文章里我们用过的. 此外还有一个无标签的数据

word2vec 构建中文词向量

词向量作为文本的基本结构--词的模型,以其优越的性能,受到自然语言处理领域研究人员的青睐.良好的词向量可以达到语义相近的词在词向量空间里聚集在一起,这对后续的文本分类,文本聚类等等操作提供了便利,本文将详细介绍如何使用word2vec构建中文词向量. 一.中文语料库 本文采用的是搜狗实验室的搜狗新闻语料库,数据链接 http://www.sogou.com/labs/resource/cs.php 下载下来的文件名为: news_sohusite_xml.full.tar.gz 二.数据预处理

gensim的word2vec如何得出词向量(python)

首先需要具备gensim包,然后需要一个语料库用来训练,这里用到的是skip-gram或CBOW方法,具体细节可以去查查相关资料,这两种方法大致上就是把意思相近的词映射到词空间中相近的位置. 语料库test8下载地址: http://mattmahoney.net/dc/text8.zip 这个语料库是从http://blog.csdn.net/m0_37681914/article/details/73861441这篇文章中找到的. 检查语料是否需要做预处理:将数据下载好了解压出来,在做词向量

文本分类之情感分析– 停用词和惯用语

改善特征提取往往可以对分类的accuracy(和precision和召回率)有显著的正面影响.在本文中,我将评估word_feats的两项修改特征提取的方法: 过滤停用词 包含二元语法搭配 为了有效地做到这一点,我们将修改前面的代码,这样我们就可以使用任意的特征提取函数,它接收一个文件中的词,并返回特征字典.和以前一样,我们将使用这些特征来训练朴素贝叶斯分类器. import collections import nltk.classify.util, nltk.metrics from nlt

BERT 预训练模型及文本分类

BERT 预训练模型及文本分类 介绍 如果你关注自然语言处理技术的发展,那你一定听说过 BERT,它的诞生对自然语言处理领域具有着里程碑式的意义.本次试验将介绍 BERT 的模型结构,以及将其应用于文本分类实践. 知识点 语言模型和词向量 BERT 结构详解 BERT 文本分类 BERT 全称为 Bidirectional Encoder Representations from Transformer,是谷歌在 2018 年 10 月发布的语言表示模型.BERT 通过维基百科和书籍语料组成的庞