word2vec方法的实现和应用

word2vec方法的实现和应用

给大家看看word2vec训练后的结果图,以事实说话。然后再给大家介这种方法在实践中的应用,并且告诉各位如何从0开始训练自己的word2vec模型。

以下是从东方财富网爬取10000篇财经类文章,采用word2vec训练出来的效果。

  • 以下分别找到与京东、海尔和汽车最接近的十个词语。
  • 计算两个词之间的相似度

明显看到,马云和淘宝、微信两词关系密切,而马云与骆驼大相径庭。

  • 找到词性相对的词

例如:根据“女性”和“男性”两个反义词,预测“上涨”的反义词为“下跌”。

  • 找出一系列词中,最不相关的词

看到这里的小伙伴一定有几个疑问:

  • word2vec有什么用?
  • word2vec如何实现?
  • 原理是什么?

全部回答以上问题是需要很长的篇幅的。今天我们重点说1.2点,第3点在文末给出参考,之后的发文中也会详细解说,欢迎继续关注我的知乎。

首先,word2vec有什么用?
  • 在情感分析的应用

例如,某商家希望通过客户的评论,了解用户对各种商品的评价是好是坏。

  • 词的特征扩充
  • 推荐领域应用
  • 多种语言翻译
  • 作为其他模型的特征输入
word2vec如何实现?

从数据源开始,以10000篇东方财富的资讯为例。文章ID(ART_CODE)、文章内容ART_CONTENT。数据源和停用词共享链接:pan.baidu.com/s/1dFtV9u

下面我们要对10000篇文章做一下处理:

  1. 从HTML文件中提取中文 (代码中ClearData类中ExtractHanWen方法)
  2. 分词 (CutData类)
  3. 去停用词 (DelStopWords类)
  4. 训练word2vec模型
  5. 可视化— 此处,下期再续

放代码

# -*- coding: utf-8 -*-

"""
    作者:     QQ ZHOU
    版本:     1.0
    日期:     2017/12/10
    项目名称: word2vec模型训练
"""

import pandas as pd
import numpy as np
import jieba
import re
import codecs
import os
from gensim.models import word2vec
#首先将所有文件放在桌面的文件夹0000下
#==========注意以下两行需要改成你所要的文件路径和名称=============
os.chdir("C:/Users/Think/Desktop/0000")
news=pd.read_csv("test.csv",encoding='gbk')
#============================================================

class ClearData:
  def __init__(self, content):
    self.content = content
    pass
  #========提取中文字符=============
  def Extract(self,line):
      dr=re.compile(u'[\u4e00-\u9fa5]')
      return ''.join(dr.findall(line))
  def ExtractHanWen(self):
      ExtractData=[]
      for line in self.content:
          ExtractData.append(self.Extract(line))
      return ExtractData
  def __str__(self):
      print ('%s'%self.ExtractHanWen())


#===============切词=========================
class CutData(object):
    def __init__(self,text):
        self.cuttext=text
    pass
    def cutText(self):
        Text=[]
        for singleline in self.cuttext:
            wordSeg = jieba.cut(singleline, cut_all=False)
            Text.append(" ".join(wordSeg))
        return Text
    def __str__(self):
        print("%s"%self.cutText())

#==========去停用词===================
class DelStopWords(object):
    def __init__(self,data,stopwords):
        self.data=data
        self.stopwords=stopwords
        self.all_text=[]
        self.join_text=[]
    pass
    def Del(self):
        for line in self.data:
            single_text = []
            for word in line.split(' '):
                if '"' + word + '"' not in stopwords:
                    if len(word) >= 2:
                        single_text.append(word)
                    pass
                self.join_text = " ".join(single_text)
            self.all_text.append(self.join_text)
        return self.all_text
    def __str__(self):
        print("%s"%self.all_text)

def LoadStopWords():
    stopwords=[]
    filename='stopwords.txt'
    if os.path.exists(filename):
        st = codecs.open("stopwords.txt", "rb", encoding="gbk")
        for line in st:
            line = line.strip()
            stopwords.append(line)
    else:
        print("error:停词表不存在,请添加...")
    pass
    return stopwords

class Word2Vec(object):
    def __init__(self,data,size=100,sep=" "):
        self.data=data
        self.sep=sep
        self.size=size
    def getStdModelData(self):
        text=[]
        for s in self.data:
            text.append(str(s).split(self.sep))
        return text
    def getModel(self):
        Stdtext=self.getStdModelData()
        model=word2vec.Word2Vec(Stdtext,self.size)
        return model

if __name__=='__main__':
    Data=ClearData(news['ART_CONTENT'])
    Cleared=Data.ExtractHanWen()
    cutData=CutData(Cleared).cutText()
    print("...加载停用词表...")
    stopwords=LoadStopWords()
    print("...去停用词...")
    Del_StopWords_Data=DelStopWords(cutData,stopwords).Del()
    #美国 总统 特朗普 中国 进行 国事访问 记者 商务部
    print("...训练模型部分...")
    model=Word2Vec(Del_StopWords_Data,sep=' ',size=100).getModel() #size是词向量的维度
    #print('...存放模型...')
    #model.save('./word2vec.model')
    #print('下载模型')
    #model=Word2Vec.load('word2vec.model')
    word_vectors={}
    for word in (model.wv.vocab):
        word_vectors[word]=model[word]
    print(model.similarity("人们","群众"))

编辑于 2017-12-10

文章被以下专栏收录