【NLP实践-Task6 简单神经网络】文本表示&fasttext

目录

文本表示

one-hot介绍

one-hot在提取文本特征上的应用

优缺点分析

sklearn实现one hot encode

word2vec

CBOW模型的理解

CBOW模型流程举例

fasttext

fasttext介绍

应用场景

优点

原理

fasttext与word2vec对比

fasttext文本分类实战

参考


文本表示

one-hot介绍

       one-hot编码,又称独热编码、一位有效编码。其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都有它独立的寄存器位,并且在任意时候,其中只有一位有效。举个例子,假设有4个样本(行),每个样本有3个特征(列),如图:   

                              

       上图中我们已经对每个特征进行了普通的数字编码:我们的feature_1有两种可能的取值,比如是男/女,这里男用1表示,女用2表示。那么one-hot编码是怎么搞的呢?我们再拿feature_2来说明:

       这里feature_2 有4种取值(状态),我们就用4个状态位来表示这个特征,one-hot编码就是保证每个样本中的单个特征只有1位处于状态1,其他的都是0。

                                                    

       这些样本特征的新表示:

                            

       one-hot编码将每个状态位都看成一个特征。这4个样本的特征向量分别为:

Sample_1 -> [0,1,1,0,0,0,1,0,0]
Sample_2 -> [1,0,0,1,0,0,0,1,0]
Sample_3 -> [0,1,0,0,1,0,0,1,0]
Sample_4 -> [1,0,0,0,0,1,0,0,1]

one-hot在提取文本特征上的应用

       one hot在特征提取上属于词袋模型(bag of words)。关于如何使用one-hot抽取文本特征向量我们通过以下例子来说明。假设我们的语料库中有三段话:

我爱中国

爸爸妈妈爱我

爸爸妈妈爱中国

       我们首先对预料库分离并获取其中所有的词,然后对每个此进行编号:1 我; 2 爱; 3 爸爸; 4 妈妈;5 中国

       然后使用one hot对每段话提取特征向量:

                                            

                                         

                                         

       因此我们得到了最终的特征向量为:

我爱中国  ->   1,1,0,0,1

爸爸妈妈爱我  ->  1,1,1,1,0

爸爸妈妈爱中国  ->  0,1,1,1,1

优缺点分析

       优点:一是解决了分类器不好处理离散数据的问题,二是在一定程度上也起到了扩充特征的作用(上面样本特征数从3扩展到了9)

       缺点:在文本特征表示上有些缺点就非常突出了。首先,它是一个词袋模型,不考虑词与词之间的顺序(文本中词的顺序信息也是很重要的);其次,它假设词与词相互独立(在大多数情况下,词与词是相互影响的);最后,它得到的特征是离散稀疏的。

sklearn实现one hot encode

from sklearn import preprocessing

encoder = preprocessing.OneHotEncoder() # 创建对象
encoder.fit([
    [0, 2, 1, 12],
    [1, 3, 5, 3],
    [2, 3, 2, 12],
    [1, 2, 4, 3]
])  # 拟合
encoded_vector = encoder.transform([[2, 3, 5, 3]]).toarray()  # 转化
print("Encoded vector =", encoded_vector)

# 输出结果:Encoded vector = [[ 0. 0. 1. 0. 1. 0. 0. 0. 1. 1. 0.]]

word2vec

       word2vec是如何得到词向量的?

       首先有了文本语料库,你需要对语料库进行预处理,这个处理流程与你的语料库种类以及个人目的有关。比如,英文语料库可能需要大小写转换检查拼写错误等操作,中文日语语料库需要增加分词处理。

       然后把得到的processed corpus转为one-hot向量,作为word2vec的输入,通过word2vec训练低维词向量(word embedding)。

       word2vec是个很棒的工具,目前有两种训练模型(CBOWSkip-gram),两种加速算法(Negative Sample与Hierarchical Softmax)。这里主要介绍CBOW如何将corpus的one-hot向量(模型的输入)转换成低维词向量(模型的中间产物,更具体来说是输入权重矩阵),真真切切感受到向量的变化,不涉及加速算法。

