NLP实践-Task6

任务链接:https://wx.zsxq.com/dweb/#/index/222248424811

1.one-hot

one-hot编码(独热编码)用来解决类别型数据的离散值问题

import pandas as pd
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import  OneHotEncoder

# one-hot方法一
print(pd.get_dummies(['bb', 'aa', 'cc', 'dd', 'bb', 'dd', 'aa', 'bb']))

# one-hot方法二
le = LabelEncoder()
ohe = OneHotEncoder(sparse=False)
data = [[1, 1, 2],
        [2, 2, 1],
        [4, 3, 2],
        [1, 4, 2]]
print(ohe.fit_transform(data))

2.word2vec

参考链接:https://blog.csdn.net/qq_24003917/article/details/80389976
word2vec是从大量文本语料中以无监督的方式学习语义知识的一种模型,通过学习文本来用词向量的方式表征词的语义信息,即通过一个嵌入空间使得语义上相似的单词在该空间内距离很近。word2vec模型实际上分为了两个部分,第一部分为建立模型,第二部分是通过模型获取嵌入词向量。Word2Vec的整个建模过程实际上与自编码器(auto-encoder)的思想很相似,即先基于训练数据构建一个神经网络,当这个模型训练好以后,我们并不会用这个训练好的模型处理新的任务,我们真正需要的是这个模型通过训练数据所学得的参数,例如隐层的权重矩阵,而这些权重在word2vec中实际上就是我们试图去学习的“词向量”。

import pandas as pd
from gensim.models import Word2Vec

text = [['4', '3', '7', '6', '5', '7', '8', '1'],
        ['2', '2', '3', '9', '1', '8', '3', '7'],
        ['1', '4', '2', '4', '6', '5', '9', '8', '3'],
        ['5', '7', '9', '7', '5', '6', '3', '2', '6'],
        ['8', '2', '5', '8', '8', '1', '7', '8', '3'],
        ['1', '4', '1', '7', '2', '4', '6', '8', '4', '7'],
        ['4', '8', '6', '3', '3', '3', '4', '1', '9', '4'],
        ['7', '4', '2', '5', '1', '6', '4', '3', '1', '4']]
model = Word2Vec(text, size=5, min_count=1, window=10, iter=10)
print(model['3'])  # 输出3的词向量
print(pd.DataFrame(model[text[0]]).mean())  # 输出text第1行词向量均值

3.FastText

参考链接1:https://blog.csdn.net/qq_16633405/article/details/80578431
参考链接2:https://blog.csdn.net/sinat_26917383/article/details/54850933
参考链接3:https://blog.csdn.net/ymaini/article/details/81489599

3.1简介

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

3.2原理

fastText 方法包含三部分:模型架构、层次 Softmax 和 N-gram 特征。
fastText 模型输入一个词的序列(一段文本或者一句话),输出这个词序列属于不同类别的概率。
序列中的词和词组组成特征向量,特征向量通过线性变换映射到中间层,中间层再映射到标签。
fastText 在预测标签时使用了非线性激活函数,但在中间层不使用非线性激活函数。
fastText 模型架构和 Word2Vec 中的 CBOW 模型很类似。不同之处在于,fastText 预测标签,而 CBOW 模型预测中间词。
第一部分:fastText的模型架构类似于CBOW,两种模型都是基于Hierarchical Softmax,都是三层架构:输入层、 隐藏层、输出层。

CBOW模型又基于N-gram模型和BOW模型,此模型将W(t−N+1)……W(t−1)W(t−N+1)……W(t−1)作为输入,去预测W(t) 
fastText的模型则是将整个文本作为特征去预测文本的类别。

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

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

3.3fastText词向量与word2vec对比

fastText = word2vec中cbow + h-softmax的灵活使用 
灵活体现在两个方面:
模型的输出层:word2vec的输出层,对应的是每一个term,计算某term的概率最大;而fastText的输出层对应的是 
分类的label,不过不管输出层对应的是什么内容,起对应的vector都不会被保留和使用。
模型的输入层:word2vec的输入层,是 context window 内的term;而fasttext 对应的整个sentence的内容,包括term,也包括 n-gram的内容;。
两者本质的不同,体现在h-softmax的使用。
word2vec的目的是得到词向量,该词向量最终是在输入层得到,输出层对应的 h-softmax 也会生成一系列的向量,但最终都被抛弃,不会使用。 
fasttext则充分利用了h-softmax的分类功能,遍历分类树的所有叶节点,找到概率最大的label(一个或者N个)。

import fastText

# 参考链接1:https://blog.csdn.net/ymaini/article/details/81489599
# 参考链接2:https://www.cnblogs.com/gaofighting/p/9552821.html

# 训练数据
# __label__1 6 8 5 7 1 9 7
# __label__0 4 5 1 7 2 8 4
# __label__1 6 8 8 3 2 0 7
# __label__0 3 3 1 4 2 9 1
# __label__1 6 7 5 6 9 8 6
# __label__0 1 5 2 3 4 1 4
# __label__0 3 5 1 2 0 2 1
# __label__1 6 7 5 7 8 4 9

# @param input: 训练数据文件路径
# @param lr: 学习率
# @param dim: 向量维度
# @param ws: cbow模型时使用
# @param epoch: 次数
# @param minCount: 词频阈值, 小于该值在初始化时会过滤掉
# @param minCountLabel: 类别阈值,类别小于该值初始化时会过滤掉
# @param minn: 构造subword时最小char个数
# @param maxn: 构造subword时最大char个数
# @param neg: 负采样
# @param wordNgrams: n-gram个数
# @param loss: 损失函数类型, softmax, ns: 负采样, hs: 分层softmax
# @param bucket: 词扩充大小, [A, B]: A语料中包含的词向量, B不在语料中的词向量
# @param thread: 线程个数, 每个线程处理输入数据的一段, 0号线程负责loss输出
# @param lrUpdateRate: 学习率更新
# @param t: 负采样阈值
# @param label:  类别前缀
# @param verbose:
# @param pretrainedVectors: 预训练的词向量文件路径, 如果word出现在文件夹中初始化不再随机
# @return model object

# 分类训练
classifier = fastText.train_supervised('./data/fastText_train.txt')

# 模型预测,给定文本预测分类,返回预测标签和概率
label, prob = classifier.predict('6 8 5 7 1 9 7')
print(label)
print(prob)

# 模型预测,根据给定的数据集对模型进行评价,返回样本个数、准确率、召回率
n, accuracy, recall = classifier.test('./data/fastText_test.txt')
print(n, accuracy, recall)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章