语料库:(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个单词,每个单词有唯一索引;在词典中的顺序和在句子中的顺序没有关联
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
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等。
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]
词的分布式表示核心是:上下文的表示以及上下文与目标词之间的关系的建模。
基于矩阵的分布表示主要是构建“词-上下文”矩阵,通过某种技术从该矩阵中获取词的分布表示。矩阵的行表示词,列表示上下文,每个元素表示某个词和上下文共现的次数,这样矩阵的一行就描述了该词的上下文分布。
常见的上下文有:(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)对共现矩阵向量做降维。
数据增强是扩充数据样本规模的一种有效地方法,数据的规模越大、质量越高越好,模型才能够有着更好的泛化能力。
同义词替换、随机插入、随机交换、随机删除。
0 今天天气不错哦。
1 今天天气不行啊!不能出去玩了。
0 又是阳光明媚的一天!
即,标签+一个制表符\t+内容
$python code/augment.py --input=train.txt --output=train_augmented.txt --num_aug=16 --alpha=0.05
其中:
在这个方法中,我们用机器翻译把一段中文翻译成另一种语言,然后再翻译回中文。回译的方法不仅有类似同义词替换的能力,它还具有在保持原意的前提下增加或移除单词并重新组织句子的能力。
回译可使用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)
(1)方法论文:Contextual Augmentation: Data Augmentation by Words with Paradigmatic Relations
(2)方法实现代码:使用双向循环神经网络进行数据增强。
(3)该方法目前针对于英文数据进行增强,实验工具:spacy(NLP自然语言工具包)和chainer(深度学习框架)。
(1)增加训练的数据量,提高模型的泛化能力。
(2)增加噪声数据,提升模型的鲁棒性。
一、NLP基础学习
1、用通俗易懂的方式讲解:NLP 这样学习才是正确路线
2、用通俗易懂的方式讲解:TF-IDF算法介绍及实现
3、用通俗易懂的方式讲解:总结NLTK使用方法
4、用通俗易懂的方式讲解:针对中文的自然语言预处理方法汇总