NLP常见语言模型及数据增强方法总结

一、NLP常见语言模型

1、词的离散表示

语料库:(1)John likes to watch movies. Mary likes too. (2)John also likes to watch football games.

字典: {“John”: 1, “likes”: 2, “to”: 3, “watch”: 4, “movies”: 5, “also”: 6, “football”: 7, “games”: 8, “Mary”: 9, “too”: 10}

字典包含10个单词,每个单词有唯一索引;在词典中的顺序和在句子中的顺序没有关联

1、One-hot编码(独热编码)

One-Hot 编码是分类变量作为二进制向量的表示。这首先要求将分类值映射到整数值。然后,每个整数值被表示为二进制向量,除了整数的索引之外,其它都是零值,它被标记为1。

使用 one-hot 编码,将离散特征的取值扩展到了欧式空间,离散特征的某个取值就对应欧式空间的某个点

John: [1, 0, 0, 0, 0, 0, 0, 0, 0, 0] ;likes: [0, 1, 0, 0, 0, 0, 0, 0, 0, 0];……too : [0, 0, 0, 0, 0, 0, 0, 0, 0, 1]

from sklearn.preprocessing import OneHotEncoder
2、Bag of Words(BOW,词袋模型)

BOW 模型忽略了文本的语法和语序,用一组无序的单词(words)来表达一段文字或一个文档。(文档的向量表示可以直接将各词的词向量加和表示)

John likes to watch movies. Mary likes too. 表示为:[1, 2, 1, 1, 1, 0, 0, 0, 1, 1]

John also likes to watch football games. 表示为:[1, 1, 1, 1, 0, 1, 1, 1, 0, 0]

这两个向量共包含10个元素, 其中第i个元素表示字典中第i个单词在句子中出现的次数. 因此BOW模型可认为是一种统计直方图 (histogram)。在文本检索和处理应用中, 可以通过该模型很方便的计算词频。

from sklearn.feature_extraction.text import CountVectorizer

缺陷:“词汇鸿沟”现象,稀疏方式存储,其独立性假设不太符合语言文字实际分布情况,忽略了单词间的语法和顺序,无法了解单词间的关联程度。

解决: 采用高阶(2阶以上)统计语言模型:Bi-Gram、Tri-Gram等。

3、N-gram语言模型

N-gram是计算机语言学和概率论范畴内的概念,是指给定的一段文本或语音中N个项目(item)的序列。项目(item)可以是音节、字母、单词或碱基对。通常N-grams取自文本或语料库。

N=1时称为unigram,N=2称为bigram,N=3称为trigram,以此类推。

(1)N-gram原理

N-Gram是基于一个假设:第n个词出现与前n-1个词相关,而与其他任何词不相关。(这也是隐马尔可夫当中的假设。)整个句子出现的概率就等于各个词出现的概率乘积。各个词的概率可以通过语料中统计计算得到。

(2)N-gram语言模型学习(可参看统计自然语言处理)

N-gram语言模型 N-gram语言模型

为2-gram建立索引:{"John likes”: 1, "likes to”: 2, "to watch”: 3, "watch movies”: 4, "Mary likes”: 5, "likes too”: 6, "John also”: 7, "also likes”: 8, “watch football”: 9, “football games”: 10}

John likes to watch movies. Mary likes too. 表示为:[1, 1, 1, 1, 1,1, 0, 0, 0, 0]

John also likes to watch football games. 表示为:[0, 1, 1, 0, 0, 0, 1, 1,1, 1]

2、词的分布式表示

词的分布式表示核心是:上下文的表示以及上下文与目标词之间的关系的建模。

1、共现矩阵(Co-currence Matrix)

基于矩阵的分布表示主要是构建“词-上下文”矩阵,通过某种技术从该矩阵中获取词的分布表示。矩阵的表示词,表示上下文,每个元素表示某个词和上下文共现的次数,这样矩阵的一行就描述了该词的上下文分布。

常见的上下文有:(1)文档,即“词-文档”矩阵;(2)上下文的每个词,即“词-词”矩阵;(3)n-元词组,即“词-n-元组”矩阵。

经典模型代表:Global Vector模型(GloVe)是一种对**“词-词**”矩阵进行分解从而得到词表示的方法。

