Datawhale《深度学习-NLP》Task6- 简单神经网络

3. 参考

word2vec1:word2vec 中的数学原理详解(一)目录和前言 - peghoty - CSDN博客

word2vec2:word2vec原理推导与代码分析-码农场

word2vec中的数学原理详解(四)基于 Hierarchical

Softmax 的模型:word2vec 中的数学原理详解(四)基于 Hierarchical Softmax 的模型 - ...

fasttext1:GitHub - facebookresearch/fastText: Library for fa...

fasttext2:GitHub - salestock/fastText.py: A Python interface...

fasttext3 其中的参考:fastText源码分析以及使用 — 相依

A Neural Network Playground

 

 

文本表示

one-hot

One-Hot编码,又称为一位有效编码,主要是采用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候只有一位有效。

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

我们可以使用以下三种方式来实现one-hot:

手动One Hot编码

from numpy import argmax
# define input string
data = 'hello world'
print(data)
# define universe of possible input values
alphabet = 'abcdefghijklmnopqrstuvwxyz '
# define a mapping of chars to integers
char_to_int = dict((c, i) for i, c in enumerate(alphabet))
int_to_char = dict((i, c) for i, c in enumerate(alphabet))
# integer encode input data
integer_encoded = [char_to_int[char] for char in data]
print(integer_encoded)
# one hot encode
onehot_encoded = list()
for value in integer_encoded:
       letter = [0 for _ in range(len(alphabet))]
       letter[value] = 1
       onehot_encoded.append(letter)
print(onehot_encoded)
# invert encoding
inverted = int_to_char[argmax(onehot_encoded[0])]
print(inverted)

基于scikit-learn

from numpy import array
from numpy import argmax
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import OneHotEncoder
# define example
data = ['cold', 'cold', 'warm', 'cold', 'hot', 'hot', 'warm', 'cold', 'warm', 'hot']
values = array(data)
print(values)
# integer encode
label_encoder = LabelEncoder()
integer_encoded = label_encoder.fit_transform(values)
print(integer_encoded)
# binary encode
onehot_encoder = OneHotEncoder(sparse=False)
integer_encoded = integer_encoded.reshape(len(integer_encoded), 1)
onehot_encoded = onehot_encoder.fit_transform(integer_encoded)
print(onehot_encoded)
# invert first example
inverted = label_encoder.inverse_transform([argmax(onehot_encoded[0, :])])
print(inverted)

基于keras

from numpy import array
from numpy import argmax
from keras.utils import to_categorical
# define example
##对字符串
data = ['cold', 'cold', 'warm', 'cold', 'hot', 'hot', 'warm', 'cold', 'warm', 'hot']
values = array(data)
print(values)
# integer encode
label_encoder = LabelEncoder()
integer_encoded = label_encoder.fit_transform(values)
print(integer_encoded)
 
##对数值
#data=[1, 3, 2, 0, 3, 2, 2, 1, 0, 1]
#data=array(data)
#print(data)
 
# one hot encode
encoded = to_categorical(integer_encoded)
print(encoded)
# invert encoding
inverted = argmax(encoded[0])
print(inverted)

 

word2vec

一、Word2Vec梗概

字面意思:即Word to Vector,由词到向量的方法。

专业解释:Word2Vec使用一层神经网络将one-hot(独热编码)形式的词向量映射到分布式形式的词向量。使用了Hierarchical softmax, negative sampling等技巧进行训练速度上的优化1。

作用:我们日常生活中使用的自然语言不能够直接被计算机所理解,当我们需要对这些自然语言进行处理时,就需要使用特定的手段对其进行分析或预处理。使用one-hot编码形式对文字进行处理可以得到词向量,但是,由于对文字进行唯一编号进行分析的方式存在数据稀疏的问题,Word2Vec能够解决这一问题,实现word embedding(个人理解为:某文本中词汇的关联关系 例如:北京-中国,伦敦-英国)。

最主要的用途:一是作为其他复杂的神经网络模型的初始化(预处理);二是把词与词之间的相似度用作某个模型的特征(分析)。
二、Word2Vec的具体算法阐述

