假设我有一大堆论文(数千篇),我想对它们进行标记、分类等。理想情况下,我希望通过手动分类/标记几百篇来训练某物,然后让它自由发挥。
你推荐哪些资源(书籍、博客、语言)来完成这样的任务?我部分认为这可能适合使用贝叶斯分类器,甚至是潜在语义分析,但我对这两者都不太熟悉,仅从几个ruby gem中了解了一些信息。
这种问题可以用贝叶斯分类器解决吗?我应该更多地关注语义分析/自然语言处理吗?还是应该寻找关键词密度并从那里进行映射?
回答:
哇,你要探索的这个话题相当庞大 🙂 确实有很多书籍和文章可以阅读,但我会尝试提供一个简短的介绍。我不是这方面的专家,但我做过一些相关的工作。
首先,你需要决定你是想将论文分类到预定义的主题/类别中(分类问题),还是希望算法自己决定不同的组(聚类问题)。从你的描述来看,你似乎对分类感兴趣。
现在,在进行分类时,你首先需要创建足够的训练数据。你需要有一定数量的论文,这些论文被分成不同的组。例如,5篇物理论文,5篇化学论文,5篇编程论文等等。一般来说,你希望尽可能多地获得训练数据,但具体需要多少取决于特定的算法。你还需要验证数据,这基本上与训练数据类似,但完全独立。这组数据将用于评估算法的质量(或数学术语中的性能)。
最后,算法本身。我熟悉的两种算法是基于贝叶斯的和基于TF-IDF的。对于贝叶斯,我目前正在用ruby开发一个类似的项目,我在博客中记录了我的经验。如果你有兴趣,可以阅读这个 – http://arubyguy.com/2011/03/03/bayes-classification-update/,如果你有任何后续问题,我会尽力回答。
TF-IDF是术语频率-逆文档频率的缩写。基本思想是对于给定的文档,找到训练集中与之最相似的若干文档,然后根据这些文档确定其类别。例如,如果文档D与T1(物理)和T2(物理)相似,而T3(化学)相似,你可以猜测D最可能关于物理,还有一点化学。
实现方式是给稀有词汇赋予更高的重要性,而对常见词汇不赋予重要性。例如,’nuclei’是稀有的物理词汇,但’work’是非常常见的无趣词汇。(这就是为什么它被称为逆文档频率)。如果你能使用Java,有一个非常好的Lucene库,可以开箱即用地提供这些功能。查找’相似文档’的API,并研究其实现方式。或者,如果你想自己实现,只需搜索’TF-IDF’即可。