[中文语音识别后文本加标点] 文本数据增强方法

数据增强技术在很多领域应用广泛,例如:在图像领域中有:旋转、反转、噪声、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('生活里的惬意,无需等到春暖花开'))

效果展示:

[‘生活里面的惬意,无需等到春暖花开’,
‘生活里的等到春暖花开’,
‘生活里无需惬意,的等到春暖花开’,
‘生活里的惬意,无需等到春暖花开’,
‘生活里的惬意,并不需要等到春暖花开’,
‘生活无需的惬意,里等到春暖花开’,
‘生活里的惬意,等到无需春暖花开’]

参考:

(1)https://blog.csdn.net/lzc4869/article/details/98315156

发布了342 篇原创文章 · 获赞 794 · 访问量 178万+

猜你喜欢

转载自blog.csdn.net/u014365862/article/details/104499067
今日推荐