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

问题描述 投票:0回答:2

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

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

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

**我的文件结构:**

Walmart
Home Depot
Home Depot
Sears
Walmart
Sams Club
GreenMile
Walgreen

预期

search Text : 'WAL'

来自我的文件的结果:

WALGREEN
WALMART
WALMART
python machine-learning nlp gensim word2vec
2个回答
3
投票

的嵌入

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

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

那么这些嵌入模型是如何训练的呢?嵌入模型在(非常)巨大的文本语料库上进行训练。当你有大量的文本语料时,模型会知道苹果是橙色的(在很多时候)在同一个环境中使用。它将了解到苹果和橙子是相关的。因此,要训练一个好的嵌入模型,你需要巨大的文本语料库(不是独立的单词,因为独立的单词没有上下文)。

然而,由于良好的嵌入模型在开源中可用,因此很少会训练嵌入模型形式的单词。但是,如果您的文本是特定于域的(比如医学),那么您可以在公开可用的单词嵌入上进行转移学习。

Out of vocabulary (OOV) words

像word2vec和Glove这样的单词嵌入不能返回OOV单词的嵌入。然而,像FastText这样的嵌入(感谢@gojom指出它)通过将它们分成n-gram的字符来处理OOV字,并通过对构成字的子字矢量进行求和来构建矢量。

问题

来你的问题,

案例1:让我们说用户输入一个单词WAL,首先它不是一个有效的英语单词所以它不会在词汇表中,并且很难想到它的含义是完整的向量。像FastText这样的嵌入通过将它分解为n-gram来处理它们。这种方法为拼写错误的单词或俚语提供了良好的嵌入。

案例2:让我们说用户输入一个单词WALL,如果你打算用类似的方法来找到最接近的单词,它将永远不会接近Walmart,因为在语义上它们是无关的。它宁愿接近像window, paint, door这样的词。

结论

如果您的搜索是针对语义相似的单词,那么使用矢量嵌入的解决方案将是好的。另一方面,如果您的搜索基于词典,那么矢量嵌入将无济于事。


0
投票

如果你想从像walmart这样的片段中找到wal,你更有可能使用类似的东西:

  • 搜索所有条目的子字符串或前缀;要么
  • 反向索引字符n-gram;要么
  • 针对所有条目或可能候选人的子集计算的某种编辑距离

也就是说,根据您的示例所需的输出,这对于字向量来说并不是真正的工作,即使某些算法(如FastText)能够基于它们与训练单词的重叠为字段提供粗略的向量。

如果实际上你想找到类似的商店,理论上,字矢量可能是有用的。但是给出你的示例输入的问题是这样的字向量算法需要在上下文中使用的令牌的示例,来自与自然语言类似的关系中共同出现的令牌序列。并且您需要大量具有不同上下文示例的数据,以捕捉相互关系的微妙层次。

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

  • 单个客户访问的商店列表
  • 携带相同产品/ UPC的商店列表
  • 来自更大的语料库(例如网络爬行文本或维基百科)中的文本,其中每个商店名称都有足够的上下文用法。 (你只是抛弃了从这种训练中创建的所有其他单词 - 但你感兴趣的标记的向量可能仍然在你的域中使用。)
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.