选择正确的参数来训练 Tf-Idf 矢量化器

数据挖掘 文本挖掘 特征提取 文本
2022-03-07 04:01:19

我对DS世界很陌生,所以请原谅我的无知。

我正在尝试用西班牙语分析用户评论。我有一个有点小的数据集(在 100k 中——那么小吗?),当我以一种天真的方式运行算法时(scikit-learn 的默认选项 + 删除重音,没有词汇/停用词)我得到非常常见和低价值的词的非常高的价值(例如“to”,“at”等的西班牙语等价物)。

在约 200 字符长的文档的 100k 长语料库上训练矢量化器的最有效方法是什么?

我正在考虑使用更大的西班牙语文本语料库或寻找西班牙语的停用词删除实现,但希望在开始之前获得一些专家建议。

谢谢!

1个回答

没有银弹。但这里有一些建议:

  1. 使用更好的停用词词汇。如果您仍然有“to”和“at”之类的词,那么您要么没有删除停用词,要么使用了糟糕的词汇。尝试使用来自的西班牙语停用词nltk

    from nltk.corpus import stopwords
    stopwords.words('spanish')
    
  2. 使用max_df < 1. 这将截断出现在超过该百分比数量的文档中的单词。

  3. TF-IDF惩罚常用词(遍历所有文档)的部分是TF-IDF的IDF部分,意思是逆文档变换。有几个函数可以用作您的IDF 函数通常,使用 IDF=您可以尝试更具惩罚性的 IDF 功能。sklearn 似乎不允许指定它,但您可以使用轻松实现自己的 TF-IDF 矢量化。它需要不超过五行代码。log#documents#documents where word appearsnltkgensim

我会按此顺序尝试这些建议中的每一个,并在它足够好时停止。听起来使用更好的停用词词汇对您来说已经足够了。

编辑:我忘了提,但是如果你有需要的话,当然你可以在停用词列表中添加更多无趣的词。

您可能还想首先评估 TF-IDF 对您的计数的影响。我认为这会起作用:

m = TfidfVectorizer().fit(docs)
c = [m.transform([word]) for word in m.vocabulary_]
for i in np.argsort(c)[::-1][:20]:
    print(m.vocabulary_[i], c[i])

您可能需要调整代码。尝试在禁用和启用 IDF 以及其他调整的情况下使用。