我正在使用一些非常庞大的报纸文章数据库,我将它们放在MySQL数据库中,我可以查询它们.
我现在正在寻找帮助我用一些描述性标签标记这些文章的方法.
所有这些文章都可以通过如下所示的URL访问:
http://web.site/CATEGORY/this-is-the-title-slug
Run Code Online (Sandbox Code Playgroud)
所以至少我可以使用该类别来确定我们正在使用的内容类型.但是,我也想基于文章文本进行标记.
我最初的做法是这样做:
但事实证明这是一个相当手动的任务,而不是一个非常漂亮或有用的方法.
这也遭受了由空格分割的单词或名称的问题,例如,如果1.000篇文章包含名称"John Doe",并且1.000篇文章包含"John Hanson"的名称,我只会得到"John"这个词出于它,而不是他的名字和姓氏.
Fre*_*Foo 10
您应该使用tf-idf等指标来获取标记:
可以使用tf-idf的各种实现; 对于Java和.NET,有Lucene,对于Python有scikits.learn.
如果您想要做得更好,请使用语言模型.这需要一些概率论知识.
看看Kea.它是一个用于从文本文档中提取关键短语的开源工具.
您的问题也在http://metaoptimize.com/qa上多次讨论过:
如果我正确理解了您的问题,则希望将文章分为相似类。例如,您可以将第1条分配给“体育”,将第2条分配给“政治”,依此类推。或者,如果您的班级更细,则可以将相同的文章分配给“达拉斯小牛队”和“共和党总统竞选”。
这属于“聚类”算法的一般类别。此类算法有很多可能的选择,但这是一个活跃的研究领域(这意味着它不是一个已解决的问题,因此,这些算法的性能都可能不会达到您想要的水平)。
我建议您看一下潜在的Direchlet分配(http://en.wikipedia.org/wiki/Latent_Dirichlet_allocation)或“ LDA”。我没有使用任何可用的LDA实现的个人经验,因此我不推荐使用特定的系统(也许其他知识比我可能推荐的用户友好的实现更多的知识)。
您还可以考虑使用LingPipe中的聚集式群集实现(请参阅http://alias-i.com/lingpipe/demos/tumos/tutorial/cluster/read-me.html),尽管我怀疑LDA实现可能会更可靠。
在查看集群系统时,需要考虑几个问题:
您是否希望允许部分阶级的成员资格-例如考虑一篇讨论经济前景及其对总统竞选的潜在影响的文章;该文件可以部分属于“经济”类别,部分属于“选举”类别吗?一些聚类算法允许部分类分配,而某些则不允许
您是要手动创建一组类(即列出“经济”,“体育”等),还是希望从数据中学习该组类?手动班级标签可能需要更多的监督(手动干预),但是如果您选择从数据中学习,“标签”可能对人类没有任何意义(例如,第1类,第2类等),甚至对这些课程的内容可能无法提供丰富的信息。也就是说,学习算法将找到相似之处,并认为它认为相似的聚类文档,但是生成的聚类可能与您对“好的”类应包含的内容的想法不符。