自然语言数据预处理中经常会涉及到同义词替换,比如计算两个句子的相似度中,把一个词的两个同义词利用同义词替换技术转换为同一个词,那么就提高了相似度计算的可靠性。学习自然语言处理的同学肯定都会做到数据预处理的工作,下面分享我最近写的一个程序,希望能为从事同样工作的同学提供那么一点帮助,也希望自己的程序能够得到指点。

程序中设计到分词技术和同义词表,分词采用了哈工大的pyltp,其官方文档链接为http://pyltp.readthedocs.io/zh_CN/latest/。同义词表是利用哈工大的同义词词林(扩展版)进行预处理保留每个词的前两项得来的,原版下载链接为https://www.ltp-cloud.com/download/。

我采用的同义词词表是下面这种结构:

人 士
人类 生人
人手 人员
劳力 劳动力
匹夫 个人
家伙 东西
者 手
每人 各人
该人 此人
人民 民

下面是同义词替换程序(注释比较详细,这里不再赘述程序具体实现方式):

from pyltp import Segmentorclass SynonymsReplacer:def __init__(self, synonyms_file_path, cws_model_path):self.synonyms = self.load_synonyms(synonyms_file_path)self.segmentor = self.load_segmentor(cws_model_path)def __del__(self):"""对象销毁时要释放pyltp分词模型"""self.segmentor.release()def load_segmentor(self, cws_model_path):"""加载ltp分词模型:param cws_model_path: 分词模型路径:return: 分词器对象"""segmentor = Segmentor()segmentor.load(cws_model_path)return segmentordef segment(self, sentence):"""调用pyltp的分词方法将str类型的句子分词并以list形式返回"""return list(self.segmentor.segment(sentence))def load_synonyms(self, file_path):"""加载同义词表:param file_path: 同义词表路径:return: 同义词列表[[xx,xx],[xx,xx]...]"""synonyms = []with open(file_path, 'r', encoding='utf-8') as file:for line in file:synonyms.append(line.strip().split(' '))return synonymsdef permutation(self, data):"""排列函数:param data: 需要进行排列的数据,列表形式:return:"""assert len(data) >= 1, "Length of data must greater than 0."if len(data) == 1:  # 当data中只剩(有)一个词及其同义词的列表时,程序返回return data[0]else:head = data[0]tail = data[1:]  # 不断切分到只剩一个词的同义词列表tail = self.permutation(tail)permt = []for h in head:  # 构建两个词列表的同义词组合for t in tail:if isinstance(t, str):  # 传入的整个data的最后一个元素是一个一维列表,其中每个元素为strpermt.extend([[h] + [t]])elif isinstance(t, list):permt.extend([[h] + t])return permtdef get_syno_sents_list(self, input_sentence):"""产生同义句,并返回同义句列表,返回的同义句列表没有包含该句本身:param input_sentence: 需要制造同义句的原始句子:return:"""assert len(input_sentence) > 0, "Length of sentence must greater than 0."seged_sentence = self.segment(input_sentence)candidate_synonym_list = []  # 每个元素为句子中每个词及其同义词构成的列表for word in seged_sentence:word_synonyms = [word]  # 初始化一个词的同义词列表for syn in self.synonyms:  # 遍历同义词表,syn为其中的一条if word in syn:  # 如果句子中的词在同义词表某一条目中,将该条目中它的同义词添加到该词的同义词列表中syn.remove(word)word_synonyms.extend(syn)candidate_synonym_list.append(word_synonyms)  # 添加一个词语的同义词列表perm_sent = self.permutation(candidate_synonym_list)  # 将候选同义词列表们排列组合产生同义句syno_sent_list = [seged_sentence]for p in perm_sent:if p != seged_sentence:syno_sent_list.append(p)return syno_sent_list

程序功能测试代码如下:

if __name__ == '__main__':replacer = SynonymsReplacer(synonyms_file_path='/your/path', cws_model_path='/your/path')test_sentence = '承蒙关照今天早'_syn = replacer.get_syno_sents_list(test_sentence)for s in _syn:print(s)

程序输出如下所示:

['承蒙', '关照', '今天', '早']
['承蒙', '关照', '今天', '早日']
['承蒙', '关照', '今天', '早安']
['承蒙', '关照', '今日', '早']
['承蒙', '关照', '今日', '早日']
['承蒙', '关照', '今日', '早安']
['承情', '关照', '今天', '早']
['承情', '关照', '今天', '早日']
['承情', '关照', '今天', '早安']
['承情', '关照', '今日', '早']
['承情', '关照', '今日', '早日']
['承情', '关照', '今日', '早安']

输入是一个str类型的句子,输出是包含它本身的list形式的句子。欢迎各位朋友指教!

