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

我正在使用一些非常大型的报纸文章数据库,它们都存在于MySQL数据库中,并且我可以全部查询它们。

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

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

http://web.site/CATEGORY/this-is-the-title-slug

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

我最初的方法是这样做的:

  1. 获取所有文章
  2. 获取所有单词,删除所有标点符号,按空格分隔,然后按出现次数进行计数
  3. 分析它们,并过滤掉常见的非描述性词,例如“它们”,“ I”,“此”,“这些”,“其”等。
  4. 当所有常用词都被过滤掉时,剩下的唯一就是具有标签价值的词了。

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

这也受到单词或名称被空格分隔的问题的困扰,例如,如果1.000文章包含名称“ John Doe”,而1.000文章包含名称“ John Hanson”,则我只会得到单词“ John”而不是他的名字和姓氏。

参考资料:
Stack Overflow
收藏
评论
共 6 个回答
高赞 时间 活跃

如果内容是图像或视频,请查看以下博客文章:

http://scottge.net/2015/06/30/automatic-image-and-video-tagging/

基本上有两种方法可以从图像和视频中自动提取关键字。

  1. 多实例学习(MIL)
  2. 深度神经网络(DNN),递归神经网络(RNN)及其变体

在以上博客文章中,我列出了最新的研究论文以说明解决方案。其中一些甚至包括演示站点和源代码。

如果内容是大型文本文档,请查看此博客文章:

市场上最好的关键短语提取API http://scottge.net/2015/06/13/best-key-phrase-extraction-apis-in-the-market/

谢谢,斯科特

收藏
评论

您应该使用诸如tf-idf之类的指标来获取标签:

  1. 计算每个文档中每个术语的频率。这是术语频率 tf( tD )。术语在文档D中出现的次数越多,对D越重要。
  2. 每个术语计算该术语出现在其中的文档数。这是文档频率 df( t )。 df越高,术语在您的文档中的区别就越小,它的趣味性也就越小。
  3. 将tf除以df的对数:tfidf( tD )= tf( tD )/ log(df( D )+ 1)。
  4. 对于每个文档,通过其tf-idf得分声明前k个术语作为该文档的标签。

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

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

收藏
评论

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

收藏
评论

自动标记文章确实是一个研究问题,当其他人已经完成许多工作时,您可以花费大量时间重新发明轮子。我建议使用现有的自然语言处理工具包之一,例如NLTK

首先,我建议您看一下实现一个合适的Tokeniser(比按空格分割要好得多),然后看一下Chunking和Stemming算法。

您可能还想为n-gram (即单词序列)而不是单个单词计数。这将解决“单词被空格分隔”的问题。 NLTK等工具包具有为此内置的功能。

最后,随着迭代地改进算法,您可能希望对数据库的随机子集进行训练,然后尝试使用该算法如何标记其余文章集,以查看其效果如何。

收藏
评论

您的方法似乎很明智,可以通过两种方法来改进标记。

  1. 使用已知的关键字/短语列表进行标记,如果该单词/短语的实例计数大于阈值(可能基于文章的长度),则包括该标签。
  2. 使用语音标记算法一部分可以帮助将文章简化为一组有意义的短语,并使用一种明智的方法从中提取标签。使用这种算法减少文章的数量之后,您将可以识别一些好的候选词/短语,以用于方法1的关键字/短语列表。
收藏
评论
收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号