利用Word2vec将旅游评论数据转化为词向量

实训结束有段时间啦,我准备吧实训的所有的东西整理整理,然后安心复习考研。

前面我将所有的评论把各个网站的旅游数据给扒了下来,文章链接:百度旅游、大众点评、驴妈妈、猫途鹰、携程关于评论的爬虫总结(附源码)

我们将所有扒了下来之后数据整理之后的数据截图如下:

我们训练好的模型截图为(因为训练好的模型大概有500MB,无法用记事本打开,所以只能用python读取之后截图)

                           

具体的步骤是我们先将自己爬取的数据先进行分词处理,然后用维基百科的word2vec来提取自己的分词向量。

一、分词

分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。将我们爬取下来的句子变成一个个词。后面我们需要将词用词向量表示,然后将这个一句话的用词向量表示。还有一点就是乱码问题。在对句子进行操作时,需要看看是否乱码,一旦乱码就需要将它进行转码。具体实现代码

for idx, row in reviews.iterrows():
    print (idx)
    review_content = row['comment']
    seg_list = jieba.cut(str(review_content), cut_all=False)
    word_list = [item for item in seg_list if len(item) > 1]
    text_list.append(word_list)

处理完之后我们会得到一个包含所有分词的text_list。这里包含所有的分词,我们后面的操作也是对它进行操作。text_list截图如下

二、获取词向量

词向量的转化的方法有Bag of Words(BOW)、TF-IDF、Word2Vec,最新还有一个doc2vec,据说效果更好。我们采用Word2Vec。

扫描二维码关注公众号,回复: 2723213 查看本文章

关于维基百科的中文语料的Word2vec模型可以参考我的github,可以根据我的代码将实验复现一遍,也可以看一下每一步的过程是什么,地址为https://github.com/CharlesAlison/wiki_zh_word2vec。当然如果你不看的话,我这里有已经训练好的模型,可以直接下载,也有百度百科的模型,下载地址为 https://pan.baidu.com/s/1hIh6mqa4NACHp_GnipA3Hw#list/path=%2Fword2vec

获取特征词向量的主要步骤如下:

  • 1)读取模型词向量矩阵;
  • 2)遍历语句中的每个词,从模型词向量矩阵中抽取当前词的数值向量,一条语句即可得到一个二维矩阵,行数为词的个数,列数为模型设定的维度;
  • 3)根据得到的矩阵计算矩阵均值作为当前语句的特征词向量;
  • 4)全部语句计算完成后,拼接语句类别代表的值,写入csv文件中

具体代码实现:

 返回特征词向量
def getWordVecs(wordList, model):
    vecs = []
    for word in wordList:
        word = word.replace('\n', '')
        # print word
        try:
            vecs.append(model[word])
        except KeyError:
            continue
    return np.array(vecs, dtype='float')
# 构建文档词向量
def buildVecs(filename, model,numm):
    fileVecs = []
    n=[]
    for line in filename:
        numm = numm + 1
        logger.info("Start line: " + str(line))
        wordList = line
        vecs = getWordVecs(wordList, model)
        # print vecs
        # sys.exit()
        # for each sentence, the mean vector of all its vectors is used to represent this sentence
        if len(vecs) > 0:
            vecsArray = sum(np.array(vecs)) / len(vecs)  # mean
            # print vecsArray
            # sys.exit()
            fileVecs.append(vecsArray)
        else :
            print (numm)
            n.append(numm)
    return fileVecs,n

这样我们就得到我们需要的词向量。由于我这边最后的结果有6个等级,所以需要将这6个等级依次输入,具体代码如下

num0=0
num1=0
num2=0
num3=0
num4=0
num5=0
s0=reviews[reviews["score"]==0].index.values
s1=reviews[reviews["score"]==1].index.values
s2=reviews[reviews["score"]==2].index.values
s3=reviews[reviews["score"]==3].index.values
s4=reviews[reviews["score"]==4].index.values
s5=reviews[reviews["score"]==5].index.values
s0vecs,num0kong=buildVecs(text_list[s0[0]:s0[-1]+1],model,num0)
s1vecs,num1kong=buildVecs(text_list[s1[0]:s1[-1]+1],model,num1)
s2vecs,num2kong=buildVecs(text_list[s2[0]:s2[-1]+1],model,num2)
s3vecs,num3kong=buildVecs(text_list[s3[0]:s3[-1]+1],model,num3)
s4vecs,num4kong=buildVecs(text_list[s4[0]:s4[-1]+1],model,num4)
s5vecs,num5kong=buildVecs(text_list[s5[0]:s5[-1]+1],model,num5)
sumkong=[]
for i in num1kong:
    sumkong.append(len(s0)+i)
for i in num2kong:
    sumkong.append(len(s0)+i+len(s1))
for i in num3kong:
    sumkong.append(len(s0)+i+len(s1)+len(s2))
for i in num4kong:
    sumkong.append(len(s0)+i+len(s1)+len(s2)+len(s3))
for i in num5kong:
    sumkong.append(len(s0)+i+len(s1)+len(s2)+len(s3)+len(s4))

# s5vecs=buildVecs(reviews[s5[0]:s5[-1]+1],model)
# s5vecs=buildVecs(reviews[reviews["score"]==5]["comment"],model)
Y = np.concatenate((np.zeros(len(s0)), np.ones(len(s1)),np.array(len(s2)*[2]),np.array(len(s3)*[3]),np.array(len(s4)*[4]),np.array(len(s5)*[5])))
# Y=np.concatenate((Y,np.array(len(s4)*[4]),np.array(len(s5)*[5]),np.array(len(s3)*[3])))
Y=np.delete(Y, sumkong, 0)
sumvecs=[]
sumvecs=s0vecs+s1vecs+s2vecs+s3vecs+s4vecs+s5vecs

我们还需要加载模型,代码如下

model = gensim.models.KeyedVectors.load_word2vec_format(r"J:\word2vec\wiki_zh_word2vec\wiki.zh.text.vector", binary=False)

然后保存自己的文件

df_x = pd.DataFrame(sumvecs)
df_y = pd.DataFrame(Y)
data = pd.concat([df_y, df_x], axis=1)
print( data)
data.to_csv(r"C:\Users\Administrator\Desktop\vvvv.csv")

这样我们就得到想要的词向量啦。

三、一些说明

这个有一个说明就是停用词。停用词相当于一些没用的词,如“的”、“了”等这些无用的词,无法表达任何含义的词,还有一些比如说句号、逗号、冒号这些标点符号也没用,也需要去掉。去掉这些没用的词既可以减少计算量,也可以提高准确率。本文没有去掉,主要是因为没有时间做这些了,实训时间太紧了。

代码已上传到github上,传送门

我们将我们爬取下来的图片给转化为词向量,下面我们就可以通过机器学习的方法来训练我们的模型啦。

参考文献

利用python实现酒店评论的情感分析

自然语言处理入门(4)——中文分词原理及分词工具介绍

猜你喜欢

转载自blog.csdn.net/ssssdbucdbod/article/details/81483278