我知道这是一个非常模糊的问题,但我试图找出进行文档分类的最佳方法。我有两套训练和测试。训练集是一组标记为1或0的文档。如果文档是信息性摘要则标记为1,如果不是,则标记为0。我试图创建一个有监督的分类器。我无法决定使用哪个nlp工具包。我在想nltk。你有什么建议吗?我必须在python中编写分类器。还有任何特定类型的分类器。我一直在做研究,但似乎无法得到一个好的答案。
答案 0 :(得分:4)
简短的回答是真的取决于。你还没有找到一个很好的资源的原因是因为文件分类,到目前为止仍然是一个相对较新的,知之甚少的领域。问题的真相是,有大量不同的分类器可能起作用,并且实际上不可能说哪个分类器最适合您的特定任务,并且它非常依赖于数据集。
我能给你的最好建议是,运行其中一个分类器通常有两个步骤。第一个是矢量化,它将您的文档放入固定长度的矢量表示中。最常见的是tfidf
加权,这在sklearn中得到了很好的实现。此处的具体文档:http://scikit-learn.org/stable/modules/feature_extraction.html#tfidf-term-weighting
一旦您对输入进行了矢量化,就需要选择分类器和精度指标。至于分类器,我建议您浏览显示here的示例,并选择返回最佳精度指标的示例。
就精确度指标而言,两个最简单的(也有许多非常复杂的替代方案),简单的准确性,AUC
,两者都得到了sklearn的支持。 AUC是一个更强大的精确度版本,对类不平衡更加稳健(如果所有示例都为1,则为99.9%,那么仅预测1的分类器不应该是最佳分类器)
这实际上是一个非常广泛的主题,并且有很多内容可以覆盖,但如果你将一些sklearn功能粘合在一起,你应该可以很容易地得到一些可行的东西。
答案 1 :(得分:2)
我一般建议使用Scikit作为Slater建议。它比NLTK更具可扩展性。对于此任务,使用朴素贝叶斯分类器或支持向量机是最好的选择。您正在处理二进制分类,因此您没有多类。 至于你应该提取的功能,请尝试unigrams,bigrams,trigrams和TFIDF功能。此外,LDA可能会变得有用,但从更容易的,如unigrams开始。 这还取决于您正在处理的文本的类型和长度。文档分类已经存在了十多年,有很多优秀的论文可以找到有用的。 如果您有任何其他问题,请与我们联系。
答案 2 :(得分:0)
其他答案很有用且信息丰富,但可能无法解决整个问题。您根据文档分类表达了您的问题,推荐的方法是针对该问题的合理解决方案。但是,如果我正确地阅读了您的问题,那么它并不是传统的document classification问题。问题陈述:
如果文件是资料性摘要,则标记为1;如果不是,则标记为0。
大多数文档分类系统将每个文档分配给一组类中的一个。例如。 '文件1属于'体育'课程,文件2在' Art',...
您的问题可能更接近textual entailment,它试图辨别另一个(通常是更长的)文档是否隐含了一个文档(通常是简短的声明或摘要)。您也可以稍微调查一下automatic summarization。该字段涉及生成摘要(而您只对评分它们感兴趣),但许多摘要系统还包括评分和排名,用于在一组候选摘要之间进行选择。 (发布一系列维基百科链接的道歉,但也许至少有一些标准NLP任务的术语参考将有所帮助。)
问题中没有(目前)解决了另一个关键问题:如果文档x被标记为“信息摘要”,那么它的信息摘要是什么?
例如,请考虑声明:
"自动摘要系统试图生成较长文档的简短可读摘要"
这可能是上面链接的维基百科页面之一的信息摘要。但它肯定不是其他人的恰当总结!看来您的分类器可能需要访问文档(假设)总结的较大文本,以确定摘要是否合适。
如果您可以访问所述文档,您还可以考虑将问题框定为信息检索任务 - 例如,将候选摘要用作查询,并评分其有用性'通过返回结果中的目标文档的排名。如果这种方法可行,您将从Lucene和其他精心设计的IR工具中受益。