3 python embedding gensim word2vec
我想比较不同句子中提到的相同单词的差异,例如“旅行”。我想做的是:
我知道 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
Run Code Online (Sandbox Code Playgroud)
我构建向量的方法是:
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)
Run Code Online (Sandbox Code Playgroud)
然而,我不知道如何可视化结果以查看它们的相似性并获得一些有用的见解。欢迎任何帮助和建议。
更新:我将使用主成分分析算法来可视化 3 维空间中的嵌入。我知道如何处理每个单词,但我不知道如何处理句子。
请注意,word2vec 本质上并不是一种对句子进行建模的方法,而只是对单词进行建模。因此,没有单一的官方方法来使用 word2vec 来表示句子。
\n一次快速而粗略的方法是通过对所有词向量进行平均来为句子(或其他多词文本)创建一个向量。它速度快,聊胜于无,并且可以完成一些简单(广泛主题)的任务,但不能很好地捕捉文本的全部含义,尤其是任何需要理解的含义。依赖于语法、一词多义或复杂的上下文提示。
\n尽管如此,您仍然可以使用它来获取每个短文本的固定大小的向量,并计算这些向量之间的成对相似度/距离,并将结果输入到降维算法中以用于可视化或其他目的。
\n其他算法实际上为较长的文本创建向量。与 word2vec 密切相关的浅层算法是“段落向量”,在 Gensim 中作为类提供Doc2Vec。但它仍然不是很复杂,并且仍然不具备语法意识。许多更深层次的网络文本模型(例如 BERT、ELMo 等)可能是可行的。
Word2vec 及相关算法非常需要数据:它们的所有有益品质都源于同一个单词的许多不同用法示例之间的拉锯战。因此,如果您有一个玩具大小的数据集,您将不会获得一组具有有用相互关系的向量。
\n而且,较大数据集中的稀有单词不会获得良好的向量。在训练中,通常会丢弃出现频率低于某个min_count频率的单词,就好像它们根本不存在一样——因为它们的向量不仅会因为一个或几个特殊样本的使用而变得很差,而且因为有很多这样的单词。总体而言,代表性不足的单词,保留它们往往也会使其他单词向量变得更糟。它们是噪音。
因此,您提出的采用单个实例travel并用单一外观标记替换它们的想法很可能会产生有趣的结果。将您的值降低min_count到 1 将为您提供每个变体的向量 - 但它们的质量会比其他单词向量差得多(并且更加随机),与其他单词相比,它们受到的训练关注相对较少,并且每个都完全仅受其周围几个单词的影响(而不是受所有周围上下文的整个范围的影响,这些上下文都有助于统一令牌的有用定位travel)。
(你也许可以通过以下方式稍微抵消这些问题:(1)保留句子的原始版本,这样你仍然得到一个向量travel;(2)多次重复你的标记损坏的句子,并将它们打乱以出现在整个句子中语料库,以在某种程度上模拟合成上下文的更真实的情况。但是如果没有真正的多样性,此类单上下文向量的大多数问题将仍然存在。)
比较travel_sent_A、travel_sent_B等的另一种可能方法是完全忽略travel或 的精确向量travel_sent_X,而是为该单词周围的 N 个单词编译一个摘要向量。例如,如果您有 100 个单词 的示例travel,请创建 100 个向量,其中每个向量都是与 Travel相关的N 个单词。这些向量可能会显示一些模糊的簇/邻域,特别是在单词具有非常不同的替代含义的情况下。(一些研究采用 word2vec 来解释一词多义,使用这种context vector方法来影响/选择替代词义。)
您可能还会发现这项关于将单词建模为从话语的替代“原子”中提取的研究很有趣:单词含义的线性代数结构
\n如果您有类似标题的短文本,并且只有词向量(没有进行更深入建模的数据或算法),您可能还需要研究“词移动器距离”计算来比较文本。它不是将单个文本简化为单个向量,而是将其建模为“词向量包”。然后,它将距离定义为将一个包转换为另一个包的成本。(更多相似的单词比不太相似的单词更容易相互转换,因此非常相似的表达,仅替换了几个同义词,报告为非常接近。)
\n计算较长的文本可能会非常昂贵,但对于短语和小标题/推文/等可能效果很好。它在 GensimKeyedVector类中以wmdistance(). 本文中的一个相关性类型的示例可能对发现有用:使用 Word Mover\xe2\x80\x99s Distance 导航餐厅评论中的主题