python - 将文档分类

标签 python machine-learning nlp nltk naivebayes

我在 Postgres 数据库中存储了大约 300k 文档,这些文档带​​有主题类别(总共大约 150 个类别)。我还有另外 150k 个文档还没有类别。我正在尝试找到以编程方式对它们进行分类的最佳方法。

我一直在探索 NLTK及其朴素贝叶斯分类器。似乎是一个很好的起点(如果您能为这项任务提出更好的分类算法,我会全力以赴)。

我的问题是我没有足够的 RAM 来一次在所有 150 个类别/300k 文档上训练 NaiveBayesClassifier(5 个类别的训练使用 8GB)。此外,随着我​​对更多类别进行训练,分类器的准确率似乎会下降(2 个类别的准确率为 90%,5 个类别为 81%,10 个类别为 61%)。

我是否应该一次只训练 5 个类别的分类器,然后通过分类器运行所有 150k 文档以查看是否有匹配项?似乎这会起作用,除了会有很多误报,其中与任何类别都不真正匹配的文档会被分类器硬塞进去,只是因为它是可用的最佳匹配......有吗?一种为分类器设置“以上都不是”选项的方法,以防文档不适合任何类别?

这是我的测试课http://gist.github.com/451880

最佳答案

您应该首先将您的文档转换为 TF-log(1 + IDF) vectors : 词频是稀疏的,所以你应该使用 python dict,将词作为键,计数作为值,然后除以总数来得到全局频率。

另一个解决方案是使用 abs(hash(term)) 例如作为正整数键。然后你使用 scipy.sparse 向量,它比 python dict 更方便、更有效地执行线性代数运算。

还通过对属于同一类别的所有标记文档的频率进行平均来构建 150 个频率向量。然后对于要标记的新文档,您可以计算 cosine similarity在文档向量和每个类别向量之间选择最相似的类别作为文档的标签。

如果这还不够好,那么您应该尝试使用 this example 中所述的 L1 惩罚来训练逻辑回归模型。的 scikit-learn (这是 @ephes 解释的 liblinear 的包装器)。用于训练逻辑回归模型的向量应该是之前引入的 TD-log(1+IDF) 向量,以获得良好的性能(精度和召回率)。 scikit learn lib 提供了一个 sklearn.metrics 模块,其中包含用于计算给定模型和给定数据集的分数的例程。

对于较大的数据集:您应该尝试 vowpal wabbit对于大规模文档分类问题,这可能是地球上最快的兔子(但不容易使用 python 包装器 AFAIK)。

关于python - 将文档分类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3113428/

相关文章:

python - 在 Pycharm 中使用 virtualenv 作为 Django IDE

python - 将 os.system 的输出分配给一个变量并阻止它显示在屏幕上

python - pip 无法找到带有 M1 芯片的brew 安装的库

python - 将包含字典的字典列表转换为 Pandas 数据框

r - 自定义 ML 函数不起作用 : undefined columns selected

python - Python 中的样本数量不一致错误

tensorflow - 是否有任何解决方法可以沿着可变长度的维度取消堆叠张量?

PHP 音节检测

python - 预处理脚本不删除标点符号

python - ChatGPT 词嵌入最相似的词