在自然语言处理(NLP)领域,将文本数据转换为数值形式是至关重要的,因为计算机和机器学习模型只能处理数值数据。词嵌入是一种将单词表示为向量的有效方式,它为具有相似含义的单词提供相似的向量表示。本文将探讨FastText,这是一种提供字符n-gram嵌入的词嵌入技术,是word2vec模型的扩展。将学习FastText的工作原理以及如何在Gensim中训练模型,并简要介绍word2vec模型。
本文旨在提供词嵌入模型的概览,清晰解释FastText词嵌入技术,并提供一个训练FastText模型的演示。
词嵌入是一种将单词以向量形式表示的方法。它为具有相似含义的单词提供相似的向量表示,帮助模型捕捉单词的语言含义。例如,考虑四个单词:板球、足球、山脉和海洋。在这些单词中,板球和足球是相关的,海洋和山脉是相关的,因此相关单词被赋予相似的向量表示。图1.1显示了板球和足球被放在一起,山脉和海洋也被放在一起。这有助于学习单词的语义含义。
如果是NLP初学者,推荐以下关于嵌入的文章列表:
"从计数向量到Word2Vec的直观理解"
"Word2Vec用于词嵌入 - 初学者指南"
一些流行的词嵌入技术包括Word2Vec、GloVe、FastText和ELMo。Word2vec和GloVe嵌入在单词级别上工作,而FastText和ELMo在字符和子词级别上工作。本文将研究FastText词嵌入技术。
Word2Vec是一种将单词以向量形式表示的词嵌入技术。它接受整个语料库的单词,并在高维空间中为这些单词提供嵌入。Word2Vec模型还保持了单词的语义和句法关系。Word2Vec模型用于发现模型中单词之间的相关性。word2vec模型使用两种主要架构来计算向量:CBOW和Skip-gram。
CBOW方法中,给定上下文,预测目标词。如果给定一个句子并且缺少一个单词,模型必须预测缺失的单词。Skip-gram方法中,给定目标词,预测上下文词的概率。
像word2vec和GloVe这样的词嵌入技术为词汇表中的单词提供不同的向量表示。这导致了对语言内部结构的忽视。这对于形态丰富的语言来说是一个限制,因为它忽略了单词的句法关系。由于许多单词形态遵循形态丰富的语言中的规则,因此可以通过使用字符级信息来改进这些语言的向量表示。
为了改进形态丰富的语言的向量表示,FastText为字符n-gram提供嵌入,将单词表示为这些嵌入的平均值。它是word2vec模型的扩展。Word2Vec模型为单词提供嵌入,而FastText为字符n-gram提供嵌入。像word2vec模型一样,FastText使用CBOW和Skip-gram来计算向量。
FastText还可以处理词汇表外的单词,即FastText可以找到训练时不存在的单词嵌入。词汇表外的单词是在训练数据时不出现的单词,并且不在模型的词汇表中。像word2vec或GloVe这样的词嵌入模型不能为词汇表外的单词提供嵌入,因为它们为单词提供嵌入,因此如果出现新单词,它们不能提供嵌入。
由于FastText为字符n-gram提供嵌入,它可以为词汇表外的单词提供嵌入。如果出现词汇表外的单词,那么FastText通过嵌入其字符n-gram来提供该单词的嵌入。
在FastText中,每个单词被表示为其字符n-gram的向量表示的平均值以及单词本身。考虑单词“equal”和n=3,那么单词将由字符n-gram表示:< eq, equ, qua, ual, al >
和 < equal >
。因此,单词‘equal’的词嵌入可以被给定为其所有字符n-gram和单词本身的所有向量表示的总和。
连续词袋(CBOW):在连续词袋(CBOW)中,取目标词的上下文作为输入,并预测上下文中出现的词。例如,在句子“想学习FastText。”中,单词“”、“想”、“学习”和“FastText”被作为输入,模型预测“学习”作为输出。所有输入和输出数据都在同一维度上,并且具有独热编码。它使用神经网络进行训练。神经网络有一个输入层、一个隐藏层和一个输出层。图1.2显示了CBOW的工作方式。
Skip-gram:Skip-gram的工作方式类似于CBOW,但输入是目标词,模型预测给定词的上下文。它也使用神经网络进行训练。图1.3显示了Skip-gram的工作方式。
FastText可以被视为word2vec的扩展。word2vec和fastText之间的一些显著差异如下:Word2Vec在单词级别上工作,而fastText在字符n-gram上工作。Word2Vec不能为词汇表外的单词提供嵌入,而FastText可以为OOV单词提供嵌入。FastText可以为形态丰富的语言提供比word2vec更好的嵌入。FastText使用层次分类器训练模型,因此它比word2vec更快。
本节解释了如何训练FastText模型。FastText模型在Gensim下可用,Gensim是一个Python库,用于主题建模、文档索引和大型语料库的相似性检索。本文中使用的数据集来自Kaggle的“Covid-19数据集上的词嵌入分析”。可以使用的数据集可以在这里访问。
第一步是导入必要的库并读取数据集,from gensim.models.phrases import Phrases, Phraser
fromgensim.models import FastText
import pandas as pd
df = pd.read_csv('medical_dataset.csv')
print(df.head())
。
为了从数据集中提取熟悉的短语和最有意义的n-gram,使用Gensim中的Phrases模型。sent = [row.split() for row in df['Text']]
phrases = Phrases(sent, min_count = 30, progress_per = 10000)
sentences = phrases[sent]
。
接下来是模型初始化和为模型构建词汇表。fastText模型的超参数如下,window: window size for the character n-grams that are to be considered before and after the target word
min_count: minimal number of word occurrences
min_n: minimum length of character n-gram
max_n: maximum length of character n-gram
。
#Initializing the model
model = FastText(size = 100, window = 5, min_count = 5, workers = 4, min_n = 1, max_n = 4)
#Building Vocabulary
model.build_vocab(sentences)
print(len(model.wv.vocab.keys()))
。