2.1 算法流程

第一步:将one-hot形式的词向量输入到单层神经网络中,其中输入层的神经元结点个数应该和one-hot形式的词向量维数相对应。比如,输入词是“夏天”,它对应的one-hot词向量

[0,0,1]

那么,我们设置输入层的神经元个数就应该是3。

第二步:通过神经网络中的映射层中的激活函数,计算目标单词与其他词汇的关联概率,其中在计算时,使用了负采样(negative sampling)的方式来提高其训练速度和正确率

第三步:通过使用随机梯度下降(SGD)的优化算法计算损失

第四步:通过反向传播算法将神经元的各个权重和偏置进行更新

所以,word2vec实质上是一种降维操作,将one-hot形式的词向量转化为word2vec形式。

2.2 两种训练方式

Word2Vec有两种训练词向量的方式。通过这两种方式训练出来的结果,都是相同的即一个可进行词汇关联预测的单层神经网络。

2.2.1 Continous Bag of Words Model(CBOW)
CBOW是通过目标单词的语境推测出可能出现的单词。CBOW的训练流程图如下所示:
softmax-cbow

从上图中,我们也可以更加清晰地理解从语境中推测目标单词的概率,这句话的意义。从Tensorflow的教程中来看,Tensorflow更倾向于使用Skip-Gram model来进行embedding,所以这里不再展开叙述。

补充:CBOW的更一般情况2。

我们将上下文单词输入时,可能会遇到多种上下文的形式,所以,情况可能会为下图所示:

è¿éåå¾çæè¿°

即多种情况对应同一个单词的预测输出。

2.2.2 Skip-Gram model
Skip-Gram model是通过目标单词推测语境,在大规模的数据集中Skip-Gram model训练速度快。不过,本人并未有过测试,以上结论有待考证。Skip-Gram 的训练流程如下图所示:
è¿éåå¾çæè¿°

和CBOW进行对比,相比区别还是很明显的。

Skip-Gram 的损失函数是通过将目标词汇的正例和负例使用二元对数回归(Binary Logistic Regeression)计算概率并相加得到的。损失函数公式3为: 

è¿éåå¾çæè¿°

这一形式是与CBOW相反的。

2.3 算法的权重的更新
我们都知道,一般而言,机器学习和深度学习中,常常使用的梯度下降(GD)的算法来计算和更新权重与偏置。在数据量极大的情况下,虽然批量梯度下降能够向全局最优的方向迭代,但是每次迭代都需要使用数据集中的所有数据且迭代的速度将十分缓慢,所以,在数据量极大的情况下,并不推荐使用。所以,在word2vec的权重更新时,我使用的是随机梯度下降算法(Stochastic Gradient Descent)。随机梯度下降的算法是通过对样本中随机一个数据进行权重的更新,从而,减少冗余数据对整个迭代过程的影响,提高收敛效率。不过,由于是随机取值,所以,可能会落入局部最优中去,而且更新时会出现较大的波动,更新值方差较大。下图也能直观的看出其较大波动的图像6:
è¿éåå¾çæè¿°

但是,通过降低学习率能够,使波动减小,呈现出与批量梯度下降相似的效果,同时,随机性能够跳出局部最优的情况,从而得到更好的收敛效果。同时,随机梯度下降在前期的的迭代中效果显著,曲线如下图7所示:

è¿éåå¾çæè¿°

说了那么多,从公式上看看梯度下降和随机梯度下降的区别吧。假设待优化函数为: 

三、代码实现

代码实现参照的是Tensorflow官网Tutorial中的Vector Representations of Words实现的。具体的实现如下:

3.1 构建图(Build the Graph)

1.使用Variable来构建一个够我们嵌入词向量的矩阵,且初始值为uniform

embeddings = tf.Variable(
    tf.random_uniform([vocabulary_size, embedding_size], -1.0, 1.0))

其中,vocabulary_size是输入文本中的词汇个数,embedding_size是词向量嵌入矩阵的维度,是超参数之一,一般取128,也是词向量的大小,其具体数值可以由我们自己定夺,当然他的值也会影响整个实验的效果。 tf.random_uniform函数的含义是了一个vocabulary_size*embedding_size大小的矩阵,使用