CBOW模型:根据中心词W(t)周围的词来预测中心词 
Skip-gram模型:根据中心词W(t)来预测周围词

                   

                                      CBOW模型                                                                                      Skip-gram模型

CBOW模型的理解

                                                          

                                                                                CBOW模型结构图

(花括号内{}为解释内容.)

  1. 输入层:上下文单词的onehot. {假设单词向量空间dim为V,上下文单词个数为C}
  2. 所有onehot分别乘以共享的输入权重矩阵W. {V*N矩阵,N为自己设定的数,初始化权重矩阵W}
  3. 所得的向量 {因为是onehot所以为向量} 相加求平均作为隐层向量, size为1*N.
  4. 乘以输出权重矩阵W’ {N*V}
  5. 得到向量 {1*V} 激活函数处理得到V-dim概率分布 {PS: 因为是onehot嘛,其中的每一维都代表着一个单词},概率最大的index所指示的单词为预测出的中间词(target word)
  6. 与true label的onehot做比较,误差越小越好

       所以,需要定义loss function(一般为交叉熵代价函数),采用梯度下降算法更新W和W’。训练完毕后,输入层的每个单词与矩阵W相乘得到的向量的就是我们想要的词向量(word embedding),这个矩阵(所有单词的word embedding)也叫做look up table(其实聪明的你已经看出来了,其实这个look up table就是矩阵W自身),也就是说,任何一个单词的onehot乘以这个矩阵都将得到自己的词向量。有了look up table就可以免去训练过程直接查表得到单词的词向量了。

CBOW模型流程举例

       假设我们现在的Corpus是这一个简单的只有四个单词的document: {I drink coffee everyday} 
       我们选coffee作为中心词,window size设为2 。也就是说,我们要根据单词”I”,”drink”和”everyday”来预测一个单词,并且我们希望这个单词是coffee。


W是共享的输入权重矩阵。


计算隐层向量。


W'是输出权重矩阵。 


fasttext

fasttext介绍

应用场景

       fasttext是一种Facebook AI Research在16年开源的一个文本分类器。 其特点就是fast。相对于其它文本分类模型,如SVM,Logistic Regression和neural network等模型,fasttext在保持分类效果的同时,大大缩短了训练时间。

优点

  1. 适合大型数据+高效的训练速度:能够训练模型“在使用标准多核CPU的情况下10分钟内处理超过10亿个词汇”
  2. 支持多语言表达:利用其语言形态结构,fasttext能够被设计用来支持包括英语、德语、西班牙语、法语以及捷克语等多种语言。fasttext的性能要比时下流行的word2vec工具明显好上不少,也比其他目前最先进的词态词汇表征要好。
  3. fastText专注于文本分类,在许多标准问题上实现当下最好的表现(例如文本倾向性分析或标签预测)。

原理

       fasttext 方法包含3部分:模型架构层次 Softmax N-gram 特征

       fasttext 模型输入一个词的序列(一段文本或者一句话),输出这个词序列属于不同类别的概率。 

       fasttext 在预测标签时使用了非线性激活函数,但在中间层不使用非线性激活函数。 

       fasttext 模型架构和 Word2Vec 中的 CBOW 模型很类似。不同之处在于,fastText 预测标签,而 CBOW 模型预测中间词

1、模型架构。

       fasttext的模型架构类似于CBOW,两种模型都是基于Hierarchical Softmax,都是3层架构:输入层、 隐藏层、输出层。 

       CBOW模型又基于N-gram模型和BOW模型,此模型将W(t−N+1)……W(t−1)作为输入,去预测W(t);

        fasttext的模型则是将整个文本作为特征去预测文本的类别。

2、层次之间的映射

       将输入层中的词和词组构成特征向量,再将特征向量通过线性变换映射到隐藏层,隐藏层通过求解最大似然函数,然后根据每个类别的权重和模型参数构建Huffman树,将Huffman树作为输出。 

                                    

