如何解决使用word2vec嵌入句子
我想比较不同句子中提到的同一单词之间的差异,例如“旅行”。 我想做的是:
- 以纯文本形式提及“旅行”一词的句子;
- 在每个句子中,将travel替换为travel_sent_x。
- 在这些句子上训练word2vec模型。
- 计算travel_sent1,travel_sent2和其他重新标记的“ travel”提及之间的距离 因此,每个句子的“旅行”都有自己的向量,用于比较。
我知道word2vec不仅需要几个句子来训练可靠的向量。官方页面推荐了包含数十亿个单词的数据集,但我的数据集中没有这样的数字(我有成千上万个单词)。
我试图用以下几句话来测试模型:
Sentences
Hawaii makes a move to boost domestic travel and support local tourism
Honolulu makes a move to boost travel and support local tourism
Hawaii wants tourists to return so much it's offering to pay for half of their travel expenses
我构建向量的方法是:
from gensim.models import Word2Vec
vocab = df['Sentences']))
model = Word2Vec(sentences=vocab,size=100,window=10,min_count=3,workers=4,sg=0)
df['Sentences'].apply(model.vectorize)
但是,我不知道如何可视化结果以查看它们的相似性并获得一些有用的见解。 任何帮助和建议都将受到欢迎。
更新:我将使用主成分分析算法来可视化3维空间中的嵌入。我知道每个单词的用法,但不知道句子的用法。
解决方法
请注意,word2vec本质上不是建模句子的方法,而仅是单词的建模方法。因此,没有使用word2vec表示句子的官方方法。
一次快速而粗略的方法是通过将所有单词向量平均在一起来为句子(或其他多单词文本)创建向量。它速度快,比没有优势好,并且在某些简单的(广泛主题)任务上还可以-但并不能很好地捕捉文本的全部含义,尤其是依赖于语法,一词多义,或复杂的上下文提示。
仍然,您可以使用它为每个短文本获取固定大小的向量,并计算这些向量之间的成对相似度/距离,并将结果输入降维算法以进行可视化或其他用途。
其他算法实际上为更长的文本创建矢量。与word2vec密切相关的浅层算法是“段落向量”,在Gensim中可以作为Doc2Vec
类使用。但是它仍然不是很复杂,也没有语法意识。许多更深层的网络文本模型,例如BERT,ELMo和其他模型,都是可能的。
Word2vec和相关算法非常耗数据:它们的所有有益特性来自同一单词的许多不同用法示例之间的拔河比赛。因此,如果您有一个玩具大小的数据集,则不会获得具有有用相互关系的一组向量。
但是,大型数据集中的稀有单词也不会获得良好的向量。在训练中,通常会丢弃出现在某个min_count
频率以下的单词,就好像它们甚至不在那里一样-因为从一种或几种特有的样本用法来看,它们的向量不仅很差,而且因为总共有很多这样的代表性不足的单词,将它们保留在周围还会使 other 的单词向量也变糟。他们是噪音。
因此,您建议的采用travel
的个实例并将其替换为单一外观标记的想法很可能会产生有趣的结果。将min_count
降低到1将为您提供每个变体的向量-但与其他词向量相比,它们的质量((随机性更高))要差得多,与其他词相比,它们受到的培训关注较少,并且每个变量都只受其周围的几个单词的影响(而不是周围所有上下文的全部范围,都可以帮助实现统一的travel
令牌的有用定位)。
(您也许可以通过(1)保留句子的原始版本来稍微弥补这些问题,因此您仍然可以获得travel
向量;(2)重复几次您的标记错误的句子时间,并改编它们出现在整个语料库中,以某种方式模拟您的合成上下文的更多真实出现。但是如果没有真正的多样性,此类单上下文向量的大多数问题将仍然存在。)
比较travel_sent_A
,travel_sent_B
等的另一种可能方法是完全忽略travel
或travel_sent_X
的确切向量,而是为单词周围的N个单词。例如,如果您有100个单词travel
的示例,则创建100个向量,这些向量分别是N个单词 around 的行进路径。这些向量可能显示出一些模糊的簇/邻域,尤其是在单词的交替含义非常不同的情况下。 (一些使word2vec适应多义性的研究使用这种context vector
方法来影响/选择其他词义。)
您可能还会发现这项关于对单词建模的研究是有趣的:Linear algebraic structure of word meanings
在某种程度上,您只有简短的标题文本,并且只有单词向量(没有数据或算法来进行更深入的建模),您可能还希望研究“单词移动器的距离”计算以比较文本。与其将单个文本简化为单个矢量,不如将其建模为“单词矢量包”。然后,它将距离定义为一个袋子到另一个袋子的转换成本。 (更多相似的单词比相似程度较低的单词更容易相互转化,因此非常相似的表达式(仅替换了几个同义词)报告的非常接近。)
要计算较长的文本可能会非常昂贵,但对于短短语和少量标题/推文/等可能效果很好。它在Gensim KeyedVector
类中以wmdistance()
的形式提供。本文中有一个可能有用的相关示例:Navigating themes in restaurant reviews with Word Mover’s Distance
有趣的是word2vec模型,您可以使用向量的T-SNE嵌入并将维数减小为3,并使用任何绘图库(例如matplotlib或破折号)将其可视化。我还发现此工具在可视化单词嵌入时很有用:https://projector.tensorflow.org/
在不同上下文中为单词学习不同单词嵌入的想法是ELMO(https://allennlp.org/elmo)的前提,但是您将需要大量的培训才能对其进行训练。幸运的是,如果您的应用程序不是很特定,则可以使用预先训练的模型。
,如果您对比较句子感兴趣,则Word2Vec不是最佳选择。结果表明,使用它创建句子嵌入比使用专用的句子嵌入算法产生的效果差。如果数据集不大,则无法使用自己的数据创建(训练新的)嵌入空间。这迫使您对句子使用经过预训练的嵌入。幸运的是,如今有足够的这些了。我相信通用句子编码器(由Google提供)将最适合您的需求。
一旦获得句子的矢量表示,您可以采用两种方式:
- 创建成对比较的矩阵并将其可视化为热图。当您对句子的接近程度有一些先验知识并且想要检查假设时,此表示很有用。您甚至可以try it online。
- 在矢量表示上运行t-SNE。这将创建句子的2D投影,从而保留句子之间的相对距离。它提供的数据比PCA更好。比您可以轻松找到该句子的邻居:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。