NLP数据预处理——同义词替换程序相关推荐

  1. NLP数据预处理与词嵌入

    NLP数据预处理与词嵌入 NLP数据预处理 读入语料库 首先准备一个语料库,实际上就是一个 txt 文件,这里用的是小说 time machine ,该语料库比较短小,仅有 ~3000 行,~3000 ...

  2. 文本数据增强-同义词替换、随机交换、随机插入、随机删除

    根据zhangy代码改写,主要针对千言问题匹配进行文本数据增强. 依赖安装 pip install jieba pip install synonyms eda.py import jieba imp ...

  3. NLP数据预处理的一般方法

    文章目录 一.前言 二.实现方法 一.前言 数据预处理一般包括如下几个步骤 读取数据[txt.csv] 拆分输入.输出数据 缺失数据处理[删除.插值] 字符串类型的数据处理[稀疏矩阵.embeddin ...

  4. ## 使用MapReduce程序完成相关数据预处理

    使用MapReduce程序完成相关数据预处理 数据大概有2万条左右所以部分截取 (格式为csv) 1月20日,北京,大兴区,2,0,0,北京市大兴区卫健委,https://m.weibo.cn/270 ...

  5. 文本数据增强二(EDA、同义词替换-新增-交换-删除-生成同义句)

    一.中文文本数据增强 (中文.同义句生成.enhance.augment.text.data.nlp.样本不均衡.语料不够.数据不足.扩充增加),相较于图片,中文文本数据强的效果似乎没那么靠谱(效果没 ...

  6. 使用MapReduce程序完成相关数据预处理(二)

    使用MapReduce程序完成相关数据预处理(二) 数据大概有2万条左右所以部分截取 (格式为csv) 1月20日,北京,大兴区,2,0,0,北京市大兴区卫健委,https://m.weibo.cn/ ...

  7. [nlp] 小傻学数据预处理

    [nlp] 小傻学数据预处理 1. 分词 1.1 分词方法 1.1.1 基于规格(词典.词库) 1.1.2 基于知识理解 1.1.3 基于(词频)统计 1.2 分词工具 1.3 jieba分词原理 1 ...

  8. excel量化交易接口系统程序怎样进行数据预处理?

    在数据统计和预测的过程中,工程师基本都使用现成的算法,工程师的主要工作是根据具体业务逻辑预处理数据和选择算法,即可以使用excel量化交易接口系统来进行数据预处理. 首先要对数据预处理包括数据的归一化 ...

  9. 文本数据增强(EDA、同义词替换-新增-交换-删除-生成同义句)

    在中文数据少的情况下,可以尝试做数据增强,进行 同义词替换-新增-交换-删除-生成同义句,刚好用到,效果还可以,转载一篇使用博客 原文链接: https://blog.csdn.net/rensihu ...

  10. nlp小白教程:word2vec之数据预处理

    1. 数据预处理 首先说的就是分词,对英语来说每个词与词之间是通过空格辨别的,例如I love natural language processing,每个词之间都是有空格的,所以很容划分为[i, l ...

最新文章

  1. 杰奇为什么只能用php5.2,杰奇2.2修改系统定义后,网站报错问题解决
  2. python函数(二)
  3. 程序人生:硬件工程师应记住的10个技巧
  4. C语言试题二十七之请编写程序,实现矩阵(3行3列)的转置(即行列互换)。
  5. rs485接口上下拉_RS485接口EMC电路设计方案
  6. 官方正式预热小米10S:哈曼卡顿加持小米有史以来音质最好的手机
  7. 教材订购模块java代码实现_java教材征订系统
  8. oracle 密码管理,【转载】Oracle密码管理五大要点(一)
  9. Golang的工程管理
  10. python2 print_【学习笔记】python2的print和python3的print()
  11. linux中mysql不显示中文_linux中解决mysql中文乱码方法
  12. python按哪个键删除_Python-从字典中删除键的方法
  13. CentOS 5.8/6.7若干优化
  14. Mac系统如何通过自带的工具进行磁盘修复
  15. QuarkXPress 2021 for Mac(图文设计排版布局工具)
  16. Spring Aop源码解读
  17. Java基础-Java语言简介
  18. 页式存储系统的逻辑地址是由页号和页内地址两部分组成的
  19. 天融信网络知识小百科——第六回:如何为交换机选配光模块?
  20. 2019年淘客怎么做推广之大淘客都必须知道的联盟发展方向和玩法

热门文章

  1. scratch少儿编程航天主题:模拟航天飞机飞行
  2. 凯恩帝k1000ti参数设置_凯恩帝数控怎么修改参数
  3. 可达性分析算法GC Roots
  4. oracle的windows用户名,oracle数据库建立后,用户名跟密码设置windows平台
  5. 游戏外挂,其实是一门网络技术
  6. 史上最全计算机网络大纲
  7. PNP型三极管s9012驱动共阳极数码管
  8. 工科数学分析寒假预习day4 更序问题和级数乘法
  9. Android 准确过滤(禁止) Emoji表情
  10. 计算机信息系统用户管理规定,计算机信息系统保密管理暂行办法 | 中华全国商业信息中心...