同义词词林 使用 java_利用同义词林计算词的相似度——基于路径与深度的同义词词林词语相似度计算...
我主要根据《中文信息学报》2016年9⽉第30卷第5期中的《基于路径与深度的同义词林词语相似度计算》提及到的计算公式进行了代码实现,并根据其最终的结果对原设计进行了微调。
import os
import csv
import re
class Node(object):
def __init__(self,id,children,parent,words):
self.id = id.copy()
self.children = []
self.parent = None
self.words = words.copy()
self.level = len(id) if len(id) < 5 else 5
def append_node(self,child):
self.children.append(child)
child.parent = self
return
def normalize(cilin):
cilin_to_list = cilin.split()
id_list = re.findall(r"\D|\d\d",cilin_to_list[0].strip())
word_list = cilin_to_list.copy()
del word_list[0]
new_node = Node(id_list,None,None,word_list)
return new_node
def findparent(Root,sub_node,depth):
if len(Root.children) == 0:
return Root #if it have no kids,then it will have a new kids
else:
for child in Root.children: #else check every kids, the true parent must be among them
if(sub_node.id[depth]==child.id[depth]):
return findparent(child,sub_node,depth+1)
return Root
def add2dict(word_dict,node):
for word in node.words:
if word in word_dict:
word_dict[word].append(node)
else:
word_dict[word] = []
word_dict[word].append(node)
return
def AnalyzeCilin(filename):
cilin_node_list = []
word_dict = {}
with open(filename,"r",encoding="gbk") as f:
cilinlist = f.readlines()
for cilin in cilinlist:
cilin_node_list.append(normalize(cilin))
Root = Node(['Root'],None,None,['Root'])
for cilin_node in cilin_node_list:
temp = findparent(Root,cilin_node,0)
if(None == temp):
print("error")
print(cilin_node.id)
return None,None
temp.append_node(cilin_node)
if(cilin_node.level == 5):
add2dict(word_dict,cilin_node)
return Root,word_dict
def GenerateParents(word_node,Root):
parents_list = []
sub_node = word_node
while not sub_node == Root:
parents_list.append(sub_node)
sub_node = sub_node.parent
parents_list.append(Root)
return parents_list
def find_sub_tree(word1,word2,Root,word_dict):
maxdepth = 0
tar_node = Root
sub_word1 = Root
sub_word2 = Root
K = 0
for word1_node in word_dict[word1]:
for word2_node in word_dict[word2]:
word1_parents = GenerateParents(word1_node,Root)
word2_parents = GenerateParents(word2_node,Root)
for i in range(6):
if(word1_parents[i] == word2_parents[i]):
if(maxdepth < word1_parents[i].level):
maxdepth = word1_parents[i].level
tar_node = word1_parents[i]
sub_word1 = word1_node
sub_word2 = word2_node
return tar_node,sub_word1,sub_word2
def CalculateK(sub_root,word1_node,word2_node):
for i in range(word1_node.level if word1_node.level < word2_node.level else word2_node.level):
if not (word1_node.id[i] == word2_node.id[i]):
if (word1_node.id[i].isalpha()):
return (abs(ord(word1_node.id[i]) - ord(word2_node.id[i])))
elif(word1_node.id[i].isdigit()):
return (abs(int(word1_node.id[i]) - int(word2_node.id[i])))
else:
print("Error")
return 0
return 0
def Sim(word1,word2,Root,word_dict):
weight = [8,6,4,1.5,0.5]
sub_root,word1_node,word2_node = find_sub_tree(word1,word2,Root,word_dict)
K = CalculateK(sub_root,word1_node,word2_node)
if(sub_root == word1_node and sub_root == word2_node):
if(sub_root.id[-1] == '#'):
return 0.98
elif(sub_root.id[-1] == '='):
return 1
Comm = 0.9
for i in range(sub_root.level):
Comm = Comm + weight[i]
Diff = (float(weight[sub_root.level]) * K) / len(sub_root.children)
for i in range(sub_root.level,word1_node.level):
Diff = Diff + weight[i]
for i in range(sub_root.level,word2_node.level):
Diff = Diff + weight[i]
print(word1,word2,"Comm=",Comm,"Diff",Diff)
return Comm / (Comm + Diff)
def SimCalculate(Root,filename,word_dict):
test_word = []
with open(filename,'r',encoding="gbk") as csvfile:
csv_reader = csv.reader(csvfile)
for row in csv_reader:
test_word.append(row)
for test in test_word:
if(test[0] in word_dict and test[1] in word_dict):
Similarity = Sim(test[0],test[1],Root,word_dict)
test.append(Similarity)
else:
test.append("不在库中")
print(test[0],test[1],test[-1])
return test_word
def Save2File(SimResult,filename):
headers = ['Word1','Word2','Similarity']
with open(filename,'w',encoding="gbk") as csvfile:
csv_writer = csv.writer(csvfile)
csv_writer.writerow(headers)
csv_writer.writerows(SimResult)
return
if __name__ == '__main__':
Root,word_dict = AnalyzeCilin("cilin_扩展版.txt")
SimResult = SimCalculate(Root,"测试用例.csv",word_dict)
Save2File(SimResult,"测试用例的相似度(最终版).csv")
未完待续,代码的进一步说明待到考完期末考试再补。
同义词词林 使用 java_利用同义词林计算词的相似度——基于路径与深度的同义词词林词语相似度计算...相关推荐
- 同义词词林 java_基于同义词词林扩展版的词语相似度计算
词语相似度计算 词义相似度计算在很多领域中都有广泛的应用,例如信息检索.信息抽取.文本分类.词义排歧.基于实例的机器翻译等等.国内目前主要是使用知网和同义词词林来进行词语的相似度计算. 本文主要是根据 ...
- 基于信息内容的词林词语相似度计算 - 论文及代码讲解
文章目录 论文 同义词林简介 特点 代码 获取词的编码 求IC值 求相似度 选取相似度最大值 论文:<基于信息内容的词林词语相似度计算 >-2018-彭琦,朱新华等 查看 代码:https ...
- matlab可以使用词云分析吗,利用豆瓣短评数据生成词云
在之前的文章中,我们获得了豆瓣爬取的短评内容,汇总到了一个文件中,但是,没有被利用起来的数据是没有意义的. 前文提到,有一篇微信推文的关于词云制作的一个实践记录,准备照此试验一下. 思路分析 读文件 ...
- 基于Spark的案例:同义词识别
同义词识别 一.业务场景 二.数据集说明 三.操作步骤 阶段一.启动HDFS.Spark集群服务和zeppelin服务器 阶段二.准备案例中用到的数据集 阶段三.对数据集进行探索和分析 阶段四.自我练 ...
- 深度学习之词向量Word Embedding总结
目录 一.Word Embedding介绍 二.One-Hot 表示 三.Distributed 表示 四.word2vec表示 五.BERT任务 六.BERT与其他模型的调用 一.Word Embe ...
- 基于图数据的研报词关联之聚合分析
基于图数据的研报词关联之聚合分析 基于图数据的研报关键词聚合分析 一.算法介绍 二.数据模型 三.计算关键词上下文聚合相似性 四.关键词上下文聚合性能测试 五.计算聚合相似性[CYPHER优化] 六. ...
- 【深度学习】词的向量化表示
在CNN模型中,卷积就是拿**kernel**在图像上到处移动,每移动一次提取一次特征,组成feature map, 这个提取特征的过程,就是卷积. 接下来,我们看看Yoon Kim的paper:[C ...
- 利用中文维基百科数据进行词语相似度word2vec实验
使用维基百科数据利用word2vec简历词向量, 通过对词向量之间的距离的比对,查找出与给出词语相似度较高的单词进行返回 1.使用维基百科官方给出的文档处理程序处理从维基百科上下载的压缩包文件成原始t ...
- 深度学习:词嵌入之word2vec
http://blog.csdn.net/pipisorry/article/details/76147604 word2vec简介 深度学习在自然语言处理中第一个应用:训练词嵌入.Google 的 ...
- 基于DFA算法实现文章敏感词过滤
最近公司要出一个论坛系统 因为最近貌似xxx查的也比较严,所以图片和文字安全一样要注意 其中文字就涉及到敏感字过滤的问题 目前大概流传两种解决办法: 1.利用分词器分词实现过滤 比如见得比较多的 IK ...
最新文章
- 谷歌出现新冠肺炎确诊病例,限制员工出行;比尔·盖茨:可能成百年不遇的大流行病...
- html首字母样式,html标签手册
- Django(part3)--制作我的第一个网页
- 抖音最强python_装逼篇 | 抖音超火的九宫格视频是如何生成的,Python 告诉你答案...
- IIC软件模拟-读写EEPROM
- 要想学好前端开发,这五点你一定要知道!
- iptraf:一个实用的TCP/UDP网络监控工具
- html样式超出出现滚动条,CSS 设置的高度超出屏幕高度为什么没出现滚动条?
- iOS----集成ijkplayer视频直播
- 2020年的计算机专业就业形势,2020计算机专业就业分析
- 斯人已去长风存 谈谈 CyanogenMod 的前身今世
- HTML5 Canvas 射击类小游戏 平滑的移动 思路
- IDL读取ASCII文件
- 图片转DATA:URI工具
- 图学习笔记(一):图
- 物联网通信协议(接入协议)
- Java面试考点思维导图
- 配置文件中连接数据库
- 如何将收件箱中的发件人批量导入企业云邮通讯录
- Cesium For UE 本地卫片导入
热门文章
- c语言函数名合集,C语言内部函数名.doc
- 【基于pyAudioKits的Python音频信号处理项目(一)】实现音频频谱分析仪并进行交互式滤波器设计
- Pascal------第三方库
- 视频编解码基础--01
- 微型计算机系统评课,微机课评课稿.doc
- Virtex-4 cameralink开发板PCI图像采集卡定制FPGA-HDMI编码-LVDS相机
- Cameralink转万兆光纤视频模块
- 怎么判断日出时间早晚_怎样判断一个地方的日出或日落时间
- 2020年全球电动汽车展望
- 刚体转动惯量c语言计算程序,Tracker软件在三线摆测量刚体转动惯量实验中的应用...