[−1.0,1.0)

区间上的随机数进行填充。

2.初始化损失(loss)函数的权重和偏置,同样是以Variable的形式来进行初始化

nce_weights = tf.Variable(
  tf.truncated_normal([vocabulary_size, embedding_size],
                      stddev=1.0 / math.sqrt(embedding_size)))
nce_biases = tf.Variable(tf.zeros([vocabulary_size]))

其中,nce_weights是权重矩阵,nce_biases是偏置矩阵。truncated_normal函数的含义是输出在截断正态分布中的随机值填入vocabulary_size*embedding_size大小的矩阵中,且保证每个随机生成的值在合理的标准差范围之内。也就是说,truncated_normal函数能够保证权重随机生成为一个合理的数值。stddev参数的含义是定义该正态分布的标准差。tf.zeros函数是生成了一个vocabulary_size * 1大小的零矩阵。
 

The generated values follow a normal distribution with specified mean and standard deviation, except that values whose magnitude is more than 2 standard deviations from the mean are dropped and re-picked.

摘自:tf.truncated_normal in Tensorflow

这句话是truncated_normal函数的解释,想阐述的便是生成一个在两个标准差范围内的数据,当生成数据大于两个标准差时,便会被遗弃。

3.初始化输入数据容器和标签容器

因为word2vec本身算是一个有监督学习算法,所以使用数据时需要将输入数据和标签数据分开。

train_inputs = tf.placeholder(tf.int32, shape=[batch_size])
train_labels = tf.placeholder(tf.int32, shape=[batch_size, 1])

其中,tf.placeholder函数的含义是生成一个batch_size大小的numpy数组来处理后期将要放入的数据。batch_size是超参数,他对深度学习迭代求解的收敛速度和内存的消耗都存在影响。知乎上的大佬对batch_size大小对训练的影响有一个较为直观的理解和总结。相关链接:深度机器学习中的batch的大小对学习效果有何影响?
4.将训练数据的词向量嵌入到embedding矩阵中

embed = tf.nn.embedding_lookup(embeddings, train_inputs)

tf.nn.embedding_lookup函数的含义是查找train_inputs在embeddings中的位置,并且最后返回一个tensor形式的结果,也就是相当于将对应的输入词语或句子对应的词向量检索出来。

5.定义loss函数

loss = tf.reduce_mean(
  tf.nn.nce_loss(weights=nce_weights,
                 biases=nce_biases,
                 labels=train_labels,
                 inputs=embed,
                 num_sampled=num_sampled,
                 num_classes=vocabulary_size))

其中,tf.reduce_mean函数的含义是计算nce_loss函数得到的损失值的平均值。而nce_loss函数是tensorflow中常用的损失函数,可以将其理解为其将多元分类分类问题强制转化为了二元分类问题,也就能和上文提到的二元对数回归形成对应了。num_sampled参数代表将选取负例的个数。num_classes参数代表可能出现的类型个数这里我们就选择vocabulary_size个即可。

6.定义优化器(Optimizer)
 

optimizer = tf.train.GradientDescentOptimizer(learning_rate=1.0).minimize(loss)

此处,使用的是SGD随机梯度下降来进行参数权重的迭代更新。其中,learning_rate参数代表学习率。学习率也是模型中超参数之一,它代表的是每次梯度下降找到最优方向后,我们要向前的值的大小。如果把梯度下降理解为找最快的方式从山顶走到山底,梯度下降的求导计算,便是计算往哪个方向下山最快,而学习率就是每一步应该迈多远。过大的学习率会导致下降过程中错过最低点,过小的学习率则会在迭代下降的速度及其缓慢。

3.2 训练模型

使用for循环将符合train_inputs和train_labels的numpy数组输入到feed_dict中,即可开始训练。

for inputs, labels in generate_batch(...):
    feed_dict = {train_inputs: inputs, train_labels: labels}
    _, cur_loss = session.run([optimizer, loss], feed_dict=feed_dict)

