[英]Convert list of words in Text file to Word Vectors
我有一个包含数百万行的文本文件,我想将其转换为单词向量,以后我可以将这些向量与搜索关键字进行比较,然后查看哪些文本更接近搜索关键字。
我的困境是,我为Word2vec看到的所有培训文件都是段落形式的,因此每个单词在该文件中都有一定的上下文含义。 现在,我的文件在这里是独立的,并且每行包含不同的关键字。
我的问题是是否可以使用此文本文件创建单词嵌入,如果不能,那么在这百万个文本中搜索匹配的搜索关键字的最佳方法是什么
**我的文件结构:**
Walmart
Home Depot
Home Depot
Sears
Walmart
Sams Club
GreenMile
Walgreen
预期
search Text : 'WAL'
我的文件的结果:
WALGREEN
WALMART
WALMART
让我们退后一步,了解什么是word2vec。 Word2vec(如Glove,FastText等)是一种将单词表示为矢量的方法。 ML模型不理解单词,它们仅理解数字,因此当我们处理单词时,我们希望将它们转换为数字(向量)。 一键式编码是将字词编码为矢量的一种幼稚方式。 但是对于大词汇量,单热编码变得太长。 在单热编码词之间也没有语义关系。
DL带来了单词的分布式表示(称为单词嵌入)。 这些单词嵌入的一个重要特性是,与不相关单词之间的距离相比,相关单词之间的向量距离较小。 即distance(apple,orange) < distance(apple,cat)
那么如何训练这些嵌入模型? 嵌入模型是在(非常)巨大的文本语料库上训练的。 当您拥有大量的文本集时,模型将了解到(在许多情况下)在同一上下文中使用了苹果(橙色)。 它将了解到苹果和橙子是相关的。 因此,要训练一个好的嵌入模型,您需要庞大的文本语料库(不是独立的词,因为独立的词没有上下文)。
但是,很少有人会从头开始训练单词嵌入模型,因为开放源代码中提供了很好的嵌入模型。 但是,如果您的文本是特定领域的(例如医学),那么您将对公开可用的词嵌入进行迁移学习。
像word2vec和Glove这样的词嵌入无法返回OOV词的嵌入。 但是,像FastText这样的嵌入(感谢@gojom指出)可以通过将OOV单词分解为n个字符组成的字符来处理OOV单词,并通过汇总构成单词的子单词矢量来构建矢量。
遇到您的问题,
情况1:假设用户输入单词WAL
,首先它不是一个有效的英语单词,因此该单词不会出现在词汇表中,因此很难介意它的含义。 像FastText这样的嵌入通过将它们分解为n-gram来处理它们。 这种方法可以很好地嵌入拼写错误的单词或语。
情况2:假设用户输入了一个单词WALL
并且如果您打算类似地使用vector来查找最接近的单词,则它永远不会接近Walmart
因为在语义上它们是不相关的。 它宁可接近window, paint, door
。
如果您搜索的是语义相似的单词,那么使用向量嵌入的解决方案将是不错的选择。 另一方面,如果您的搜索基于词典,则矢量嵌入将无济于事。
如果您想从wal
类的片段中找到walmart
,则更可能使用以下方法:
就是说,从您的示例所需输出中,即使某些算法(如FastText)将能够基于单词片段与经过训练的单词的重叠来为单词片段提供粗糙的矢量,但这并不是单词矢量的真正工作。
实际上,如果您想查找类似的存储,则字向量在理论上可能很有用。 但是在示例输入中给出的问题是,这样的词向量算法需要上下文中使用的标记示例,这些标记来自以自然语言相似关系共存的标记序列。 而且,您需要大量具有各种上下文相关示例的数据,以捕获相互关系的细微层次。
虽然您现有的短实体名称(存储)的单列不能提供此功能,但如果您拥有更丰富的数据源,也许您可以在其他地方使用一些适用的名称。 一些想法可能是:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.