4

最近我读了一些关于 NLP 的文章,到目前为止,我对一切如何工作有了一个(非常)基本的概念,从句子拆分到 POS 标记,以及知识表示。

我知道那里有各种各样的 NLP 库(主要是 Java 或 Python),并且已经找到了一个 .NET 实现(SharpNLP)。实际上已经很出色了。无需编写任何自定义处理逻辑;只需使用它们的功能,瞧!用户输入被很好地分开并带有 POS 标记。

如果我的主要动机是构建一个问答系统(类似于聊天机器人),我不明白从这里去哪里。我可以使用哪些库(最好是 .NET)?如果我想构建自己的知识库,我应该如何表示我的知识?我是否需要将带有 POS 标记的输入解析为我的数据库可以理解的其他内容?如果我使用的是 MS SQL,是否有任何库可以帮助将 POS 标记的输入映射到数据库查询?或者我是否需要根据程序语义(我已阅读)编写自己的数据库查询逻辑?

当然,下一步是制定一个结构良好的答复,但我想我可以把它留到以后。现在困扰我的是该领域缺乏资源(知识表示NLP 到 KB/DB-retrieval),如果你们中的任何人可以提供您的专业知识,我将非常感激 :)

4

1 回答 1

9

这是一个非常广泛的问题,因此它几乎不适合 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 功能时也是如此。这肯定是一个比仅仅从形容词和动词中识别名词更“混乱”的活动;-)

于 2013-02-20T06:24:13.600 回答