这是一个非常广泛的问题,因此它几乎不适合 StackOverflow 的格式,但我更想试一试。
首先,关于 NLP 的一句话 NLP
领域成熟工具的广泛可用性本身就有些误导。当然,从 POS 标记或分块到自动摘要或命名实体识别等所有/大多数 NLP 功能都被各种库的逻辑和支持数据所覆盖,并且通常得到很好的服务。然而,从这些构建块构建现实世界的解决方案绝非易事。一个人需要:
- 沿着某种管道或链构建解决方案,从而将特定转换的结果反馈到后续流程的输入中。
- 配置各个流程:这些流程的计算框架已经建立,但它们对基础数据极为敏感,例如训练/参考语料库、可选的调整参数等。
- 选择并验证适当的功能/流程。
对于与从文本中提取和处理语义元素相关的部分解决方案(大体上的信息提取,还有共指消歧、关系提取或情感分析等),上述问题尤其困难。这些 NLP 函数和各种库中的相应实现往往更难配置,对依赖于领域的模式或语音级别的变化甚至支持语料库的“格式”更敏感。
简而言之,NLP 库为问题中提到的“问答系统”等应用程序提供了必要的构建块,但需要大量“胶水”以及如何以及在何处应用胶水的自由裁量权(以及良好的剂量)非 NLP 技术,例如知识表示问题,如下所述)。
关于知识表示
如上所述,仅 POS 标记并不是 NLP 管道的充分元素。本质上,词性标记将添加有关文本中每个单词的信息,指示该词的 [可能] 语法角色(如名词、形容词、动词和代词等)。这个词性信息非常有用,因为它允许,对于例如,随后将文本分块成逻辑相关的词组和/或更精确地查找字典、分类法或本体中的单个词。
为了说明某些“问答系统”可能需要的信息提取类型和基础知识表示,我将讨论各种语义搜索引擎中使用的通用格式。但是请注意,对于语义搜索,这种格式可能比规定性更具概念性,并且其他应用程序(例如专家系统或翻译机器)还需要其他形式的知识表示。
这个想法是使用 NLP 技术和支持数据(从简单词典的简单“查找表”,到分类的树状结构,再到用专门语言表达的本体)从文本中提取实体的三元组,结构如下:
- 代理人:某事或某人“做”某事
- 动词:正在做什么
- 对象:完成“做”的人或物品(或更一般地说,关于“做”的一些信息的补充)
示例:
猫/代理吃/动词鼠标/对象。
John-Grisham/agent write/动词 The-Pelican-Brief/对象
奶牛/代理生产/动词牛奶/对象
此外,这种三元组,有时称为“事实”,可以分为与特定语义模式相对应的各种类型,通常围绕动词的语义组织。例如,“ Cause-Effect ”事实有一个动词来表达某种因果关系,“ Contains ”事实有一个动词来暗示容器到容器的关系,“ Definition ”事实用于定义代理/主体的模式[如果仅部分]由对象(例如“猫是哺乳动物”)等。
人们可以很容易地想象如何查询这些事实数据库以提供问题的答案,并提供各种智能和服务,例如同义词替换或提高问题答案的相关性(与普通关键字匹配相比)。
真正的困难在于从文本中提取事实。许多 NLP 功能都为此目的而发挥作用。例如,NLP 管道中的步骤之一是用它们引用的名词替换代词(回指解析或更一般地 NLP 术语中的共指解析)。另一个步骤是识别命名实体:人名、地理位置、书籍等( NLP 术语中的NER)。另一个步骤可能是重写由“AND”连接的子句,以便通过重复隐含的语法元素来创建事实。
例如,上面的 John Grisham 示例可能来自文本摘录,例如
Author J. Grisham was born in Arkansas. He wrote "A time to Kill" in 1989 and "The Pelican Brief" in 1992"
Getting toJohn-Grisham/Agent wrote/Verb The-Pelican-Brief/Object
暗示(除其他外):
- 将“J. Grisham”和“The Pelican Brief”识别为特定实体。
- 在第二句中将“He”替换为“John-Grisham”。
- 将第二句重写为两个事实:“John-Grisham 在 1989 年写了 A-time-to-kill”和“John-Grisham 在 1992 年写了 The-Pelican-brief”
- 删除“in 1992”部分(或者更好的是,创建另一个事实,一个“时间事实”:“The-Pelican-brief/Agent is-related-in-time/verb year-1992/object”)(顺便说一句,这将也暗示已确定
1992
为“年”类型的时间实体。)
简而言之:信息提取是一项复杂的任务,即使应用于相对有限的领域以及利用库中可用的现有 NLP 功能时也是如此。这肯定是一个比仅仅从形容词和动词中识别名词更“混乱”的活动;-)