如何自动标记所需的内容,算法和建议

Kas*_*bbe 28 tags tagging nlp

我正在使用一些非常庞大的报纸文章数据库,我将它们放在MySQL数据库中,我可以查询它们.

我现在正在寻找帮助我用一些描述性标签标记这些文章的方法.

所有这些文章都可以通过如下所示的URL访问:

http://web.site/CATEGORY/this-is-the-title-slug
Run Code Online (Sandbox Code Playgroud)

所以至少我可以使用该类别来确定我们正在使用的内容类型.但是,我也想基于文章文本进行标记.

我最初的做法是这样做:

  1. 获取所有文章
  2. 获取所有单词,删除所有标点符号,按空格分割,并按出现次数计算
  3. 分析它们,过滤常见的非描述性词语,如"他们","我","这个","这些","他们的"等.
  4. 当所有常用词被过滤掉时,唯一剩下的就是标记值得的词.

但事实证明这是一个相当手动的任务,而不是一个非常漂亮或有用的方法.

这也遭受了由空格分割的单词或名称的问题,例如,如果1.000篇文章包含名称"John Doe",并且1.000篇文章包含"John Hanson"的名称,我只会得到"John"这个词出于它,而不是他的名字和姓氏.

Anu*_*ain 21

自动标记文章确实是一个研究问题,当其他人已经做了很多工作时,你可以花很多时间重新发明轮子.我建议使用现有的自然语言处理工具包,如NLTK.

首先,我建议考虑实现一个正确的Tokeniser(比用空格分割要好得多),然后看看Chunking和Stemming算法.

您可能还想计算n-gram的频率,即单词序列,而不是单个单词.这将照顾"由空间分裂的单词".像NLTK这样的工具包具有内置功能.

最后,当您迭代地改进算法时,您可能希望训练数据库的随机子集,然后尝试该算法如何标记剩余的文章集以查看其工作情况.


Fre*_*Foo 10

您应该使用tf-idf等指标来获取标记:

  1. 计算每个文档的每个术语的频率.这是术语频率,tf(t,D).在文档中出现更频繁的一个术语d,更重要的它是d.
  2. 每个项计算该术语出现的文档数.这是文档频率 df(t).df越高,术语在您的文档中区分的越少,它就越不有趣.
  3. 将tf除以df的对数:tfidf(t,D)= tf(t,D)/ log(df(D)+ 1).
  4. 对于每个文档,通过其tf-idf分数将前k个术语声明为该文档的标记.

可以使用tf-idf的各种实现; 对于Java和.NET,有Lucene,对于Python有scikits.learn.

如果您想要做得更好,请使用语言模型.这需要一些概率论知识.


Aar*_*onD 5

如果我正确理解了您的问题,则希望将文章分为相似类。例如,您可以将第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类等),甚至对这些课程的内容可能无法提供丰富的信息。也就是说,学习算法将找到相似之处,并认为它认为相似的聚类文档,但是生成的聚类可能与您对“好的”类应包含的内容的想法不符。