完整代码可参考Tensorflow官方教程示例:tensorflow/examples/tutorials/word2vec/word2vec_basic.py

四、总结

word2vec是自然语言或者与自然语言有相似特性的数据的泛化处理方式,他能够将相似词汇进行联系。同时,它也是数据进入RNN或LSTM模型前的前置处理手段。在文中还有很多数学和理论方面的知识由于本人的掌握有限未能提及。若本文中出现理解错误或者笔误,烦请指正!

 

词袋模型

参见之前博客

  • 我们为了预测某个标题会得到多少个投票,那么首先需要将标题转换为数值表示。可以用词袋模型( bag of words model)来完成这个转换,词袋模型中将每个文本表示为一个数值型向量。看个例子:è¿éåå¾çæè¿°

 

分布式表示

将语言的潜在语法或语义特征分布式地存储在一组神经元中,用稠密、低维、连续的向量来表示。这里稠密是指向量不是由大量0或1组成。

简述常见的语言表示模型(词嵌入、句表示、篇章表示)

在cips2016出来之前,笔者也总结过种类繁多,类似词向量的内容,自然语言处理︱简述四大类文本分析中的“词向量”(文本词特征提取)事实证明,笔者当时所写的基本跟CIPS2016一章中总结的类似,当然由于入门较晚没有CIPS2016里面说法权威,于是把CIPS2016中的内容,做一个摘录。

CIPS2016 中文信息处理报告《第五章 语言表示与深度学习研究进展、现状及趋势》第三节 技术方法和研究现状中有一些关于语言表示模型划分的内容P33-P35,其中: 
这里写图片描述 
语言表示方法大体上可以从两个维度进行区分。一个维度是按不同粒度进行划分,语言具有一定的层次结构,语言表示可以分为字、词、句子、篇章等不同粒度的表示。另一个维度是按表示形式进行划分,可以分为离散表示和连续表示两类。离散表示是将语言看成离散的符号,而将语言表示为连续空间中的一个点,包括分布式表示和分散式表示。

CIPS2016 中文信息处理报告下载链接:http://cips-upload.bj.bcebos.com/cips2016.pdf 

一、离散表示

1、词向量

  • 一个词可以表示为One-Hot 向量(一维为1 其余维为0 
    的向量),也叫局部表示。离散表示的缺点是词与词之间没有距离的概念,这和事实不符。
  • 一种改进的方法是基于聚类的词表示。其中一个经典的方法是Brown 聚类算法,该算法是一种层次化的聚类算法。在得到层次化结构的词类簇之后,我们可以用根节点到词之间的路径来表示该词。

2、句向量

有了词的表示之后,我们可以进一步得到句子或篇章的表示。句子或篇章的离散表示通常采用词袋模型、N 元模型等。 


.


二、连续表示——分布式表示

这样就可以通过共现矩阵的方式来进行词的表示,这类方法也叫分布式表示(Distributional Representations)

1、词向量

潜在语义分析模型(Latent Semantic Analysis, LSA)、潜在狄利克雷分配模型(Latent Dirichlet Allocation,LDA)、随机索引(random indexing)等。

2、句向量

句子的表示方式对应于共现矩阵,另一列,在LDA中句子-词语矩阵中就是很好地句子表示方式。 


.


三、连续表示——分散式表示

另一种连续表示是分散式表示(Distributed Representations),即将语言表示为稠密、低维、连续的向量

1、词向量

研究者最早发现学习得到词嵌入之间存在类比关系。比如apple−apples ≈ car−cars, man−woman ≈ king – queen 等。这些方法都可以直接在大规模无标注语料上进行训练。词嵌入的质量也非常依赖于上下文窗口大小的选择。通常大的上下文窗口学到的词嵌入更反映主题信息,而小的上下文窗口学到的词嵌入更反映词的功能和上下文语义信息。

2、句向量

句子编码主要研究如何有效地从词嵌入通过不同方式的组合得到句子表示。其中,比较有代表性的方法有四种。

  • (1)神经词袋模型

