命名实体识别算法
我想用命名实体识别(NER)来为数据库中的文本找到合适的标签。
我知道有维基百科的文章讲这个,还有很多其他页面在描述NER,但我更想听听你们的看法:
- 你们在使用不同算法时有什么经验?
- 你们推荐哪个算法?
- 哪个算法最容易实现(PHP/Python)?
- 这些算法是怎么工作的?需要手动训练吗?
举个例子:
“去年我在伦敦,见到了巴拉克·奥巴马。” => 标签:伦敦,巴拉克·奥巴马
希望你们能帮我。非常感谢!
6 个回答
现在有一些工具和API可以使用。
其中有一个叫DBPedia Spotlight的工具,它是基于DBPedia开发的(https://github.com/dbpedia-spotlight/dbpedia-spotlight/wiki)。你可以使用他们的REST接口,或者下载并安装自己的服务器。这个工具的好处在于,它可以把各种实体和它们在DBPedia上的信息对应起来,这样你就可以提取到有趣的关联数据。
还有一个叫AlchemyAPI的服务(www.alchemyapi.com),它也提供类似的API,使用REST接口,并且采用的是一种免费加收费的模式。
我觉得大多数技术都依赖于一些自然语言处理(NLP)来识别实体,然后再使用像维基百科、DBPedia、Freebase等数据库来进行消歧义和判断相关性(举个例子,如果一篇文章提到“苹果”,我们需要判断是指水果还是公司... 如果文章中还有其他和苹果公司相关的实体,我们就会选择公司这个意思)。
这要看你想要什么:
想了解命名实体识别(NER):一个很好的起点是 NLTK,还有相关的 书籍。
想实现最佳解决方案: 在这种情况下,你需要寻找最先进的技术。可以看看 TREC 的相关出版物。还有一个更专业的会议是 Biocreative(这是一个将NER应用于特定领域的好例子)。
想实现最简单的解决方案:在这种情况下,你基本上只想做简单的标记,提取出标记为名词的词。你可以使用来自nltk的标记工具,或者直接在 PyWordnet 中查找每个词,并用最常见的词义进行标记。
大多数算法都需要某种训练,并且在训练内容与将要标记的内容相似时效果最好。
首先,如果你打算用Python进行相关工作,可以去看看 http://www.nltk.org/。不过据我所知,这里的代码可能不够“工业级”,但可以帮助你入门。
你还可以查看一下 http://nltk.googlecode.com/svn/trunk/doc/book/ch07.html 的第7.5节,不过要理解这些算法,你可能需要读很多书的内容。
另外,看看这个链接 http://nlp.stanford.edu/software/CRF-NER.shtml。这个是用Java做的。
命名实体识别(NER)这个话题不简单,可能没有人会告诉你“这是最好的算法”,因为每种算法都有优缺点。
这是我个人的一点看法。
祝好,