根据zhangy代码改写,主要针对千言问题匹配进行文本数据增强。

依赖安装

pip install jieba
pip install synonyms 

eda.py

import jieba
import synonyms
import random
from random import shufflerandom.seed(2019)#停用词列表,默认使用哈工大停用词表
f = open('stopwords/hit_stopwords.txt')
stop_words = list()
for stop_word in f.readlines():stop_words.append(stop_word[:-1])#考虑到与英文的不同,暂时搁置
#文本清理
'''
import re
def get_only_chars(line):#1.清除所有的数字
'''########################################################################
# 同义词替换
# 替换一个语句中的n个单词为其同义词
########################################################################
def synonym_replacement(words, n):new_words = words.copy()random_word_list = list(set([word for word in words if word not in stop_words]))     random.shuffle(random_word_list)num_replaced = 0  for random_word in random_word_list:          synonyms = get_synonyms(random_word)if len(synonyms) >= 1:synonym = random.choice(synonyms)   new_words = [synonym if word == random_word else word for word in new_words]   num_replaced += 1if num_replaced >= n: breaksentence = ' '.join(new_words)new_words = sentence.split(' ')return new_wordsdef get_synonyms(word):return synonyms.nearby(word)[0]########################################################################
# 随机插入
# 随机在语句中插入n个词
########################################################################
def random_insertion(words, n):new_words = words.copy()for _ in range(n):add_word(new_words)return new_wordsdef add_word(new_words):synonyms = []counter = 0    while len(synonyms) < 1:random_word = new_words[random.randint(0, len(new_words)-1)]synonyms = get_synonyms(random_word)counter += 1if counter >= 10:returnrandom_synonym = random.choice(synonyms)random_idx = random.randint(0, len(new_words)-1)new_words.insert(random_idx, random_synonym)########################################################################
# Random swap
# Randomly swap two words in the sentence n times
########################################################################def random_swap(words, n):new_words = words.copy()for _ in range(n):new_words = swap_word(new_words)return new_wordsdef swap_word(new_words):random_idx_1 = random.randint(0, len(new_words)-1)random_idx_2 = random_idx_1counter = 0while random_idx_2 == random_idx_1:random_idx_2 = random.randint(0, len(new_words)-1)counter += 1if counter > 3:return new_wordsnew_words[random_idx_1], new_words[random_idx_2] = new_words[random_idx_2], new_words[random_idx_1] return new_words########################################################################
# 随机删除
# 以概率p删除语句中的词
########################################################################
def random_deletion(words, p):if len(words) == 1:return wordsnew_words = []for word in words:r = random.uniform(0, 1)if r > p:new_words.append(word)if len(new_words) == 0:rand_int = random.randint(0, len(words)-1)return [words[rand_int]]return new_words########################################################################
#EDA函数
def eda(sentence, alpha_sr=0.1, alpha_ri=0.1, alpha_rs=0.1, p_rd=0.1, num_aug=9):seg_list = jieba.cut(sentence)seg_list = " ".join(seg_list)words = list(seg_list.split())num_words = len(words)augmented_sentences = []num_new_per_technique = int(num_aug/4)+1n_sr = max(1, int(alpha_sr * num_words))n_ri = max(1, int(alpha_ri * num_words))n_rs = max(1, int(alpha_rs * num_words))#print(words, "\n")#同义词替换srfor _ in range(num_new_per_technique):a_words = synonym_replacement(words, n_sr)augmented_sentences.append(' '.join(a_words))#随机插入rifor _ in range(num_new_per_technique):a_words = random_insertion(words, n_ri)augmented_sentences.append(' '.join(a_words))#随机交换rsfor _ in range(num_new_per_technique):a_words = random_swap(words, n_rs)augmented_sentences.append(' '.join(a_words))#随机删除rdfor _ in range(num_new_per_technique):a_words = random_deletion(words, p_rd)augmented_sentences.append(' '.join(a_words))#print(augmented_sentences)shuffle(augmented_sentences)if num_aug >= 1:augmented_sentences = augmented_sentences[:num_aug]else:keep_prob = num_aug / len(augmented_sentences)augmented_sentences = [s for s in augmented_sentences if random.uniform(0, 1) < keep_prob]augmented_sentences.append(seg_list)return augmented_sentences

augment.py