简单对文本序列中每个词嵌入进行平均/加总,作为整个序列的表示。 
这种方法的缺点是丢失了词序信息。对于长文本,神经词袋模型比较有效。但是对于短文本,神经词袋模型很难捕获语义组合信息。

  • (2)递归神经网络(Recursive Neural Network)

按照一个给定的外部拓扑结构(比如成分句法树),不断递归得到整个序列的表示。递归神经网络的一个缺点是需要给定一个拓扑结构来确定词和词之间的依赖关系,因此限制其使用范围。

  • (3)循环神经网络(Recurrent Neural Network)

将文本序列看作时间序列,不断更新,最后得到整个序列的表示。

  • (4)卷积神经网络(Convolutional Neural Network)

通过多个卷积层和子采样层,最终得到一个固定长度的向量。

在上述四种基本方法的基础上,很多研究者综合这些方法的优点,结合具体的任务,已经提出了一些更复杂的组合模型,例如双向循环神经网络(Bi-directional Recurrent Neural Network)、长短时记忆模型(Long-Short Term Memory)等。 
同时根据上面的内容,句向量的表征在RNN、CNN之间,到底哪个更好呢? 有一篇文章在这点上讲得比较清楚,会在下面的延伸三:《NLP 模型到底选 RNN 还是 CNN?》提到。

3、篇章表示

如果处理的对象是比句子更长的文本序列(比如篇章),为了降低模型复杂度,一般采用层次化的方法,先得到句子编码,然后以句子编码为输入,进一步得到篇章的表示。具体的层次化可以采用以下几种方法:

  • (1)层次化的卷积神经网络

即用卷积神经网络对每个句子进行建模,然后以句子为单位再进行一次卷积和池化操作,得到篇章表示。

  • (2)层次化的循环神经网络

即用循环神经网络对每个句子进行建模,然后再用一个循环神经网络建模以句子为单位的序列,得到篇章表示。

  • (3)混合模型

先用循环神经网络对每个句子进行建模,然后以句子为单位再进行一次卷积和池化操作,得到篇章表示。在上述模型中,循环神经网络因为非常适合处理文本序列,因此被广泛应用在很多自然语言处理任务上。 


.


四、总结

基于深度学习的方法在自然语言处理中取得了很大的进展,因此,分散式表示也成为语言表示中最热门的方法,不但可以在特定的任务中端到端地学习字、词、句子、篇章的分散式表示,也可以通过大规模未标注文本自动学习。 
分散式表示可以非常方便地应用在下游的各种自然语言处理任务上,并且可以端到端地学习,给研究者带来了很大的便利。但是分散式表示对以下几种情况还不能很好地处理,需要进一步解决。

  1. 语言中出现所有符号是否都需要使用统一的表示模型?比如,无意义的符号、变量、数字等。
  2. 新词以及低频词的表示学习方法。目前的表示学习方法很难对这些词进行很好的建模,而这些词都是极具信息量的,不能简单忽略。
  3. 篇章的语言表示。目前对篇章级别的文本进行建模方法比较简单,不足以表示篇章中的复杂语义。
  4. 语言表示的基础数据结构。除了目前的基于向量的数据结构之外是否有更好的表示结构,比如矩阵、队列、栈等。

 

 

走进FastText

FastText的原理

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

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

具体的数学求解过程可参考博客: 
https://blog.csdn.net/yick_liao/article/details/62222153

第三部分:fastText的N-gram特征 
常用的特征是词袋模型(将输入数据转化为对应的Bow形式)。但词袋模型不能考虑词之间的顺序,因此 fastText 还加入了 N-gram 特征。 
“我 爱 她” 这句话中的词袋模型特征是 “我”,“爱”, “她”。这些特征和句子 “她 爱 我” 的特征是一样的。 
如果加入 2-Ngram,第一句话的特征还有 “我-爱” 和 “爱-她”,这两句话 “我 爱 她” 和 “她 爱 我” 就能区别开来了。当然,为了提高效率,我们需要过滤掉低频的 N-gram。 
在fastText 中一个低维度向量与每个单词都相关。隐藏表征在不同类别所有分类器中进行共享,使得文本信息在不同类别中能够共同使用。这类表征被称为词袋(bag of words)(此处忽视词序)。在 fastText中也使用向量表征单词 n-gram来将局部词序考虑在内,这对很多文本分类问题来说十分重要。 
举例来说:fastText能够学会“男孩”、“女孩”、“男人”、“女人”指代的是特定的性别,并且能够将这些数值存在相关文档中。然后,当某个程序在提出一个用户请求(假设是“我女友现在在儿?”),它能够马上在fastText生成的文档中进行查找并且理解用户想要问的是有关女性的问题。


