关于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
得到结果:
此结果 我的感觉是 有点奇怪,不知道为啥在小阈值范围 tfidf的F值较高…
PS:还做了word2vec WMD距离的实现,主要是简单的WCD距离,实践当中发现
WCD距离的结果 与 word2vec加和平均表示的欧式距离是一样的,回头看看WCD的数学公式是不是可推导到加和平均欧氏距离
后面的计划:
(1)考虑一下word2vec训练方面的优化
(2)文本表示方法的改进
(3)距离计算改进
再次拜求有相关经验的大牛指点!!!!!