from eda import *import argparse
ap = argparse.ArgumentParser()
ap.add_argument("--input", required=True, type=str, help="原始数据的输入文件目录")
ap.add_argument("--output", required=False, type=str, help="增强数据后的输出文件目录")
ap.add_argument("--num_aug", required=False, type=int, help="每条原始语句增强的语句数")
ap.add_argument("--alpha", required=False, type=float, help="每条语句中将会被改变的单词数占比")
args = ap.parse_args()#输出文件
output = None
if args.output:output = args.output
else:from os.path import dirname, basename, joinoutput = join(dirname(args.input), 'eda_' + basename(args.input))#每条原始语句增强的语句数
num_aug = 9 #default
if args.num_aug:num_aug = args.num_aug#每条语句中将会被改变的单词数占比
alpha = 0.1 #default
if args.alpha:alpha = args.alphadef gen_eda(train_orig, output_file, alpha, num_aug=9):writer = open(output_file, 'w')lines = open(train_orig, 'r').readlines()print("正在使用EDA生成增强语句...")for i, line in enumerate(lines):parts = line[:-1].split('\t')    #使用[:-1]是把\n去掉了sentence1 = parts[0]sentence2 = parts[1]label = parts[2]aug_sentences1 = eda(sentence1, alpha_sr=alpha, alpha_ri=alpha, alpha_rs=alpha, p_rd=alpha, num_aug=num_aug)aug_sentences2 = eda(sentence2, alpha_sr=alpha, alpha_ri=alpha, alpha_rs=alpha, p_rd=alpha, num_aug=num_aug)for i,aug_sentence1 in enumerate(aug_sentences1):writer.write(aug_sentence1.replace(' ','') + "\t" + aug_sentences2[i].replace(' ','') + "\t" + label +'\n')writer.close()print("已生成增强语句!")print(output_file)if __name__ == "__main__":gen_eda(args.input, output, alpha=alpha, num_aug=num_aug)

增强训练数据集

!python augment.py --input train.txt

文本数据增强-同义词替换、随机交换、随机插入、随机删除相关推荐

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

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

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

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

  3. 人机交互系统(3.1)——NLP文本数据增强方法

    一.数据增强的背景和应用场景 随着AI技术的逐步发展,更好的神经网络模型对数据规模的要求也逐步提升.而在分类任务中,若不同类别数据量相差很大,模型则会出现过拟合现象,严重影响预测的正确性. 从广义上来 ...

  4. NLP文本数据增强热门技术

    NLP文本数据增强热门技术 背景 word替换 同义词替换 词向量替换 掩码语言模型(Masked Language Model,MLM) 基于tfidf的词替换 反向翻译 文本表面转换 随机噪声 注 ...

  5. 文本数据增强一(概述、中文、同义句生成、enhance、augment、text、nlp)

    文本数据增强(扩充增加.中文.同义句生成.enhance.augment.text.nlp) AugmentText 概述 - 相较于图像数据增强,文本数据增强,现在还是有很多问题的: - 往更严格的 ...

  6. 2.文本预处理(分词,命名实体识别和词性标注,one-hot,word2vec,word embedding,文本数据分析,文本特征处理,文本数据增强)

    文章目录 1.1 认识文本预处理 文本预处理及其作用 文本预处理中包含的主要环节 文本处理的基本方法 文本张量表示方法 文本语料的数据分析 文本特征处理 数据增强方法 重要说明 1.2 文本处理的基本 ...

  7. nlp文本数据增强_如何使用Texthero为您的NLP项目准备基于文本的数据集

    nlp文本数据增强 Natural Language Processing (NLP) is one of the most important fields of study and researc ...

  8. 文本数据增强三(回译,不同语种间的翻译)

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

  9. 【NLP】文本数据分析文本特征处理文本数据增强

    一.文本数据分析 文本数据分析的作用: 文本数据分析能够有效帮助我们理解数据语料, 快速检查出语料可能存在的问题, 并指导之后模型训练过程中一些超参数的选择. 常用的几种文本数据分析方法: 标签数量分 ...

最新文章

  1. ubuntu16.04安装mysql5.7.15
  2. 安卓开发屏幕分辨率尺寸适配问题【原创】
  3. 蘋果全新MacBook價高質更精
  4. Google BigQuery——企业级大数据分析工具
  5. 比较两个二维数组是否相等
  6. DWR的使用以及DWR中工具JS文件的使用
  7. 最短路径——Dijkstra算法以及二叉堆优化(含证明)
  8. 2015 百度一面 总结记录
  9. “假冒上市”公司再甩锅:我被服务商给骗了
  10. ios 点生成线路 百度地图_网站地图全面解析
  11. 一个转行学习前端的初学者,应该如何计划自己的学习规划?
  12. 复杂对象ibatis插入,属性为list,怎么一次性插入
  13. php 视频播放加密,如何在HTML5页面播放加密视频
  14. android11 谷歌安装器,gms安装器安卓11版2021最新版-安卓11gms安装器2021最新版v4.8.5华为专版_新绿资源网...
  15. 空城过客XP系统快捷方式去除箭头方法
  16. 彪悍的人生不需要解释,需要解释的人生是软弱的
  17. FPGA设计之门控时钟
  18. xshell下载安装
  19. 浅析jQuery删除节点的三个方法
  20. 小程序-仿朋友圈开发问题

热门文章

  1. 戴尔rpc服务器不显示,打印机出现RPC服务器不可用修复
  2. MPC模型预测控制(二)-MATLAB代码实现
  3. 中基鸿业工薪层如何理财
  4. 网络乞讨?网络越来越像真实社会了!
  5. php bom头 emeditor,利用Emeditor转换文件的编码格式
  6. 模仿豌豆荚以及某些刷机软件获取手机屏幕图片
  7. XDR的过去、现状与未来
  8. vue项目中使用百度地图
  9. SwiftUI实战教程之创建Tinder样式的可左右滑动卡视图(项目含源码)
  10. “中国神臂”震惊海外,14年研发打破西方垄断达到国际先进水平