4、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模型进行文本分类

利用fasttext训练分类器

# coding:utf-8
import fasttext

def train_ft(train_file):
    # fasttext模型的前缀名称,训练的的模型是 前缀+'.bin'
    ft_model_prefix = 'ft_model'
    ft_model = fasttext.supverised(train_file, ft_model_prefix,
                                   label_prefix='__label__')
    return ft_model

def test_ft(ft_model, texts):
    """
    testing fasttext models
    :param texts: list of str
    :return: list of labels
    """
    res= ft_model.predict(texts)
    pred_labels = [item[0] for item in res]
    res_prob = ft_model.predict(texts)
    # 取出概率最大的标签概率二元组
    pred_labels_probs = [item[0] for item in res_prob]
    return pred_labels

训练模型: 
训练模型过程中,输入的文件train_file,每一行是一个样本,其中前缀是’__label__’, 之后是文本的分词结果标签和文本用空格分开。示例train_file如下

__label__beauty 身高 170 + 女星 , 唐嫣 王鸥 古力娜扎 , 谁 街拍 最 有 范 郭碧婷   170 cm             王鸥   170 cm             古力娜扎   172 cm             胡杏儿   172 cm             唐嫣   170 cm             毛晓彤   171 cm            
__label__beauty 这样 的 足球宝贝 , 我 觉得 美女明星 都 要 自愧不如 了 , 美 的 怀疑 人生 这样 的 足球宝贝 , 我 觉得 美女明星 都 要 自愧不如 了 , 美 的 怀疑 人生            
__label__beauty 美女 摄影 : 白兔 美女主播 半仙 制服诱惑   被 封 宅男 杀手 
__label__beauty 美腿 蛮腰 的 性感美女 诱人 私房 照 美腿 蛮腰 的 性感美女 诱人 私房 照            
__label__beauty 这 性感 的 黑色 吊带 高跟鞋 , 美 的 不 像话 ! 这 性感 的 黑色 吊带 高跟鞋 , 美 的 不 像话 !            
__label__beauty 微风 下 的 清纯 小 女生   随风 飘逸 动感 微风 下 的 清纯 小 女生   随风 飘逸 动感            
__label__beauty 街拍 : 白色 碎花 短裙 长腿美女   往下 一看 我 发现 点 东西 ! 街拍 : 白色 碎花 短裙 长腿美女   往下 一看 我 发现 点 东西 ! 

测试模型: 
测试fasttext模型时,输入的是texts是列表类型,列表里的每个元素是切词好的文本,示例如下:

['美腿 蛮腰 的 性感美女 诱人 私房 照 美腿 蛮腰 的 性感美女 诱人 私房 照', '微风 下 的 清纯 小 女生   随风 飘逸 动感 微风 下 的 清纯 小 女生   随风 飘逸 动感', '街拍 : 白色 碎花 短裙 长腿美女   往下 一看 我 发现 点 东西 ! 街拍 : 白色 碎花 短裙 长腿美女   往下 一看 我 发现 点 东西 !']

关于fasttext的更多用法参考 
https://pypi.python.org/pypi/fasttext

 

 

1. https://blog.csdn.net/gdh756462786/article/details/79161525

2.https://blog.csdn.net/sinat_32404247/article/details/79975901 

3.https://blog.csdn.net/zhonglongshen/article/details/88390146

4. https://blog.csdn.net/datagrand/article/details/84378550

5. https://blog.csdn.net/qq_16633405/article/details/80578431

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值