在自然语言处理(NLP)领域,词嵌入是一种将词语转换为高维空间中的实数向量的技术。这种方法能够捕捉词语之间的语义和句法相似性,使得NLP模型能够更好地理解文本中词语的上下文和含义。词嵌入通常是通过无监督学习技术,如神经网络,从大量文本语料库中学习得到的,其中具有相似含义的词语被映射到嵌入空间中的相近点。这使得算法能够更有效地处理和理解语言,从而实现情感分析、机器翻译和命名实体识别等任务。流行的词嵌入技术包括Word2Vec、GloVe和FastText。
以下是词嵌入的五种简单应用方式:
理解相似词义:它们帮助计算机识别出意义相似的词语。
文本排序:它们使计算机能够更容易地组织和分类不同类型的文本。
识别人名和地点:词嵌入帮助计算机在文本中找到人名、组织名或地名。
语言翻译:它们协助将一种语言的词语更准确地翻译成另一种语言。
回答问题:它们帮助系统通过理解问题和文档中词语的含义来找到相关答案。
这是一种现代的自然语言处理方法。算法如word2vec和GloVe是利用神经网络算法开发的。词嵌入算法提供了词语的密集向量表示,能够理解词语的含义。这些算法通过词语的使用关联来学习词语。由嵌入算法提供的每个词语的向量空间表示,给出了一个投影,其中具有相似含义的词语在空间中被局部聚集。
Gensim是一个免费的Python库,旨在尽可能高效(计算机方面)和无痛(人类方面)地从文档中自动提取语义主题。Gensim库由捷克数字NLP(自然语言处理)科学家Radim Řehůřek及其公司RaRe Technologies开发和维护。Gensim旨在处理原始的、非结构化的数字文本(“纯文本”)。
Gensim库包括以下并行化的流式实现:
fastText: 这个特性使用神经网络进行词嵌入,也是一个用于学习词嵌入和文本分类的库。该库由Facebook AI Research实验室(FAIR)开发。基本上,这个模型允许创建或开发监督或非监督算法以获得词语的向量表示。
word2vec: Word2vec用于创建词嵌入,也是一个由浅层和两层神经网络模型组成的群体。这些模型通常被训练以重建词语的语义上下文。
doc2vec算法: Doc2Vec模型与Word2Vec模型相反,用于开发一组词语作为单个单位的向量化表示。它不简单地给出句子中词语的平均值。
潜在语义分析(LSA, LSI, SVD): 它也是NLP(自然语言处理)中的技术,允许通过构建与文档和术语相关的概念集来分析文档集和术语之间的关系。
潜在狄利克雷分配(LDA): 它是NLP(自然语言处理)中的技术,允许通过未观察到的“组”来解释一组观察结果。这些未观察到的组向解释数据的某些部分为何相似。因此,它是一个生成性统计模型。
TF-IDF: 词频-逆文档频率是信息更新中的一个数值统计,反映了一个词对文档在语料库中的重要性。它经常被搜索引擎用来根据用户查询评分和排名文档的相关性。它也用于文本摘要和分类中的停用词提炼。
随机投影。
Word2vec是用于开发词嵌入的模型群体。Word2vec模型通常是浅层的,两层神经网络,被训练以重建词语的语义上下文。Word2vec由Google的一组研究人员在Tomas Mikolov的领导下创建并获得专利。可以使用的主要算法有CBOW(Continuous Bag of Words)和Skip-Grams。将使用预训练的算法。Gensim提供了Word2Vec类,用于处理Word2Vec模型。
GloVe(Global Vectors for Word Representation)是开发词嵌入的另一种方法。它完全基于“词-上下文矩阵”的矩阵分解技术。通常,可以以以下方式扫描语料库:对于每个术语,在术语之前和之后定义的窗口大小内寻找上下文术语。因此,给予更远距离的词语更少的权重。
现在,将导入word2Vec库,这是一个算法,用于从给定文本中学习词关联。这里定义了数据。
from gensim.models import Word2Vec
import numpy as np
sentences = [['drink','not','good'],
['felt','superb'],
['just','good','ambience'],
['bad','taste'],
['parking','problem'],
['fantastic','food']]
y = np.array([0,1,1,0,0,1])
让用给定的数据训练模型。同时,看看模型的摘要。
model =Word2Vec(sentences, min_count=1,size=100)
print(model)
现在有了词汇表,所以以列表的形式总结它。
words = list(model.wv.vocab)
print(words)
让从word2Vec模型中访问一个词的向量。
print(model['drink'])
print(model['fantastic'])
对于第一条评论,将找出嵌入的平均值。然后对于每个数据,将找到平均值。
means_0 = np.mean(model[sentences[0]],axis=0)
means = []
for i in sentences :
row_means = np.mean(model[i],axis=0)
means.append(row_means)
means = np.array(means)
X = means
让导入一个随机森林分类器,并相应地拟合模型。
from sklearn.ensemble import RandomForestClassifier
model_rf = RandomForestClassifier(random_state=1211,
n_estimators=100,oob_score=True)
model_rf.fit( X , y )
测试句子。
test_sentences = [['bad','food'],['just','fantastic']]
test_means = []
for i in test_sentences :
row_means = np.mean(model[i],axis=0)
test_means.append(row_means)
num_test_means = np.array(test_means)
X_test = num_test_means
y_pred = model_rf.predict(X_test)
现在保存word2vec模型。
model.save('model.bin')
new_model = Word2Vec.load('model.bin')
print(new_model)
from sklearn.decomposition import PCA
from matplotlib import pyplot
X = model[model.wv.vocab]
pca = PCA(n_components=2)
result = pca.fit_transform(X)
pyplot.scatter(result[:, 0], result[:, 1])
vwords = list(model.wv.vocab)
for j, word in enumerate(vwords):
pyplot.annotate(word, xy=(result[j, 0], result[j, 1]))
pyplot.show()