使用word2vec嵌入句子

如何解决使用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_Atravel_sent_B等的另一种可能方法是完全忽略traveltravel_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提供)将最适合您的需求。

一旦获得句子的矢量表示,您可以采用两种方式:

  1. 创建成对比较的矩阵并将其可视化为热图。当您对句子的接近程度有一些先验知识并且想要检查假设时,此表示很有用。您甚至可以try it onlineenter image description here
  2. 在矢量表示上运行t-SNE。这将创建句子的2D投影,从而保留句子之间的相对距离。它提供的数据比PCA更好。比您可以轻松找到该句子的邻居: enter image description here

您可以从thisthis了解更多信息

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-