如何将词汇归类?(自然语言处理)
I love to eat chicken.
Today I went running, swimming and played basketball.
我的目标是通过分析这两句话,返回食物和运动这两个词。你怎么做到这一点呢?
我对自然语言处理和Wordnet有一些了解。但是有没有更高级、更实用或更现代的技术呢?
有没有什么东西可以自动把词分类,分成“层级”?
更重要的是,这个过程的技术术语是什么?
5 个回答
Google Sets 是一个可以做一些相关工作的工具,另外还有一些关于超集的讨论。不过,我在里面并没有看到什么具体的技术细节,主要都是一些想法和讨论。
也许这些信息至少能对你的研究有所帮助……
你问的问题属于一个叫做“主题文本分类”的研究领域。关于这方面的技术,有一篇很好的概述文章,标题是“机器学习在自动文本分类中的应用”,作者是Fabrizio Sebastiani。其中一种最简单的技术(虽然不一定是效果最好的)是收集每个类别中大量的句子示例(可以是几百个),然后用这些示例来训练一个叫做朴素贝叶斯分类器的工具。NLTK库中就包含了一个朴素贝叶斯分类器,位于模块nltk.classify.naivebayes
中。
这个问题用程序来解决比较困难,但最近在这个领域已经取得了很多进展。
大多数自然语言处理都是从语法开始的(语法可能是上下文无关的,也可能不是)。语法是一套规则,说明如何用更具体的东西构建出更一般的东西。
举个简单的上下文无关语法的例子:
Sentence ::= NounPhrase VerbPhrase
NounPhrase ::= ["The"] [Adjective] Noun
Adjective ::= "big" | "small" | "red" | "green"
Noun ::= "cat" | "man" | "house"
VerbPhrase ::= "fell over"
这显然是过于简化了,但要创建一个完整的语法来定义所有英语是非常庞大的任务,而大多数实际系统只会定义一些适用于特定问题领域的子集。
一旦定义了语法(或者通过一些只有像谷歌这样的大公司才知道的复杂算法学习到),就可以根据语法解析一个叫做“示例”的字符串。这会给每个单词标记词性。一个非常复杂的语法不仅仅会有你在学校学到的词性,还会有像“网站”、“老人的名字”和“成分”这样的分类。
这些分类可以通过人工费力地构建到语法中,或者使用类似类比建模或支持向量机的技术来推断。在这些方法中,“鸡肉”、“足球”、“烧烤”和“板球”等词会被定义为在一个非常高维的空间中的点,还有数百万个其他点,然后聚类算法会根据这些点之间的位置关系来定义组。接着,可以尝试从示例文本中推断出这些组的名称。
链接文本 这个谷歌搜索列出了几种在自然语言处理(NLP)中使用的技术,你可以从中学到很多东西。
编辑:为了仅仅解决这个问题,可以在网上爬取形式为“_ 是一个 _”的句子,以建立一个物品-类别关系的数据库。然后解析上面的字符串,查找在数据库中已知的物品词。