36

如何通过数据挖掘一堆文本以获取关键字?(“雅各布·史密斯”或“栅栏”)

是否已经有软件可以做到这一点?即使是半自动的,如果它可以过滤掉“the”、“and”、“or”等简单的词,那么我可以更快地进入主题。

4

6 回答 6

119

这是 NLP 中的一个开放性问题,因此没有简单的答案。

我对快速而肮脏的“为我工作”的推荐是topia.termextract

雅虎有一个关键字提取服务(http://developer.yahoo.com/search/content/V1/termExtraction.html),召回率低但精度高。换句话说,它会为您提供少量高质量的术语,但会遗漏文档中的许多术语。

在 Python 中,有topia.termextract ( http://pypi.python.org/pypi/topia.termextract/ )。它比较嘈杂,并且提出了许多虚假关键字,但使用起来很简单。

Termine ( http://www.nactem.ac.uk/software/termine/ ) 是一个英国的网络服务,它也比较嘈杂,并且提出了许多虚假的关键字。但是,在我看来,它比topia.termextract 稍微准确一些。YMMV。

使用过多关键字(例如,topia.termextract 和 termine)对结果进行去噪的一种方法是创建一个包含频繁出现的术语的词汇表,然后丢弃不在词汇表中的建议术语。换句话说,对你的语料库做两次遍历:第一次遍历,计算每个关键字的频率。在第二遍中,丢弃太稀有的关键字。

如果你想自己写,也许最好的介绍是由现在在 IBM 工作的 Park 写的:

如果您想了解更多信息,这里还有一些参考资料:

  • http://en.wikipedia.org/wiki/Terminology_extraction
  • “CorePhrase:文档聚类的关键词提取”
  • Liu et al 2009 来自 NAACL HLT
  • “自动识别非组成短语”
  • “数据挖掘遇上搭配发现”
  • 以及许多其他参考资料,您可以深入了解该主题。
于 2009-10-15T21:58:17.347 回答
39

一般算法是这样的:

- 获取文本
- 去除标点符号、特殊字符等。
- 去掉“简单”的词
- 分割空间
- 循环分割文本
    - 如果单词不存在,则将单词添加到 Array/HashTable/Etc;
       如果是,则增加该单词的计数器

最终结果是文本中所有单词的频率计数。然后,您可以取这些值并除以总词数以获得频率百分比。任何进一步的处理都取决于您。

您还需要研究Stemming。词干用于将单词简化为词根。例如going => go,cars => car等。

像这样的算法将在垃圾邮件过滤器、关键字索引等中很常见。

于 2009-10-15T21:44:43.507 回答
9

还有一个叫做Alchemy的服务,可以做术语提取、概念标记、情感分析等。

它是有效的,我测试过但我不知道他们的商业政策(如果有的话)。它们为任何类型的语言(几乎)提供 API。

我在某处读到(对不起,我不记得在哪里了)Alchemy 给出的输出与 Joseph 提出的输出相比噪音要小。

于 2011-12-19T10:18:38.137 回答
5

您没有指定您正在使用的技术,所以我想 shell 脚本也是一种可能性。

我一直对Advanced Bash-Scripting Guide (12-11)中的词频分析示例印象深刻

以下示例从 Gutenburg 项目中获取一本书并写出词频分析“报告”:

wget http://www.gutenberg.org/files/20417/20417-8.txt -q -O- | 
sed -e 's/\.//g'  -e 's/\,//g' -e 's/ /\
/g' | tr 'A-Z' 'a-z' | sort | uniq -c | sort -nr > output.txt

应该可以扩展以从“常见”列表(the, and, a...)等中排除单词。

于 2009-10-15T22:16:51.810 回答
1

我个人推荐 Maui ( http://code.google.com/p/maui-indexer/ ):它依赖于 KeA,但以多种方式扩展它。它是可训练的并且可以使用 RDF 格式的术语。

于 2013-04-18T08:23:34.073 回答
0

我之前使用 NTLK识别命名实体并取得了一些成功。它特别擅长识别人员和组织的名称。

于 2012-06-05T00:03:31.007 回答