3、fastText的N-gram特征

       常用的特征是词袋模型(将输入数据转化为对应的Bow形式)。但词袋模型不能考虑词之间的顺序,因此 fastText 还加入了 N-gram 特征。

       “我 爱 她” 这句话中的词袋模型特征是 “我”,“爱”, “她”。这些特征和句子 “她 爱 我” 的特征是一样的。 
       如果加入 2-Ngram,第一句话的特征还有 “我-爱” 和 “爱-她”,这两句话 “我 爱 她” 和 “她 爱 我” 就能区别开来了。当然,为了提高效率,我们需要过滤掉低频的 N-gram。 

       在fasttext 中一个低维度向量与每个单词都相关。隐藏表征在不同类别所有分类器中进行共享,使得文本信息在不同类别中能够共同使用。这类表征被称为词袋(bag of words)(此处忽视词序)。在 fastText中也使用向量表征单词 n-gram来将局部词序考虑在内,这对很多文本分类问题来说十分重要。 
       举例来说:fasttext能够学会“男孩”、“女孩”、“男人”、“女人”指代的是特定的性别,并且能够将这些数值存在相关文档中。然后,当某个程序在提出一个用户请求(假设是“我女友现在在儿?”),它能够马上在fastText生成的文档中进行查找并且理解用户想要问的是有关女性的问题。

fasttext与word2vec对比

       fasttext= word2vec中 cbow + h-softmax的灵活使用 
       灵活体现在两个方面:

  1. 模型的输出层:word2vec的输出层,对应的是每一个term,计算某term的概率最大;而fasttext的输出层对应的是分类的label。不过不管输出层对应的是什么内容,其对应的vector都不会被保留和使用;
  2. 模型的输入层:word2vec的输入层,是 context window 内的term;而fasttext 对应的整个sentence的内容,包括term,也包括 n-gram的内容; 

       两者本质的不同,体现在 h-softmax的使用。
       Word2vec的目的是得到词向量,该词向量最终是在输入层得到,输出层对应的 h-softmax 也会生成一系列的向量,但最终都被抛弃,不会使用。
       fasttext则充分利用了h-softmax的分类功能,遍历分类树的所有叶节点,找到概率最大的label(一个或者N个)。

fasttext文本分类实战

数据与代码均参考:https://github.com/mountainguan/fastText_learning

分词

import jieba

inFile = 'data/data.txt'
outFile = 'data/trained.txt'

f = open(inFile,'r')
writer = open(outFile,'w')
for line in f.readlines():
    splitor = line.split()
    # 默认切割方法
    text = jieba.cut_for_search(splitor[0])
    text = " ".join(text) + " " + splitor[1] + '\n'
    writer.writelines(text)

f.close()
writer.close()

训练

#-*- coding:utf8 -*-
import logging
import fastText
import jieba
# help(fastText.FastText)
# exit()
input="清华大学"

text = jieba.cut_for_search(input)
text = " ".join(text)

# logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)

classifier = fastText.train_supervised("data/trained.txt",epoch=10,ws=2 , lr=0.5, wordNgrams=1, dim=1000,label=u"__label__",loss=u'softmax')

classifier.save_model("model/classify.model")

result = classifier.predict(text)

print("预测词:" + input + "\n")

print("预测结果:")
print( result)

预测结果 

参考

one-hot向量与word2vec https://blog.csdn.net/mawenqi0729/article/details/80698780

机器学习之One-Hot Encoding详解 https://www.jianshu.com/p/cb344e1c860a

词袋模型(BOW)和词向量模型(Word Embedding)概念介绍 https://blog.csdn.net/sinat_36521655/article/details/79993369

word2vec前世今生 https://www.cnblogs.com/iloveai/p/word2vec.html

FastText原理总结 https://blog.csdn.net/qq_16633405/article/details/80578431

fasttext简单实践 https://github.com/mountainguan/fastText_learning

使用word2vec, fasttext进行训练词向量 https://github.com/RicherDong/words_vectors_embeddings

文本分类(六):使用fastText对文本进行分类 https://blog.csdn.net/lxg0807/article/details/52960072

FastText:快速的文本分类器 https://blog.csdn.net/john_bh/article/details/79268850

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值