同义词(近义词)算法总结(附代码)
一、简介
同义词挖掘一般有三种思路,借助已有知识库,上下文相关性,文本相似度。
1.1 知识库
可以借助已有知识库得到需要同义词,比如说《哈工大信息检索研究室同义词词林扩展版》和 HowNet,其中《词林》文件数据如下。
Aa01A01= 人 士 人物 人士 人氏 人选
Aa01A02= 人类 生人 全人类
Aa01A03= 人手 人员 人口 人丁 口 食指
Aa01A04= 劳力 劳动力 工作者
Aa01A05= 匹夫 个人
Aa01A06= 家伙 东西 货色 厮 崽子 兔崽子 狗崽子 小子 杂种 畜生 混蛋 王八蛋 竖子 鼠辈 小崽子
Aa01A07= 者 手 匠 客 主 子 家 夫 翁 汉 员 分子 鬼 货 棍 徒
Aa01A08= 每人 各人 每位
Aa01A09= 该人 此人
以上两个知识库是人工编辑的,毕竟数量有限,我们还可以借助众包知识库百科词条获取同义词,比如百度百科,如下图所示,在百度百科搜索“凤梨”,我们可以看到在返回页面结果中的 info box中有一个属性为“别称”,别称中就是凤梨的同义词。除此之外,在百科词条的开头描述中,有如下描述“又称”、“俗称”也是同义词,我们可以利用爬虫把这些词爬下来。
百度搜索和谷歌搜索等搜索工具一般都有重定向页,这也可以帮助我们去挖掘同义词。
使用知识库挖掘同义词的优点是简单易得,而且准确率也高,缺点就是知识库覆盖率有限,不是每个细分领域都有。对于金融、医疗、娱乐等领域都需要各自的知识库。
1.2 上下文相关性
利用上下文相关性挖掘同义词也比较好理解,如果两个词的上下文越相似的话,那么这两个词是同义词的概率就越大。使用词向量挖掘同义词是比较常见的做法,比如使用word2vector训练得到词向量,然后再计算余弦相似度,取最相似的top k个词,就得到了同义词。
word2vector是无监督学习,而且本质上来说它是一个语言模型,词向量只是它的副产品,并不是直接用来挖掘同义词。有篇paper发明了弱监督的同义词挖掘模型DPE,也取得了不错的效果。DPE模型流程如下图,一共分为两个阶段,第一阶段跟word2vector差不多,也是训练词向量,只不过DPE是一种graph embedding的思路,首先从语料中构建语义共现网络,然后通过对网络的边采样训练词向量。第二阶段通过弱监督训练一个打分函数,对输入的一对词判断属于同义词的概率。感兴趣的可以看看这篇paper 论文链接
基于上下文相关性的同义词挖掘方法的优点是能够在语料中挖掘大量的同义词,缺点是训练时间长,而且挖掘的同义词很多都不是真正意义上的同义词需要人工筛选。这种方法对于词频较高的词效果较好。
1.3 文本相似度
对于这一对同义词“阿里巴巴网络技术有限公司”和“阿里巴巴网络公司”直接去计算上下文相似度可能不太有效,那一种直观的方法是直接计算这两个词的文本相似度,比如使用编辑距离(Levenshtein distance)或者 LCS(longest common subsequence),如果两个词的文本相似度大于阈值的话我们就认为他们是同义词的关系。在这里推荐一个计算文本相似度的Java开源项目,基本上文本相似度算法应有尽有。[ 文本相似度算法 ]
基于文本相似度同义词挖掘方法的优点是计算简单,不同于word2vector,这种方法不需要使用很大的语料,只要这个词出现过一次就可以发现同义词关系。这种方法的缺点是有时候不太靠谱,会挖掘出很多错误的同义词,尤其是当两个词比较短的情况下,比如“周杰伦”和“周杰”,就可能会被认为是同义词。所以这种方法适用于一些较长的文本,特别是专业词汇,术语。
二、同义词挖掘的算法实现
github地址:https://github.com/tigerchen52/synonym_detection
在这个github项目中实现了4种同义词挖掘的方法:
- 百度百科同义词
- word2vector
- 语义共现网络的节点相似度
- Levenshtein距离
觉的有用同学记得点star~~
2.1 百度百科同义词
代码示例(synonym_detection/source/main.py)
def baike_invoke():import baike_crawler_modelprint(baike_crawler_model.baike_search(('凤梨', '001')))if __name__ == '__main__':baike_invoke()
输出
['菠萝皮', '地菠萝', '菠萝', '草菠萝']
2.2 word2vector
在这里使用《三体》小说作为训练语料,使用以下10个词作为输入,从语料中挖掘这10个词的同义词。后面几个方法使用相同的输入。
1|海王星
2|女孩
3|椅子
4|海军
5|阵列
6|变化
7|程心
8|火焰
9|天空
10|建造
代码示例
python synonym_detect -corpus_path ../input/三体.txt -input_word_path ../temp/input_word.txt -process_number 2 if_use_w2v_model True
参数
- -corpus_path 为语料文件,使用三体小说作为训练语料
- -input_word_path 输入词表,对词表中的词进行同义词挖掘。文件中每行以“|”作为分隔符,第一列是id,第二列是输入词
- -process_number 2 进程数量
- -if_use_w2v_model True 使用word2vector模型
- 默认返回top 5个同义词
输出
1 海王星 海王星|土星|天王星|背面|金星
3 椅子 椅子|办公桌|地板|地毯|铁锹
2 女孩 女孩|中年人|女孩儿|女子|泪光
9 天空 天空|晨光|夜空|暮色|漆黑
4 海军 海军|军种|服役|事务性|政工
6 变化 变化|隐隐约约|异常|微妙|所致
5 阵列 阵列|矩形|一千公里|环|标示出
7 程心 程心|AA|艾|当程心|曹彬
8 火焰 火焰|暗红|山脉|灼热|变幻
10 建造 建造|天梯|最小|准|航空母舰
2.2 语义共现网络的节点相似度
语义共现网络本质是根据上下文构建的图,图中的节点是词,边是这个词的上下文相关词。对于语义共现网络的两个节点,如果这两个节点的共同邻居节点越多,说明这两个词的上下文越相似,是同义词的概率越大。例如,对于《三体》小说中的两个词“海王星”和“天王星”,在《三体》语义共现网络中,“海王星”和“天王星”的邻居节点相似度很高,则说明两个词是同义词的可能性很高。如下图所示:
代码示例
python synonym_detect -corpus_path ../input/三体.txt -input_word_path ../temp/input_word.txt -process_number 2 -if_use_sn_model True
输出
5 阵列 阵列|矩形|队列|星体|量子
9 天空 天空|中|夜空|太阳|消失
4 海军 海军|航空兵|服役|空军|失败主义
10 建造 建造|制造|加速器|飞船|太阳系
3 椅子 椅子|桌子|坐下|沙发|台球桌
1 海王星 海王星|天王星|土星|卫星|群落
7 程心 程心|AA|中|罗辑|说
8 火焰 火焰|光芒|光点|推进器|雪峰
2 女孩 女孩|接待|冲何|请云|女士
6 变化 变化|发生|意味着|恢复|中
可以看出基于语义共现网络得到的同义词与word2vector结果类似,甚至在某些词上效果更好。
2.4 Levenshtein距离
代码示例
python synonym_detect -corpus_path ../input/三体.txt -input_word_path ../temp/input_word.txt -process_number 2 -if_use_leven_model True
输出
1 海王星 海王星|冥王星|天王星|星|王
7 程心 程心|请程心|带程心|连程心|从程心
6 变化 变化|变化很大|动态变化|发生变化|化
3 椅子 椅子|子|筐子|村子|棒子
2 女孩 女孩|女孩儿|女孩子|小女孩|女
10 建造 建造|建造成|造|建|建到
5 阵列 阵列|列|阵|历列|列为
9 天空 天空|海阔天空|空|天|天马行空
8 火焰 火焰|火|焰|火星|野火
4 海军 海军|于海军|陆海空军|海|海军军官
2.5 DPE模型
undo
同义词(近义词)算法总结(附代码)相关推荐
- 同义词/近义词查询易语言代码
.版本 2 .子程序 __启动窗口_创建完毕 '添加并使用<精易模块> Send_API () .子程序 Send_API .局部变量 REQU_Data, 文本型, , , 提交字符串 ...
- Python synonyms查找中文任意词汇的同义词近义词
Python synonyms查找中文任意词汇的同义词近义词 作者:虚坏叔叔 博客:https://xuhss.com 早餐店不会开到晚上,想吃的人早就来了!
- 同义词/近义词 API数据接口
同义词/近义词 计费模式 免费额度 点数单价 每日限制 会员免费 100次 免费 1000次 更新时间:2022-07-11 03:01:49接口状态:正常 根据词查询近义词 请求地址 HTTPGET ...
- ElasticSearch7.x IK 动态同义词/近义词动态加载同义词/近义词 dynamic_synonym
一.下载elasticsearch-analysis-dynamic-synonym 同义词插件 本人当前执行安装的是7.6.2.7.x安装方式都是一样的 github官方下载地址 如果官方地址无法打 ...
- 同义词、近义词、反义词词典
书籍资源很多:<新华同义词词典>http://www.cnr.cn/jy/jfjc/200709/t20070925_504579468.html,http://www.amazon.cn ...
- Elasticsearch-ik同义词,近义词,联想词
Elasticsearch-ik同义词,近义词,联想词 1. 将ik安装到elasticsearch/plugin/ 两种方式: (1) 方式1:下载构建包: https://github.com/m ...
- oracle只读权限 同义词,权限的同义词,欣赏和权限的近义词是什么
欣赏和权限的近义词是什么 欣赏的近义词--玩赏.观赏.赏识.鉴赏 权限的近义词--范围,.权势.权位.权责 如何给同义词授权 如果在bai用户agmtadmin下创建了du一个表TC_EP_SPLIT ...
- 【每天一道算法题】近义词句子
本文首发于我的公众号码农之屋(id: Spider1818),专注于干货分享,包含但不限于Java编程.网络技术.Linux内核及实操.容器技术等.欢迎大家关注,二维码文末可以扫. 题目描述 给你一个 ...
- 人为增加近义词 | Word2Vec的语料制作和训练
第零步:介绍 终于弄明白了gensim.word2vec怎么玩,说到底word2vec就是用共现矩阵来判断两个词语是不是相关,从而得出两个词语相似度高不高,这话听起来有问题~ 但事实就是这样的,不管我 ...
- 【Elasticsearch】相关性,近义词匹配,纠错匹配
目录 相关性 布尔模型 词频/逆向文档频率(TF/IDF) 词频 逆向文档频率 字段长度归一值 结合使用 向量空间模型 Lucene 的实用评分函数 近义词匹配 近义词查询原理 同义词过滤器 纠错匹配 ...
最新文章
- java设计模式---构建者模式
- sap 用户权限表_干货丨SAP系统的RPA实施技巧
- 洛谷——P2018 消息传递
- POJ 2485 Highways(最小生成树 Prim)
- linux libasan.so,Address Sanitizer 用法
- 都是打工的,为啥职场中存在着那么多勾引斗角?
- 计算机控制直流电机闭环调速实验报告,电气工程及其自动化电力系统实训报告-基于PLC的直流电机调速实验.pdf...
- 读美国教授写给被开除中国留学生的信感悟
- atitit.seo 发帖关键词以及链接的制作.doc
- 关于NTFS文件夹的安全权限分配的一些总结
- 利用WPS功能破解及本地恢复密码
- 基于matlab的图像识别分类实验(一)
- AN 非空检测以及影片剪辑元件调用内部元件
- matlab chan算法定位,求Chan算法解析
- ubuntu QT Creator Fatal IO error 2 (没有那个文件或目录) on X server :0
- 腾讯云mysql的技术原理_腾讯云自研数据库 CynosDB 存储架构揭秘!
- STM32使用HSE/HSI配置时钟(六)
- Error: illegal invocation in <execute> or <revert> phase (action: element.updateProperties或Laber)
- linux 软件覆盖安装,pacman/yaourt安装软件的时候覆盖了/usr/share的symlink链接的问题...
- ios获得设备处理器cpu类型