【发布时间】:2010-12-07 05:02:42
【问题描述】:
如何通过数据挖掘一堆文本以获取关键字? (“雅各布·史密斯”或“栅栏”)
是否已经有软件可以做到这一点?甚至是半自动的,如果它可以过滤掉“the”、“and”、“or”等简单的词,那么我可以更快地进入主题。
【问题讨论】:
标签: text indexing keyword data-mining
如何通过数据挖掘一堆文本以获取关键字? (“雅各布·史密斯”或“栅栏”)
是否已经有软件可以做到这一点?甚至是半自动的,如果它可以过滤掉“the”、“and”、“or”等简单的词,那么我可以更快地进入主题。
【问题讨论】:
标签: text indexing keyword data-mining
这是 NLP 中的一个开放式问题,因此没有简单的答案。
我对快速而肮脏的“为我工作”的推荐是topia.termextract。
Yahoo 有一个关键字提取服务 (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/) 是英国的 Web 服务,也比较嘈杂,并且提出了许多虚假关键字。但是,在我看来,它比topia.termextract 稍微准确一些。 YMMV。
对包含过多关键字(例如,topia.termextract 和 termine)的结果进行去噪的一种方法是创建一个包含频繁出现的术语的词汇表,然后丢弃不在词汇表中的建议术语。换句话说,对你的语料库做两次遍历:第一次遍历,计算每个关键字的频率。在第二遍中,丢弃太稀有的关键字。
如果你想自己写,也许最好的介绍是由现在在 IBM 工作的 Park 写的:
如果您想了解更多信息,这里还有一些参考资料:
【讨论】:
一般算法是这样的:
- 获取文本 - 去除标点符号、特殊字符等。 - 去掉“简单”的词 - 分割空间 - 循环分割文本 - 如果单词不存在,则将单词添加到 Array/HashTable/Etc; 如果是,则增加该单词的计数器最终结果是文本中所有单词的频率计数。然后,您可以取这些值并除以总词数以获得频率百分比。任何进一步的处理都取决于您。
您还想查看Stemming。词干用于将单词简化为词根。例如going => go、cars => car等
这样的算法将在垃圾邮件过滤器、关键字索引等中很常见。
【讨论】:
你没有指定你正在使用的技术,所以我猜一个 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...)等中排除单词。
【讨论】:
我个人推荐 Maui (http://code.google.com/p/maui-indexer/):它依赖于 KeA,但以多种方式扩展它。它是可训练的并且可以使用 RDF 格式的术语。
【讨论】:
我之前使用 NTLK 到 recognize named entities 并取得了一些成功。它特别擅长识别人员和组织的名称。
【讨论】: