关于word2vec及文本相似性计算

关于word2vec及文本相似性计算

最近2个月主要涉及到对文本相似度计算方法的实验,用了 词频词袋模型、tfidf词袋表示、word2vec表示,利用一些标注好的数据对结果进行了检验,最终还是发现 tfidf相似度计算效果较好,但计算效率慢一些。
也看到很多人说word2vec在相关语义计算方面有优势,不知道是不是我训练的模型有问题。。。有了解的大牛麻烦指点


word2vec训练

用的是python gensim中的Word2Vec来做的

def model_train_word2vec():
    """
    训练word2vec
    :return:
    """
    #sentence=validation_data()
    model = gensim.models.Word2Vec(sentences=LineSentence("./data/news_train.txt"),size=1000,window=5,min_count=5,max_vocab_size=500000,workers=multiprocessing.cpu_count())
    model.save('./model/word2vec')

这边训练数据90万篇新闻,取得词向量为1000,词典最多为50W,其余算是默认。用的是CBOW算法,没有SG是因为训练过程中看到SG比CBOW慢上不少,就先训练出来看一看效果。词向量为1000这里是基于训练的500 600 800 1500的向量 在计算的时候发现 1000出来的结果最好。

TFIDF训练

import pickle
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf = TfidfVectorizer(max_features=500000)
model = tfidf.fit_transform(sentences)#此处sentences为语料数据形式:[[],[],[]]
with open("./model/tfidf","wb") as w:
    pickle.dump(tfidf,file=w)

计算方法

都用了余弦相似度计算
TfIDF文本的表示 这里就不在多说 大家都知道
word2vec 表示 方法 我用的是 文本中 每个词的词向量加和平均,这里可能就是造成不如tfidf的原因之一吧:下面是class

import platform
from gensim.models.word2vec import Word2Vec
from similarity.distance import cosine,eculidean
#similarity模块是我自己封装的 就是普通的numpy实现的距离函数
OSNAME=platform.system()#获取当前操作系统名称
class WordToVec(object):
    def __init__(self):
        self.w2v = self.load_w2v()

    def load_w2v(self):
        if OSNAME.__contains__("Win"):
            filePath = ROOTPATH + "\\model\\model_w2v_1000"
        else:
            filePath = ROOTPATH + "/model/model_w2v_1000"
        return Word2Vec.load(filePath)

    def word2vec_transform(self, sentence):
        """
        word2vec 转化句子为向量
        :param w2v:
        :param sentence:
        :return:
        """
        size = self.w2v.layer1_size
        data = sentence.split(" ")
        length = len(data)
        vec = np.zeros(shape=(1, size), dtype=np.float32)
        for word in data:
            try:
                vec += self.w2v.wv[word]
            except:
                length -= 1
                continue
        vec = vec / length
        return vec

    def compute_cosine(self,s1,s2):
        vec1 = self.word2vec_transform(s1)
        vec2 = self.word2vec_transform(s2)
        return cosine(vec1,vec2)

聚类数据为:人工标注好的类别数据,共有35类
分词:jieba分词、基于tfidf值 提取文章TopK个关键词作为主体词
参考评测指标文章:中科院计算所一学位论文:《文本聚类分析效果评价及文本表示研究》
聚类的各项指标 与 分类的类似,主要有:
(1)基于人工标注的类簇F值:CF
(2)基于人工标注的文档查准、查全、F值:P,R,F
(3)基于各个类的熵:E
得到结果:
关于word2vec及文本相似性计算_第1张图片
关于word2vec及文本相似性计算_第2张图片
此结果 我的感觉是 有点奇怪,不知道为啥在小阈值范围 tfidf的F值较高…

PS:还做了word2vec WMD距离的实现,主要是简单的WCD距离,实践当中发现
WCD距离的结果 与 word2vec加和平均表示的欧式距离是一样的,回头看看WCD的数学公式是不是可推导到加和平均欧氏距离

后面的计划:
(1)考虑一下word2vec训练方面的优化
(2)文本表示方法的改进
(3)距离计算改进

再次拜求有相关经验的大牛指点!!!!!

你可能感兴趣的:(深度学习,NLP)