GloVe模型(Global Vectors for Word Representation

(1)共现矩阵的表示

词-文档(Word-Document)的共现矩阵主要用于发现主题(topic),用于主题模型,如LSA(Latent Semantic Analysis)。

词-词(Word-Word)共现矩阵可以挖掘语法和语义信息。

例如:语料库如下:

• I like deep learning.

• I like NLP.

• I enjoy flying.

则共现矩阵表示如下:(使用对称的窗函数(左右window length都为1) )

例如:“I like”出现在第1,2句话中,一共出现2次,所以= 2; 对称的窗口指的是,“like I”也是2次。

将共现矩阵行(列)作为词向量表示后,可以知道like,enjoy都是在I附近且统计数目大约相等,他们意思相

(2)共现矩阵表示存在的问题

将共现矩阵的行列作为词向量: 向量维数随着词典大小线性增长;存储整个词典的空间消耗非常大;一些模型如文本分类模型会面临稀疏问题;模型会欠稳定。

解决办法:构造低维稠密向量作为词的分布式表示(25~1000维),如使用奇异值分解SVD(Singular Value Decomposition)对共现矩阵向量做降维。

2、神经网络语言模型(Neural Network Language Model,NNLM)
3、Word2Vec,GloVe,Doc2Vec,Fasttext,Elmo,Bert,Flair

二、NLP增强方法

1、数据增强

数据增强是扩充数据样本规模的一种有效地方法,数据的规模越大、质量越高越好,模型才能够有着更好的泛化能力。

2、简单数据增强(Easy Data Augmentation,EDA)

(1)EDA方法

同义词替换、随机插入、随机交换、随机删除

  • 同义词替换(Synonym Replacement, SR):从句子中随机选取n个不属于停用词集的单词,并随机选择其同义词替换它们;
  • 随机插入(Random Insertion, RI):随机的找出句中某个不属于停用词集的词,并求出其随机的同义词,将该同义词插入句子的一个随机位置。重复n次;
  • 随机交换(Random Swap, RS):随机的选择句中两个单词并交换它们的位置。重复n次;
  • 随机删除(Random Deletion, RD):以 p的概率,随机的移除句中的每个单词。
(2)EDA工具使用方法
  • 先将需要处理的语料按照下面的例子处理好成固定的格式

0 今天天气不错哦。

1 今天天气不行啊!不能出去玩了。

0 又是阳光明媚的一天!

即,标签+一个制表符\t+内容

  • 命令使用例子
$python code/augment.py --input=train.txt --output=train_augmented.txt --num_aug=16 --alpha=0.05

其中:

  • input参数:需要进行增强的语料文件
  • output参数:输出文件
  • num_aug参数:每一条语料将增强的个数
  • alpha参数:每一条语料中改动的词所占的比例
(3)EDA相关工具

3、回译

在这个方法中,我们用机器翻译把一段中文翻译成另一种语言,然后再翻译回中文。回译的方法不仅有类似同义词替换的能力,它还具有在保持原意的前提下增加或移除单词并重新组织句子的能力。

回译可使用python translate包和textblob包(少量翻译),或者使用百度翻译或谷歌翻译的api通过python实现。

百度开放的翻译接口百度翻译开放平台支持每月200万字的免费翻译,提供了各种语言的使用demo,本篇使用Python3调用百度API实现自然语言的翻译,实现代码如下。

import http.client
import hashlib
import json
import urllib
import random
 
 
#调用百度翻译API将中文翻译成英文
def baidu_translate(content):
    appid = 'appid'
    secretKey = '秘钥'
    httpClient = None
    myurl = '/api/trans/vip/translate'
    q = content
    fromLang = 'zh'  # 源语言
    toLang = 'en'  # 翻译后的语言
    salt = random.randint(32768, 65536)
    sign = appid + q + str(salt) + secretKey
    sign = hashlib.md5(sign.encode()).hexdigest()
    myurl = myurl + '?appid=' + appid + '&q=' + urllib.parse.quote(
        q) + '&from=' + fromLang + '&to=' + toLang + '&salt=' + str(
        salt) + '&sign=' + sign
 
    try:
        httpClient = http.client.HTTPConnection('api.fanyi.baidu.com')
        httpClient.request('GET', myurl)
 
        # response是HTTPResponse对象
        response = httpClient.getresponse()
        jsonResponse = response.read().decode("utf-8")  # 获得返回的结果,结果为json格式
        js = json.loads(jsonResponse)  # 将json格式的结果转换字典结构
        dst = str(js["trans_result"][0]["dst"])  # 取得翻译后的文本结果
        #print(dst)  # 打印结果
        return dst
    except Exception as e:
        print('err:' + e)
    finally:
        if httpClient:
            httpClient.close()
 
if __name__=='__main__':
    contents='百度翻译开放平台是百度翻译针对广大开发者提供的开放服务平台'
    
    #将翻译后的英文写入文件
    with open('data/test_data_translate', 'a', encoding="utf-8") as f:
        translate_en = baidu_translate_1(contents)  # 中文翻译成英文
        f.write( '\t' + translate_zh + '\n')
        
        print(translate_en)

4、基于上下文的数据增强方法


(1)方法论文:Contextual Augmentation: Data Augmentation by Words with Paradigmatic Relations

(2)方法实现代码:使用双向循环神经网络进行数据增强。

(3)该方法目前针对于英文数据进行增强,实验工具:spacy(NLP自然语言工具包)和chainer(深度学习框架)。

5、数据增强的作用

(1)增加训练的数据量,提高模型的泛化能力。

(2)增加噪声数据,提升模型的鲁棒性。

NLP 内容目录

一、NLP基础学习

1、用通俗易懂的方式讲解:NLP 这样学习才是正确路线

2、用通俗易懂的方式讲解:TF-IDF算法介绍及实现

3、用通俗易懂的方式讲解:总结NLTK使用方法

4、用通俗易懂的方式讲解:针对中文的自然语言预处理方法汇总

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值