/SentenceSimilarity

self complement of Sentence Similarity compute based on cilin, hownet, simhash, wordvector,vsm models,基于同义词词林,知网,指纹,字词向量,向量空间模型的句子相似度计算。

Primary LanguagePython

SimilarityCompute

self complement of Sentence Similarity compute based on cilin, hownet, simhash, wordvector,vsm models,基于同义词词林,知网,指纹,字词向量,向量空间模型的句子相似度计算。

理论简介

中文句子相似度计算,目前包括word-level和sentence-level两个level的计算方法。前者的**是通过对句子进行分词,分别计算两个比较句中所含词汇的相似度。后者主要采用句子建模的方法。

1、word-level的方法

word-level的方法包括两个核心问题,1)word之间的相似度计算问题 ,2)将句子中多个word相似度进行加权融合的问题。  

1)word之间相似度的计算问题

word之间相似度的计算问题,分成两种,一种是形态(包括字符级的形态以及词语级的形态)上的相似,这个在英语中是比较可行的,英语中可以将词语进行词干化,而在中文中并不适用,例如‘爸爸’和‘父亲’实际上是同一个词,但是形态上的相似度是0,这显然是不行的。 因此诞生了第二种方法,基于语义知识库的词语相似度计算。
目前中文的语义知识库比较著名的有董振东先生研发的hownet以及哈工大研发的大词林,其中:
hownet将每个词的意义分解为多个义原,例如:{爸爸:human|人,family|家,male|男},{父亲:human|人,family|家,male|男}
在cilin中,则对相似词语进行了编码,如 {Ah04A01= 父 父亲 爷 爹 大 翁 爸爸 老子 爹爹 老爹 阿爹 阿爸 椿 太公 大人 爸 生父 爹地 慈父}
可以看出‘爸爸’和‘父亲’都属于同一个语义编码。
因此,借助外部语义知识库,可以在一定程度上解决中文的形态问题。但受限于知识库的词汇有限,难以大规模的使用。

2)基于word相似度的句子相似度加权问题      

这里涉及基于词相似的句子相似度度量,主要常用的jaccard编辑距离, 语义距离相似度。其中:给定两个句子s1,s2:
words1 = [token for token in s1]
words2 = [token for token in s2]

jaccard距离

SIM(s1,s2) = intersection(words1, words2)/union(words1, words2)

语义距离

SIM(s1, s2) = 1/2 * (sum(max(sim(word1,word2) for word1 in words1 for word2 in words2))/len(words1) + sum(max(sim(word2,word1) for word2 in words2 for word1 in words1))/len(words2)

2、sentence-level的方法

sentence-level包括两种方法,核心**是使用向量空间模型,将句子进行向量表征。具体包括两种方式:1)基于word-vector的组合 2)sentence-vector

1)基于word-vector的组合

目前常用的是使用预先训练好的word-embdding向量,对于一个句子,将词向量的每一位进行加和或求平均。另外一个是使用one-hot结合tfidf对句子进行vsm表示的方法。

2)基于sentence-vector的方法

目前关于sentence建模的方法包括skip-gram,cbow的doc2vector建模方法,基于autoencoder的建模方法,基于skip-thought的句子建模方法等。我们通常认为,基于sentence-vector的方法能够更好的保留句子的语义信息,能够在一定程度上弥补1)的词袋缺点。

实验

1、输入  

1)hownet.dat:知网的词语义原表示
2)cilin.txt:同义词词林
3)token2vector.bin:中文字符向量
4)word2vector.bin:中文词语向量

2、实验方法

1)sim_cilin.py:基于同义词词林的相似度计算
2)sim_hownet.py:基于hownet的相似度计算
3)sim_simhash.py:基于指纹的相似度计算
4)sim_tokenvector.py:基于字符向量的相似度计算
5)sim_wordvector.py:基于词向量的相似度计算
6)sim_vsm.py:基于向量空间模型one-hot的相似度计算

3、实验结果  

e1********************
sent1:南昌是江西的省会
sent2:北京乃**之首都
cilin 0.8875
hownet 0.7967391304347826
simhash 0.53125
simtoken 0.445915376917
simvsm 0.0
e2********************
sent1:我是**人,我深爱着我的祖国
sent2:**是我的母亲,我热爱她
cilin 0.8330357142857143
hownet 0.7772631779984722
simhash 0.734375
simtoken 0.824045527618
simvsm 0.7126966451
e3********************
sent1:小勇硕士毕业于北京语言大学,目前在中科院软件所工作
sent2:大方博士就读于首都师范大学,未来不知道会在哪里上班
cilin 0.5940559440559441
hownet 0.5830052206466234
simhash 0.484375
simtoken 0.316855881903
simvsm 0.0836242010007
e4********************
sent1:小明去了姥姥家,姥姥给他买了一本童话书
sent2:我外婆早早的就出去了,给我带回来一本恐怖小说
cilin 0.645
hownet 0.48380018674136316
simhash 0.53125
simtoken 0.597448642618
simvsm 0.169030850946
e5********************
sent1:一群高贵气质的差人在处罚违章动物
sent2:城管执法,若不文明会导致很多的不公平事故
cilin 0.5369318181818181
hownet 0.36129517949370893
simhash 0.53125
simtoken 0.225649809697
simvsm 0.0

总结

1、从以上的结果来看,simvsm的方法在短句中貌似不work
2、基于语义知识库的方法效果要好一些
3、基于wordvector得到的方法与基于语义知识库的方法效果相当
4、将这几种方法进行融合,应该会有更好的效果,内部的计算规则还有待优化

contact

如有自然语言处理、知识图谱、事理图谱、社会计算、语言资源建设等问题或合作,可联系我:
1、我的github项目介绍:https://liuhuanyong.github.io
2、我的csdn博客:https://blog.csdn.net/lhy2014
3、about me:刘焕勇,**科学院软件研究所,lhy_in_blcu@126.com