当前位置:   article > 正文

文本数据增强-EDA笔记_对英文文本进行eda同义词替换

对英文文本进行eda同义词替换

对文本数据进行EDA(同义词替换、随机插入、随机交换、随机删除)

简介:实现这些功能需要使用 synonyms 第三方库来实现

import synonyms
string_text = "向日葵"
print(synonyms.nearby(string_text,5))  # 打印5个 向日葵 的近义词
# output:
(['向日葵', '铃兰', '蒲公英', '雏菊', '头序'], [1.0, 0.64993227, 0.6350045, 0.6339984, 0.48143455])
返回的是一个元组:
第一个返回结果是 这个词的近义词,
第二个返回结果是 相似的概率
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

封装一个获取近义词的函数,便于直接获取近义词

def get_synonyms(word):
    synonym_word_list = synonyms.nearby(word,number)[0]
    return synonym_word_list
  • 1
  • 2
  • 3
  1. 同义词替换(对非停用词的词语进行同义词替换)
# 加载停用词列表
with open("../data/stopwords.txt","r",encoding="utf-8") as f:
    stop_word_list = [word.strip() for word in f]

# 先进行 jieba 分词
string_eda = "遇到不幸,请先不要一味的抱怨,而是庆幸。"
cut_word_list = jieba.cut(string_eda)
cut_word_list = " ".join(cut_word_list)
cut_word_list = cut_word_list.split()  # 得到了 一个切好词的列表

# 将切好词的列表进行复制存储
new_word_list = cut_word_list.copy()
# 去停用词
clean_word_list = [word for word in cut_word_list if word not in stop_word_list]
# 去重
clean_word_list = list(set(clean_word_list))

for word in clean_word_list:
    synonym = get_synonyms(word)
    if len(synonym) > 1:
    	# 对于生成的多个近义词,随机选取其中的一个
        word_choice = random.choice(synonym)
        # 利用原来存好的列表,进行近义词的替换
        new_word_list_new = [word_choice if old_word == word else old_word for old_word in new_word_list]

    seq = " ".join(new_word_list_new)
    print(seq)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

效果:
在这里插入图片描述

  1. 随机插入(不去停用词,直接随机选取词语,做近义词,进行插入操作)
# cut_word_list: 遇到 不幸 , 请 先 不要 一味 的 抱怨 , 而是 庆幸 。
# word_list:利用 jieba 切好词的一句话
# number:需要进行几次随机插入
def insert_word(word_list,number):
    all_insert_word_list = []  # 存储随机插入的结果的列表
    for i in range(number):
        synonym = []
        while len(synonym) == 0:  # 判断这个词有没有相似词,如果没有就再随机选取词
            random_word = word_list[random.randint(0,len(word_list) - 1)]
            synonym = get_synonyms(random_word)
            print(synonym)
        random_synonyms_word = random.choice(synonym)  # 随机对生成的相似词进行选择
        rand_index = random.randint(0,len(word_list)-1)
        word_list.insert(rand_index,random_synonyms_word)  # 插入列表中
        all_insert_word_list.append(" ".join(word_list))
    return all_insert_word_list


print(" ".join(cut_word_list))
print(cut_word_list)
all_seq_list = insert_word(cut_word_list,number=5)
for seq in all_seq_list:
    print(seq)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

效果(看起来插入的位置都是相同的,是因为我在上面固定了随机种子,实际使用的时候可以去掉就 ok):
在这里插入图片描述

  1. 随机插入
def swap_word(word_list,number):
    swap_word_list = []
    for i in range(number):
        rand_index_1 = random.randint(0,len(word_list)-1)
        rand_index_2 = random.randint(0,len(word_list)-1)
        # 这块是为了防止两个随机的索引重复
        while rand_index_1 == rand_index_2:
            rand_index_2 = random.randint(0,len(word_list)-1)

        word_list[rand_index_1],word_list[rand_index_2] = word_list[rand_index_2],word_list[rand_index_1]
        swap_word_list.append(" ".join(word_list))
    return swap_word_list

print("原始:",cut_word_list)
swap_list = swap_word(cut_word_list,5)
for seq in swap_list:
    print("交换后:",seq)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

效果:
在这里插入图片描述

  1. 随机删除
# 这个函数主要实现了对切词列表的随机删除
# probability:这是删除的概率(可以自定义)
 
def word_random_del(word_list,probability=0.1):
	# 判断切词列表的长度,如果小于等于 1 ,那还删啥啊,都没了,没法删除
    if len(word_list) <= 1:
        return word_list
        
	# lucky_word:用来存储幸运的,被选出来的词语
    lucky_word = []
    for word in word_list:
        pro = random.uniform(0,1)  # 生成随机数(概率)
        # 如果大于我们设定的概率,就拿出来,存到 lucky_word 中
        if pro > probability:
            lucky_word.append(word)
	
	# 如果每个单词的点儿都很差,一个都没选出来,
	# 那么就需要随机的在 切词列表 中选取 int(len(word_list)/0.8) 个词语(这个数值可以自定义,根据需要自己修改)
	# 同时这个列表也是为了防止选出来的词语有重复的
    random_number_list = []
    
    if len(lucky_word) == 0:
        for i in range(int(len(word_list)/0.8)):
            random_number = random.randint(0, len(word_list)-1)
            while random_number not in random_number_list:
                random_number_list.append(random_number)
                # 这一块用的是 索引直接插入的,也可以直接对列表进行 append ,不知道效果好不好,自己去尝试一下吧
                # 不过一个词也没选出来的概率非常小,所以这种情况是为了万一,有可能你写了用不到
                lucky_word.insert(random_number,word_list[random_number])
    return lucky_word

print("原始:",cut_word_list)
swap_list = word_random_del(cut_word_list,0.1)
print("随机删除:",swap_list)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

效果:
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/394330
推荐阅读
相关标签
  

闽ICP备14008679号