将文本文件中的单词列表转换为单词向量

时间:2019-03-25 17:49:12

标签: python machine-learning nlp gensim word2vec

我有一个文本文件,它具有数百万行,我想将其转换为单词向量,以后我可以将这些向量与搜索关键字进行比较,看看哪些文本更接近搜索关键字。

我的困境是,我为Word2vec看到的所有培训文件都是段落形式的,因此每个单词在该文件中都有一定的上下文含义。现在我的文件是独立的,每行包含不同的关键字。

我的问题是是否可以使用此文本文件创建单词嵌入,如果不能,那么在这百万个文本中搜索匹配的搜索关键字的最佳方法是什么

**我的文件结构:**

Walmart
Home Depot
Home Depot
Sears
Walmart
Sams Club
GreenMile
Walgreen

期望

search Text : 'WAL'

“我的文件”结果:

WALGREEN
WALMART
WALMART

2 个答案:

答案 0 :(得分:3)

嵌入

让我们退后一步,了解什么是word2vec。 Word2vec(如Glove,FastText等)是一种将单词表示为矢量的方法。 ML模型不理解单词,它们仅理解数字,因此当我们处理单词时,我们希望将它们转换为数字(向量)。一键式编码是将字词编码为矢量的一种幼稚方式。但是对于大词汇量,单热编码变得太长。在单热编码词之间也没有语义关系。

借助DL,出现了单词的分布式表示形式(称为单词嵌入)。这些单词嵌入的一个重要特性是,与不相关单词之间的距离相比,相关单词之间的向量距离较小。即distance(apple,orange) < distance(apple,cat)

那么如何训练这些嵌入模型?嵌入模型是在(非常)巨大的文本语料库上训练的。当您拥有大量的文本集时,模型将了解到(在许多情况下)在同一上下文中使用了苹果(橙色)。它将了解到苹果和橙子是相关的。因此,要训练一个好的嵌入模型,您需要庞大的文本语料库(不是独立的词,因为独立的词没有上下文)。

但是,很少有人从头开始训练单词嵌入模型,因为开放源代码中提供了很好的嵌入模型。但是,如果您的文本是特定领域的(例如医学),那么您将对公开可用的词嵌入进行迁移学习。

单字(OOV)单词

像word2vec和Glove这样的词嵌入无法返回OOV词的嵌入。但是,像FastText这样的嵌入(感谢@gojom指出了这一点)可以通过将OOV单词分解为n个字符组成的字符来处理OOV单词,并通过汇总构成单词的子单词矢量来构建矢量。

问题

遇到问题

案例1:可以说,用户输入了一个单词WAL,首先它不是一个有效的英语单词,因此它不会出现在词汇表中,因此很难介意表示完整的向量。像FastText这样的嵌入通过将它们分解为n-gram来处理它们。这种方法可以很好地嵌入拼写错误的单词或语。

案例2:假设用户输入了一个单词WALL,并且如果您打算类似地使用vector来查找最接近的单词,则从语义上讲,它永远不会接近Walmart他们没有关系。它将更接近window, paint, door之类的单词。

结论

如果您搜索的是语义相似的单词,那么使用向量嵌入的解决方案将是不错的选择。另一方面,如果您的搜索基于词典,那么矢量嵌入将毫无帮助。

答案 1 :(得分:0)

如果您想从类似walmart的片段中找到wal,则更可能使用类似的东西:

  • 子字符串或前缀搜索所有条目;或
  • 一个字符克的反向索引;或
  • 针对所有条目或可能的候选子集​​计算出的某种编辑距离

也就是说,从示例所需的输出来看,即使某些算法(例如FastText)将能够基于单词片段与经过训练的单词的重叠来为单词片段提供粗糙的矢量,但这实际上并不是单词矢量的工作。

实际上,如果您想查找相似商店,则字向量在理论上可能是有用的。但是在您的示例输入中给出的问题是,这样的词向量算法需要在上下文中使用的标记示例,这些标记来自以自然语言相似关系共存的标记序列。而且,您需要大量具有各种上下文相关示例的数据,以捕获相互关系的细微层次。

虽然现有的短实体名称(存储)的单列不能提供此功能,但如果您拥有更丰富的数据源,则也许在其他地方也可以使用。一些想法可能是:

  • 单个客户访问的商店列表
  • 带有相同产品/ UPC的商店列表
  • 来自更大语料库的
  • 文本(例如网络抓取的文本,或者可能是Wikipedia),其中每个商店名称都有足够的上下文相关用法。 (您只是将通过这种训练创建的所有其他单词都扔掉了-但您感兴趣的标记的向量可能仍在您的域中有用。)