Keras深度学习实战——使用fastText模型构建单词向量
Posted 盼小辉丶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Keras深度学习实战——使用fastText模型构建单词向量相关的知识,希望对你有一定的参考价值。
Keras深度学习实战——使用fastText模型构建单词向量
0. 前言
fastText
是另一种用于生成单词向量的神经网络模型,其将每个单词视为最小单位,学习其向量表示形式,用于解决由于单词的不同时态和形式造成无法准确获取其向量的问题。本节中,我们将介绍 fastText
算法模型的基本原理,然后使用第三方库 gensim
库中构建 fastText
模型生成单词向量,并测试使用 fastText
模型得到的单词向量效果。
1. fastText 算法模型
fastText
是 Facebook
研究团队提出的算法模型,用于有效学习单词表示和句子分类。fastText
与 word2vec
的不同之处在于 word2vec
将每个单词视为最小单位,学习其向量表示形式,但是 fastText
假定一个单词由 n-gram
组成。例如,sunny
由 [sun, sunn, sunny]
,[sunny, unny, nny]
等组成,在其中我们看到了大小为 n
的原始单词的子集,其中 n
的范围可以从 1
到原始单词的长度。
使用 fastText
的另一个原因是,其可以解决单词不符合 skip-gram
或 CBOW
模型中的最小频率截止值的情况。例如,appended
一词与 append
本质上具有相同的意义。但是,如果 append
频率较高,但在新句子中使用了 append
这个单词而不是 append
,那么我们就无法获取准确的 appended
向量。在这种情况下,fastText
的 n-gram
就会派上用场了。
实际上,fastText
后续同样使用 skip-gram/CBOW
模型,但是,它增加了输入数据集,因此可以将没有见过的单词也考虑在内。
2. 模型与数据集分析
2.1 fastText 模型分析
我们基于 fastText
提取单词向量的策略如下:
- 在
gensim
库中使用fastText
方法 - 预处理输入数据
- 将每个输入句子分解单词列表
- 根据上一步得到的分解结果构建词汇表
- 使用先前的输入数据训练模型
- 计算单词之间的相似度
2.2 数据集分析
接下来,我们实现 fastText
模型生成单词向量,所用的数据集与在《从零开始构建单词向量》一节中使用的数据集相同,即航空公司 Twitter
数据集。
3. 使用 Keras 实现 fastText 生成单词向量
本节中,我们利用 Keras
实现使用 fastText
生成单词向量。
(1) 首先,导入相关包,并加载数据集:
from gensim.models.fasttext import FastText
import pandas as pd
data = pd.read_csv('archive/Tweets.csv')
print(data.head())
(2) 预处理数据集并将其转换为列表,其中每个元素是每个句子中的列表,此过程与我们在 word2vec 模型中所进行的预处理和转换步骤相同:
stop = set(stopwords.words('english'))
def preprocess(text):
text=text.lower()
text=re.sub('[^0-9a-zA-Z]+',' ',text)
words = text.split()
words2 = [i for i in words if i not in stop]
words3=' '.join(words2)
return(words3)
data['text'] = data['text'].apply(preprocess)
list_words=[]
for i in range(len(data)):
list_words.append(data['text'][i].split())
(3) 定义模型,使用参数 vector_size
指定每个单词的向量维度,并构建词汇表:
ft_model = FastText(vector_size=50)
ft_model.build_vocab(list_words)
(4) 训练模型:
ft_model.train(list_words, total_examples=ft_model.corpus_count,epochs=100)
(5) 检查模型词汇表中不存在的单词的单词向量。例如,词汇中出现了单词 first
;但是,词汇中没有 firstly
这个词,在这种情况下,我们检查 first
和 firstly
的词向量之间的相似性:
print(ft_model.wv.similarity('first','firstly'))
计算的输出结果为 0.90
,表明两个单词之间的相似度非常高:
0.90227515
因此,我们可以看到 fastText
模型得到的单词向量可以帮助我们为词汇表中不存在的单词生成单词向量。
(6) 我们也可以使用该方法也来纠正数据集内的拼写错误,因为拼写错误的单词很可能很少出现,而出现频率较高的最相似的单词更可能是拼写错误单词的正确版本。因此,我们可以使用向量算法执行拼写校正:
result = ft_model.wv.most_similar(positive=['exprience', 'prmise'], negative=['experience'], topn=1)
print(result)
在前面的代码中,positive
中有单词拼写错误,而 negative
中没有拼写错误,代码的输出是 promise
。因此,可以使用此方式纠正拼写错误:
[('promise', 0.6496826410293579)]
此外,还可以使用 most_similar
方法达到相同的效果:
print(ft_model.wv.most_similar('exprience', topn=1))
# [('experience',0.9027844071388245)]
但是,需要注意的是,当数据集中拼写错误频率较高时,该方法并不能得到预期结果。
相关链接
Keras深度学习实战(1)——神经网络基础与模型训练过程详解
Keras深度学习实战(2)——使用Keras构建神经网络
Keras深度学习实战(7)——卷积神经网络详解与实现
Keras深度学习实战(24)——从零开始构建单词向量
Keras深度学习实战(25)——使用skip-gram和CBOW模型构建单词向量
Keras深度学习实战(26)——文档向量详解
以上是关于Keras深度学习实战——使用fastText模型构建单词向量的主要内容,如果未能解决你的问题,请参考以下文章