我想使用n-gram对两组文档进行分类。一种方法是使用tfidf提取每个文档的重要单词,然后生成如下所示的csv文件:
document, ngram1, ngram2, ngram3, ..., label
1, 0.0, 0.0, 0.0, ..., 0
2, 0.0, 0.0, 0.0, ..., 1
...但由于文档数量的限制,文件将变得庞大而稀疏。另一种方法是合并每个组中的所有文档并提取ngram。在此之后,我可以计算每个ngram在每个文档中的出现次数,但我不确定这是最好的方法。请提供您建议的解决方案。
发布于 2021-02-09 00:40:11
在提取ngram之前连接组中的文档是没有意义的-以这种方式生成的任何新ngram都不会存在于任何单独的文档中。
正如您正确地注意到的那样,无论您使用哪种标记化方法,都会产生一个大型的稀疏矩阵。这不一定是问题--无论您打算使用什么库来进行分类,都可能会提供一个有效的表示来存储稀疏矩阵,并且通常会为您计算tf-idf矩阵。
您可能还希望仅使用ngram的一个子集作为特征,使用ngram-frequency和ngram-length(给定ngram中“gram”的数量)的某种组合来选择相关的ngram。
或者,您可以使用潜在语义分析的原始形式-计算tf-idf矩阵,然后使用主成分分析减少特征的数量(如果ngram和文档的数量如此之大,以至于无法计算其协方差矩阵,则可以使用奇异值分解)。
发布于 2021-02-09 16:07:23
我建议您使用sklearn的tfidf向量器(https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html)。它支持ngram,并且内存使用效率很高。您可以轻松地将向量化器传递给任何sklearn分类器来构建分类模型。
https://stackoverflow.com/questions/66103080
复制相似问题