我对在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的标准方法。
答案 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之间的区别:
从实际使用的角度来看,虽然tf-idf是一种简单的评分方案,这是其主要优势,但对于大多数使用tf-idf的任务,单词嵌入可能是一个更好的选择,尤其是当任务可以从词嵌入(例如在信息检索任务中)捕获的语义相似性。
与Word2Vec可以学习整个词的矢量表示法的Word2Vec不同,快速文本可以像已经看到的那样为单词的每个n-gram学习表示法。因此,整个单词嵌入是n元语法表示形式的总和。基本上是FastText模型(n-gram的数量>单词的数量),它的性能比Word2Vec更好,并且可以恰当地表示稀有单词。
就我的一般观点而言,这没有道理,请结合使用FastText(或任何词嵌入方法)和Tf-Idf。但是,如果要将Tf-Idf与FastText一起使用,则必须对构成单词的所有n-gram求和,并使用此表示形式来计算Tf-Idf。