基于哈工大同义词词林的词语间相似度计算
局限:单纯使用同义词词林来计算相似度,如果词典中没有该词,就算不出相似度。
代码(在python3.6上正常运行)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#2018/7/25
import math
class CilinSimilarity(object):
"""
基于哈工大同义词词林扩展版计算语义相似度
"""
def __init__(self):
"""
'code_word' 以编码为key,单词list为value的dict,一个编码有多个单词
'word_code' 以单词为key,编码为value的dict,一个单词可能有多个编码
'vocab' 所有的单词
'N' N为单词总数,包括重复的词
"""
self.a = 0.65
self.b = 0.8
self.c = 0.9
self.d = 0.96
self.e = 0.5
self.f = 0.1
self.degree = 180
self.PI = math.pi
self.code_word = {}
self.word_code = {}
self.vocab = set()
self.N = 0
self.read_cilin()
def read_cilin(self):
"""
读入同义词词林,编码为key,词群为value,保存在self.code_word
单词为key,编码为value,保存在self.word_code
所有单词保存在self.vocab
"""
with open('G:/GFZQ/HIT_cilin/cilin_ex.txt', 'r',encoding='UTF-8') as f:
for line in f.readlines():
res = line.split()
code = res[0]
words = res[1:]
self.vocab.update(words)
self.code_word[code] = words
self.N += len(words)
for w in words:
if w in self.word_code.keys():
self.word_code[w].append(code)
else:
self.word_code[w] = [code]
def similarity(self, w1, w2):
"""
根据下面这篇论文的方法计算的:
基于同义词词林的词语相似度计算方法,田久乐, 赵 蔚(东北师范大学 计算机科学与信息技术学院, 长春 130117 )
计算两个单词所有编码组合的相似度,取最大的一个
"""
# 如果有一个词不在词林中,则相似度为0
if w1 not in self.vocab or w2 not in self.vocab:
return 0
# 获取两个词的编码
code1 = self.word_code[w1]
code2 = self.word_code[w2]
# 最终返回的最大相似度
sim_max = 0
# 两个词可能对应多个编码
for c1 in code1:
for c2 in code2:
cur_sim = self.sim_by_code(c1, c2)
print(c1, c2, '的相似度为:', cur_sim)
if cur_sim > sim_max:
sim_max = cur_sim
return sim_max
def sim_by_code(self, c1, c2):
"""
根据编码计算相似度
"""
# 先把code的层级信息提取出来
clayer1 = self.code_layer(c1)
clayer2 = self.code_layer(c2