将tf-idf与FastText向量结合使用

时间:2019-09-23 20:28:32

标签: python nlp fasttext

我对在FastText库中使用tf-idf很感兴趣,但是找到了一种处理ngram的逻辑方法。我已经将tf-idf与SpaCy向量一起使用了,以发现以下示例:

但是对于FastText库,我不太清楚,因为它的粒度并不直观,例如。

对于一般的word2vec方法,我每个单词都有一个矢量,我可以计算该矢量的词频,并相应地除以其值。

但是对于fastText,同一单词将具有多个n-gram,

“收听最新新闻摘要”将显示由滑动窗口生成的n-gram,例如:

十个孩子...

这些n-gram由模型内部处理,因此当我尝试:

model["Listen to the latest news summary"] 

我直接获得了最终向量,因此,我要做的就是在像这样输入模型之前将文本分割成n-gram:

model['lis']
model['ist']
model['ten']

然后从那里制作tf-idf,但这似乎都是一种低效的方法,是否存在将tf-idf应用于此类矢量n-gram的标准方法。

3 个答案:

答案 0 :(得分:1)

我会让FastText处理三字组,但继续在单词级别构建tfidf加权嵌入。

也就是说,您发送

model["Listen"]
model["to"]
model["the"]
...

到FastText,然后使用您的旧代码获取tf-idf权重。

无论如何,最好知道FastText本身在处理句子时是考虑 word 构造,还是真正只将其作为三字母组合(连续的单词)使用。如果后者是正确的,那么对于FastText,您会将句子分成单独的单词来丢失信息。

答案 1 :(得分:1)

您正在谈论的是快速文本标记化步骤(不是快速文本嵌入),它是(3,6)字符n-gram标记化,与tfidf兼容。整个步骤可以很容易地在fasttext之外计算Calculate TF-IDF using sklearn for n-grams in python

答案 2 :(得分:-1)

对于我从您的问题中了解到的内容,您正在混淆词嵌入方法(例如word2vec和许多其他方法)与Tf-Idf之间的区别:

  • 基本上单词嵌入方法是用于 生成单词向量。这类向量产生的词向量 模型现在在NPL任务中非常流行。这是因为 单词的嵌入表示可获取有关以下内容的更多信息 一个单词,而不是一个单词的单词表达,因为 前者捕获了该单词与其他单词的语义相似性
    而单词的后一种表示与所有人等距 也就是说。 FastText是另一种实现单词嵌入的方法(最近由facebook研究人员开源)。
  • Tf-idf ,而是一种单词评分方案,用于衡量 一个单词对文件很重要。

从实际使用的角度来看,虽然tf-idf是一种简单的评分方案,这是其主要优势,但对于大多数使用tf-idf的任务,单词嵌入可能是一个更好的选择,尤其是当任务可以从词嵌入(例如在信息检索任务中)捕获的语义相似性。

与Word2Vec可以学习整个词的矢量表示法的Word2Vec不同,快速文本可以像已经看到的那样为单词的每个n-gram学习表示法。因此,整个单词嵌入是n元语法表示形式的总和。基本上是FastText模型(n-gram的数量>单词的数量),它的性能比Word2Vec更好,并且可以恰当地表示稀有单词。

就我的一般观点而言,这没有道理,请结合使用FastText(或任何词嵌入方法)和Tf-Idf。但是,如果要将Tf-Idf与FastText一起使用,则必须对构成单词的所有n-gram求和,并使用此表示形式来计算Tf-Idf。