【问题标题】:What is the input format of fastText and why does my model doesn't give me a meaningful similar output?fastText 的输入格式是什么,为什么我的模型没有给我一个有意义的类似输出?
【发布时间】:2020-10-04 04:57:57
【问题描述】:

我的目标是找到单词和文档之间的相似之处。例如,我想查找“new”和文档之间的相似性,为简单起见,说“Hello World!”。

我使用了 gensim 的 word2vec,但问题是它没有找到一个看不见的单词的相似性。因此,我尝试使用 gensim 的 fastText,因为它可以找到词汇表之外的单词的相似性。

这是我的文档数据示例:

[['This', 'is', 'the', 'only', 'rule', 'of', 'our', 'household'],
 ['If',
  'you',
  'feel',
  'a',
  'presence',
  'standing',
  'over',
  'you',
  'while',
  'you',
  'sleep',
  'do'],
 ['NOT', 'open', 'your', 'eyes'],
 ['Ignore', 'it', 'and', 'try', 'to', 'fall', 'asleep'],
 ['This',
  'may',
  'sound',
  'a',
  'bit',
  'like',
  'the',
  'show',
  'Bird',
  'Box',
  'from',
  'Netflix']]

我只是像这样训练数据:

from gensim.models.fasttext import FastText

model = FastText(sentences_cleaned)

因此,我想找出“规则”与此文档之间的相似性。

model.wv.most_similar("rule")

然而,fastText 给了我这个:

[('the', 0.1334390938282013),
 ('they', 0.12790171802043915),
 ('in', 0.12731242179870605),
 ('not', 0.12656228244304657),
 ('and', 0.11071767657995224),
 ('of', 0.08563747256994247),
 ('I', 0.06609072536230087),
 ('that', 0.05195673555135727),
 ('The', 0.002402491867542267),
 ('my', -0.009009800851345062)]

显然,由于“规则”一词出现在文档的第一句话中,因此它必须具有“规则”作为最高相似度。我也尝试了词干提取/词形还原,但它也不起作用。

我的输入格式正确吗?我看到很多文档都使用 .cor 或 .bin 格式,但我不知道它们是什么。

感谢您的回复!

【问题讨论】:

  • 我不知道您所说的“文档”是什么意思,因为正如 gojomo 提到的那样,您并没有显示自己在训练任何文档。但是,您的代码中的另一个问题是 most_similar 需要一个 list 单词。试试most_similar(["rule"]),你至少应该得到类似于“规则”的词。
  • 检查这个类似的问题:link。建议像这样获得最相似:words = model.most_similar(positive=['rule'], topn=10, restrict_vocab=50000)

标签: nlp word2vec sentiment-analysis fasttext sentence-similarity


【解决方案1】:

model.wv.most_similar('rule') 要求该模型的词向量集 (.wv) 返回与 'rule' 最相似的词。也就是说,您既没有提供任何文档(多个单词)作为查询,也没有任何方法让 FastText 模型返回文档本身或任何文档的名称。只是文字,就像它所做的那样。

虽然 FastText 训练文本(词标记列表),但它只对词/子词进行建模。所以不清楚你的期望是什么:答案是正确的形式。

那些看起来不太像 'rule' 的词,但如果你用大量不同的数据训练它们,你只会从 FastText (和类似的 word2vec 算法)中得到好的结果,这些数据显示了许多微妙的 -对比相关词的实际用法。

您的sentences_cleaned 数据中有多少文本,多少字? ('rule'和相关词有多少用法?)

在任何真实的FastText/Word2Vec/etc 模型中,使用相同的数据/参数进行训练,没有一个句子(如您的第一句话)可以告诉您“应该”的结果是什么。这只是从完整的丰富数据集中出现的。

【讨论】:

  • 是的,你是对的。 sentences_cleaned 只是一小段。我正在使用它来试用 fasttext。我有一个比较大的数据集,包含一列段落和相应的分数。我只是不太清楚这个模型的输入格式是什么。我正在考虑是否可以让这个模型在段落中标记的最大相似性和构建特征集的几个单词的意义上工作。
  • 用玩具大小的数据集测试单纯的执行和格式缺失错误是明智的。而且,您的listlist of str 是模型可接受的输入。 (不过,对于较大的训练数据,您通常希望使用一个可重复的序列,其中每个项目都是一个 list of str,从磁盘流式传输数据,而不是在 RAM 中创建一个巨大的 list,就像在 Gensim 介绍中经常演示的那样docs/tutorials,与用于迭代大型文本文件的 LineSentence 实用程序类一样。)
  • 但是由于词向量的预期/有用/可描述的质量只出现在大型/多变的训练数据中,因此在玩具大小的数据上挖掘模型的细节以了解预期行为是没有用的。只有拥有大量真实的训练数据,您才应该开始担心任何特定 most_similar() results-list 的结果是否有意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-21
  • 2019-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多