数据增强技术在很多领域应用广泛,例如:在图像领域中有:旋转、反转、噪声、mixup、cutmix等等;在语音识别领域有:语音信号添加随机背景噪声、语谱图随机mask等等......
在文本领域也有很多方法:其中 ICLR 2019 workshop论文《EDA: Easy Data Augmentation Techniques for Boosting Performance on Text Classification Tasks》介绍了几种NLP数据增强技术。
代码可以看这里:https://github.com/jasonwei20/eda_nlp/blob/master/code/eda.py
其中包括:
(1)同义词替换:不考虑stopwords
,在句子中随机抽取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_word = get_synonyms(random_word)
if len(synonyms_word) >= 1:
synonym = random.choice(synonyms_word)
new_words = [synonym if word == random_word else word for word in new_words]
num_replaced += 1
if num_replaced >= n:
break
sentence = ' '.join(new_words)
new_words = sentence.split(' ')
return new_words
def get_synonyms(word):
return synonyms.nearby(word)[0]
(2)随机插入:不考虑stopwords
,随机抽取一个词,然后在该词的同义词集合中随机选择一个,插入原句子中的随机位置。该过程可以重复n次。
样例: “我非常喜欢这部电影” —> “爱我非常喜欢这部影片”。
def random_swap(words, n):
new_words = words.copy()
for _ in range(n):
new_words = swap_word(new_words)
return new_words
def swap_word(new_words):
random_idx_1 = random.randint(0, len(new_words) - 1)
random_idx_2 = random_idx_1
counter = 0
while random_idx_2 == random_idx_1:
random_idx_2 = random.randint(0, len(new_words) - 1)
counter += 1
if counter > 3:
return new_words
new_words[random_idx_1], new_words[random_idx_2] = new_words[random_idx_2], new_words[random_idx_1]
return new_words
(3)随机交换:句子中,随机选择两个词,位置交换。该过程可以重复n次。
样例: “如何评价 2017 知乎看山杯机器学习比赛?” —> “2017 机器学习?如何比赛知乎评价看山杯”。
def random_swap(words, n):
new_words = words.copy()
for _ in range(n):
new_words = swap_word(new_words)
return new_words
def swap_word(new_words):
random_idx_1 = random.randint(0, len(new_words) - 1)
random_idx_2 = random_idx_1
counter = 0
while random_idx_2 == random_idx_1:
random_idx_2 = random.randint(0, len(new_words) - 1)
counter += 1
if counter > 3:
return new_words
new_words[random_idx_1], new_words[random_idx_2] = new_words[random_idx_2], new_words[random_idx_1]
return new_words
(4)随机删除:句子中的每个词,以概率p随机删除。
样例:“如何评价 2017 知乎看山杯机器学习比赛?" —> “如何 2017 看山杯机器学习 ”。
def random_deletion(words, p):
if len(words) == 1:
return words
new_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
看上了上面的介绍,接下来最关心的就是有没有现成的工具呢,找了一下,还是有的:
https://github.com/wac81/textda
安装:pip install textda
测试:
from textda.data_expansion import *
print(data_expansion('生活里的惬意,无需等到春暖花开'))
效果展示:
[‘生活里面的惬意,无需等到春暖花开’,
‘生活里的等到春暖花开’,
‘生活里无需惬意,的等到春暖花开’,
‘生活里的惬意,无需等到春暖花开’,
‘生活里的惬意,并不需要等到春暖花开’,
‘生活无需的惬意,里等到春暖花开’,
‘生活里的惬意,等到无需春暖花开’]
参考: