实训结束有段时间啦,我准备吧实训的所有的东西整理整理,然后安心复习考研。
前面我将所有的评论把各个网站的旅游数据给扒了下来,文章链接:百度旅游、大众点评、驴妈妈、猫途鹰、携程关于评论的爬虫总结(附源码)。
我们将所有扒了下来之后数据整理之后的数据截图如下:
我们训练好的模型截图为(因为训练好的模型大概有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。
关于维基百科的中文语料的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上,传送门
我们将我们爬取下来的图片给转化为词向量,下面我们就可以通过机器学习的方法来训练我们的模型啦。