python - 使用 word2vec 嵌入句子
问题描述
我想比较不同句子中提到的同一个词之间的差异,例如“旅行”。我想做的是:
- 将提到“旅行”一词的句子作为纯文本;
- 在每个句子中,将“travel”替换为 travel_sent_x。
- 在这些句子上训练一个 word2vec 模型。
- 计算 travel_sent1、travel_sent2 和其他重新标记的提及“travel”之间的距离所以每个句子的“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
——因为它们的向量不仅会很差,仅来自一个或几个特殊的样本使用,而且因为有很多这样的代表性不足总的来说,保留它们也会使其他词向量变得更糟。他们是噪音。
因此,您提出的采用单个实例travel
并用单一外观标记替换它们的想法很可能会产生有趣的结果。将你的值降低min_count
到 1 可以获得每个变体的向量——但它们的质量会比你的其他词向量差得多(而且更随机),与其他词相比,它们受到的训练关注相对较少,并且每个词都受到了充分的影响仅通过它们周围的几个词(而不是所有周围上下文的整个范围都有助于有助于统一travel
标记的有用定位)。
(您可以通过以下方式稍微抵消这些问题:(1)保留句子的原始版本,因此您仍然可以获得一个travel
向量;(2)多次重复您的标记损坏的句子,并将它们改组以出现在整个语料库,以在某种程度上模拟合成上下文的更多真实事件。但如果没有真正的多样性,这种单一上下文向量的大部分问题将仍然存在。)
比较travel_sent_A
,等的另一种可能方法是忽略或完全travel_sent_B
忽略确切向量,而是为单词周围的 N 个单词编译一个摘要向量。例如,如果您有 100 个单词的示例,请创建 100 个向量,它们分别是关于travel 的 N 个单词。这些向量可能会显示一些模糊的集群/邻域,尤其是在具有非常不同的替代含义的单词的情况下。(一些采用 word2vec 来解释多义的研究使用这种方法来影响/选择替代词义。)travel
travel_sent_X
travel
context vector
您可能还会发现这项关于将单词建模为从话语的替代“原子”中绘制的研究很有趣:单词含义的线性代数结构
如果您有类似标题的短文本,并且只有词向量(没有数据或算法来进行更深入的建模),您可能还想查看“Word Mover's Distance”计算来比较文本。它不是将单个文本简化为单个向量,而是将其建模为“词向量包”。然后,它将距离定义为将一个包转换为另一个包的成本。(更相似的词比不太相似的词更容易相互转换,因此非常相似的表达,仅替换了几个同义词,报告为非常接近。)
计算较长的文本可能会非常昂贵,但对于简短的短语和少量的标题/推文/等可能效果很好。它在 GensimKeyedVector
类中作为wmdistance()
. 这篇文章可能有助于发现相关性类型的一个示例:使用 Word Mover 的距离导航餐厅评论中的主题
推荐阅读
- r - R 和 RStudio 未检测到已安装的 PostgreSQL(或任何其他)ODBC 驱动程序
- php - 上传文件php时返回false
- mysql - 使用日期和状态字段的mysql订购问题
- android - 可以在样式中完全限定可声明样式的属性(以避免命名冲突)吗?
- sql-server - 带有 CASE & NOT IN 条件的 SQL Where 子句
- django - Django 验证包含在基本模板中的(通讯)表单
- python - 生成给定点 10 公里内的纬度/经度列表
- javascript - 具有_任何可能的属性_的无限深度对象定义为既是又返回另一个无限深度对象的函数。JS
- javascript - 计算传感器未确定长度的运行平均值
- r - 使用 RAdwords 库连接并使用 doAuth 会出错