65.9K
CodeProject 正在变化。 阅读更多。
Home

邓白氏 - 自然语言接口

starIconstarIconstarIconstarIconstarIcon

5.00/5 (4投票s)

2013年8月1日

CPOL

12分钟阅读

viewsIcon

26362

downloadIcon

211

利用人工智能和自然语言处理扩展 D&B API 的功能和实用性。

在线演示   

适用于 D&B 开发者沙箱的邓白氏自然语言界面现已上线。 

 

 点击此处立即使用。 
 
 

如何使用演示 

在查询数据集时,你需要多做一步,即在一个单独的输入框中指定你想要查找的公司类型,而不是用于筛选条件的输入框。最终版本将不会有此限制。我过去创建的代码成功地从自由格式的句子中解析出复杂元素,例如公司类型。这很直接但耗时,而且没有足够的时间来实现该功能。因此,目前只需记住将你正在寻找的公司类型放入行业描述输入框,而包含筛选条件的其余查询内容放入筛选条件输入框。

例如,不要尝试将以下内容输入到筛选条件输入框中:

"由得克萨斯州女性拥有的会计师事务所。"

而是将“会计”放入行业代码描述输入框,将“由女性拥有”放入筛选条件输入框。 

简介

邓白氏 API 是一个充满利润丰厚且有用的商业信息的宝库。它是全新商业应用浪潮的种子,可以利用邓白氏维护的庞大、详细且准确的全球数百万企业数据库中的宝贵公司数据。诀窍在于提供一个智能界面,使用户查找所需信息尽可能轻松。

当前的界面要求用户填写复杂的表格,在 10 个不同的 D&B 数据库中浏览各种字段的海洋,同时还必须知道为不同字段输入正确的值才能找到他们正在寻找的公司。不幸的是,这需要用户学习很多东西。他们不仅需要知道如何将他们的查询映射到大量可用字段,还需要知道要使用哪些正确的数据库。遗憾的是,这导致了以下常见的最终结果

  •      用户没有找到他们想要的,或者只找到他们想要的很小一部分
  •        用户因沮丧而放弃,错误地认为数据不存在
  •          一旦用户通过艰苦的工作和反复试验的繁琐迭代过程成功地完成了一些查询,他们就会停止探索数据库。  这很可惜,因为他们最终会低估那些数据库中隐藏的大量数据,而只机械地重复他们设法成功的查询。

解决这种情况的方法是使用自然语言界面,它负责将用户的查询转换为他们想要的结果。他们知道如何请求他们想要的数据,只是不知道如何以易于映射到 D&B API 的方式请求。解决方案是提供一个为他们完成映射和转换工作的界面。

时间限制

注意:本文介绍的应用程序不完整。鉴于比赛截止日期,没有足够的时间进行完整的实现。因此,我没有时间向您展示 C# 代码,该代码将聊天机器人创建的符合查询表达式转换为检索向用户显示的实际 D&B 数据的数据库扫描操作。但是,我已将聊天机器人源文件作为下载包含在内。这些文件将准确地向您展示我如何使用 ChatScript 聊天机器人引擎从用户查询中执行实体提取。本文稍后我将解释这些源文件的工作原理以及我通常如何将聊天机器人输出转换为 D&B 查询。经验丰富的 C# 程序员应该能够使用此信息重新创建所演示的自然语言界面。 

限制

由于时间限制,该应用程序在查询处理能力方面也存在一些明显的缺陷。这些缺陷并非由于技术障碍。它们相对容易解决,我过去在其他应用程序中也解决过。同样,只是没有时间,但最终版本不会有这些限制。以下是它们的一些列表,以便您了解为什么某些查询不起作用

  • 日期相关查询
  • 数字数量相关查询
  • 仅支持 AND 逻辑,不支持 OR。您不能进行诸如“破产或停业的公司”之类的查询。您可以进行诸如“位于德克萨斯州、破产且有法律问题的公司”之类的查询。 
  • 许多邓白氏数据字段实施(请参阅下面的可用字段列表)。 

即使存在这些明显的遗漏,该应用程序仍然提供了大量的实用价值,并且在这个困难的查询环境中明确展示了自然语言界面的强大功能和优势。 

注意:您也无法进行跨数据库查询。例如,您不能查找由女性拥有的破产公司,因为这需要扫描公共记录和女性拥有企业数据库。这不是应用程序的限制,当然也不是广泛而彻底的完整 D&B 数据集的限制。这是为本演示应用程序提供数据的 D&B 沙箱数据集的限制。该数据集是完整 D&B 数据集的一个小S子集。不幸的是,特定示例数据库中的许多公司在其他示例数据库中没有相应的记录,这使得跨数据库扫描变得不可能。作为付费客户获得的完整 D&B 数据集没有这个问题。 

可用字段列表  

以下是您可以使用演示应用程序查询的字段列表
  • 城市
  • 状态
  • 行业描述(使用IndustryDesc1字段,如果该字段不存在,则使用Company名称字段)。 
  • 国会区
  • 破产指标
  • 停业指标
  • 禁入(禁止与联邦政府开展业务)
  • 女性、退伍军人、少数族裔或弱势群体拥有的企业 
  • 节能公司(“绿色”企业)
  • 有(或没有)法律问题(如诉讼、留置权或判决)的企业 
D&B 数据集中大量的其他字段可以轻松添加到系统中。同样,时间是限制因素。但这足以说明,与现有方法相比,使用简单的英语查询 D&B 数据集要容易得多。这里只是一些示例查询
  • "显示德克萨斯州的破产公司" 
  • "给我一份在加利福尼亚州倒闭的公司列表" 
  • "我想要一份在第 28 国会区由拉美裔美国人拥有的企业列表" 
  • "哪些企业被禁止与联邦政府合作?" 
  • "可以与联邦政府合作但有法律问题的企业" 
  • "可以与联邦政府合作但从未有过诉讼的企业" 
  • "绿色公司造船商"。 (请记住,“造船商”应放在行业描述输入框中,“绿色公司”应放在筛选条件输入框中。) 
以及大量的其他查询,因为在向演示应用程序提问时,您无需采用特定的语法或正式结构。

实现自然语言前端 

必备组件 

首先,将 D&B 开发者沙箱 API 安装为服务。这非常容易,并且有很多详细的教程,例如这个,所以没有必要在这里重复信息来重新发明轮子。您可以在这里找到开发者沙箱的服务根 URL。 

red bullet 你需要对强大的开源 ChatScript 聊天机器人引擎有一个基本的了解。该软件是这个演示应用程序的前端,它将普通的英语查询转换为 C# 代码用于对 D&B 数据集进行实际查询的缩写命令语言。它是应用程序中进行自然语言处理的部分。请先阅读我为 Azure 开发者挑战编写的这篇简短的 ChatScript 教程。它将向你展示如何设置自己的 ChatScript 服务器并教你 ChatScript 脚本编写的基础知识。 

使用 ChatScript 进行实体识别 

解析用户查询时需要解决的问题称为实体识别。我们需要从用户输入中提取映射到 D&B 数据集中实际字段的离散元素。让我们从一个简单的查询开始

“Show me companies that have not gone bankrupt” 

这个自然语言查询映射到名为 Bankruptcyindicator 的具体字段,但只有当该字段包含字母“B”时才成立。简而言之,我们希望将该用户输入转换为这个可操作的条件

BankruptcyIndicator == “B”

我们如何使用 ChatScript 来做到这一点?在随附的 ChatScript 源文件中,您会找到以下规则,该规则从用户查询中提取此实体

u: ( $bot=bankrup _~query_relation *~2 bankrupt* )
    ^QUERYOUTPUT('_0 (Bankruptcyindicator) (B))

u”字符告诉 ChatScript 我们要响应问题或陈述。规则模式中的此元素

$bot=bankrupt

告诉 ChatScript 我们想从当前活跃的聊天机器人中选择名为“bankrupt”的聊天机器人。这将在下面的“聊天机器人挑战赛”部分中讨论。第一个规则中的下一个元素是

_~query_relation 

这告诉 Chatscript 我们想要捕获 ~query_relation 概念集中的任何单词。这是该概念集的定义

concept: ~query_relation [not never less_than less_than_or_equal_to greater_than greater_than_or_equal_to]

如果找到该元素,它将被捕获到一个我们可以稍后检查的变量中。如果没有,如果规则模式的其余部分匹配,该规则仍然会匹配。此元素用于捕获用户指定的逻辑关系。在我们上面的示例查询中,这将捕获查询中的“not”一词,以便我们知道用户想要那些没有破产的公司。

在匹配模式中跟随该元素的是这个

*~2

这允许我们跳过查询关系元素和匹配模式中的下一个元素(即词干“bankrupt*”)之间的单词。这个元素的意思是“跳过我左边的元素(~query_relation)和我右边的元素(bankrupt*)之间最多 2 个单词,但如果在这两个元素之间没有找到任何单词,也没关系”。这种模式允许我们匹配查询关系和 bankrupt 之间有填充词的短语,例如

  • 未破产(零填充词)
  • 没有破产(1 个填充词“gone”) 

匹配模式中的第三个也是最后一个元素是

bankrupt*

此元素使用 * 运算符来词干化单词。这告诉 ChatScript 匹配单词“bankrupt”或以该单词中的字母开头的任何单词,例如“bankruptcy”。此规则的最终结果是灵活的模式匹配操作,它处理用户查询破产公司的主要方式。

QueryOutput 宏 

破产实体提取器的第二行是这个

^QUERYOUTPUT('_0 (Bankruptcyindicator) (B))

在附带的下载中,您将在控制文件中找到此代码

# ======================== MACROS =====================

outputmacro: ^QUERYOUTPUT(^relphrase ^fields ^values)
	if(^relphrase)
	{
		$$rel = unknown
		if (^relphrase == not){$$rel = n}
		if (^relphrase == never){$$rel = n}
		if (^relphrase == less_than){$$rel = lt}
		if (^relphrase == less_than_or_equal_to){$$rel = lte}
		if (^relphrase == greater_than){$$rel = gt}
		if (^relphrase == greater_than_or_equal_to){$$rel = gte}
		if (^relphrase == equals){$$rel = eq}
		if (^relphrase == equal_to){$$rel = eq}
	}
	else
	{
		$$rel = "equals"
	}
	{$$rel ^fields : ^values}

QUERYOUTPUT 是一个输出宏,它是一个用户定义的函数,用于生成聊天机器人响应查询时将输出的文本。大部分代码用于获取用户输入中找到的查询关系(如果有),并将其转换为 C# 查询处理代码能够理解的符合格式的字符串。在我们的示例查询中,此代码将“not”转换为单个字符“n”。最后,它创建格式化输出字符串,并将其传递给 C# 查询处理代码。

在对示例查询进行预处理后,格式化输出会是什么样子?让我们再次回到破产实体提取器中的 QUERYOUTPUT 宏调用

^QUERYOUTPUT('_0 (Bankruptcyindicator) (B))

第一个要素是这个

'_0

它指示 ChatScript 将找到的查询关系传递给 QUERYOUTPUT。在这种情况下,它是匹配模式中 _~query_relation 变量捕获元素中的单词“not”。第二个元素是

(Bankruptcyindicator)

如上所述,这是 D&B 数据集中实际字段的名称,当我们在 D&B PublicRecords 数据库中扫描破产公司时需要使用它。因此,对 QUERYOUTPUT 的调用的第二个参数是字段列表。第三个也是最后一个元素是

(B)

这是我们需要在 Bankruptcyindicator 字段中找到的字段值,用于为我们的搜索结果选择一家破产公司。让我们再看一下 QUERYOUTPUT 定义中的最后一行

{$$rel ^fields : ^values}

根据我们上面建立的参数值,C# 后处理代码将接收到的实际字符串是

{n ( Bankruptcyindicator ): ( B )}

这告诉后处理代码

  • 逻辑关系是否定(不)
  • 我们需要比较的字段是名为 Bankruptcyindicator 的单个字段
  • 我们需要找到的用于判断公司是否破产的单个值是字母“B

聊天机器人规则摘要  

  • 每个聊天机器人的主要目的是提取单个实体。 
  • 每个聊天机器人都有一个或多个规则来完成此任务。
  • 匹配规则的输出是 C# 后处理代码执行数据库搜索所需的具体信息,即一个三元组,包含逻辑关系适用的数据库字段和列出的数据库字段的适用字段值 

聊天机器人实体挑战赛 

最后一块拼图是聊天机器人实体挑战赛。C# 后处理代码中有一个简单的代码块,如下所示

// Create the Chatbot Entity Extraction Gauntlet
List<string> listChatBotNames = new List<string>();

listChatBotNames.Add("cong");
listChatBotNames.Add("table");
listChatBotNames.Add("legal");
listChatBotNames.Add("outofb");
listChatBotNames.Add("bankrup");
listChatBotNames.Add("state");
listChatBotNames.Add("city");
listChatBotNames.Add("debar");
listChatBotNames.Add("minorit");
// Query each available sub-parser (named chatbot).
foreach (var chatBotName in listChatBotNames)
{
    // We have what we need.  Make the first request to the D&B ChatScript server.
    string strResponse = GetChatBotResponse(strMessage, strLoginName, chatBotName);
    // Accumulate responses and process.
    …
}

上面的代码为清晰起见已摘录和缩写。但正如您所看到的,我们的 ChatScript 实例针对当前支持的每个需要提取的实体查询了一次。在我们的当前示例中,当选择“bankrupt”聊天机器人时,实际调用将如下所示

GetChatBotResponse(“Show me companies that have not gone bankrupt”, “guest”, “bankrupt”);

如上所示,此调用的输出将是

{n ( Bankruptcyindicator ): ( B )}

当然,对于其他查询会有不同的响应,对于带有多个提取的较长查询,会有多个子查询三元组,如上所述。例如,这个用户查询

Show me companies that have not gone bankrupt in Texas and are not debarred

当聊天机器人挑战赛循环完成时,将返回以下子查询三元组

{n ( Bankruptcyindicator ): ( B )}

{n ( Debarrment ): ( Y )}

{unknown ( StateAbbrv ): Texas}

此三元组列表将被转换为具体的数据库查询,从而向用户返回搜索结果。

结论 

red bullet邓白氏 API 确实开创了令人兴奋的商业应用新浪潮。凭借其数百万家企业的关键统计数据宝库,它本身就可以成为许多引人入胜且利润丰厚的软件应用的来源。当与其他数据集结合使用时,只有您的想象力才能限制其用途。从选择特定类别的企业进行销售或服务,到创建突出服务类型公司的地图,或为那些只想与环保或没有法律问题的企业合作的人创建地图;大量强大的新应用开发理念正等着您去探索。

注意:如上所述,有了随附的 ChatScript 源文件,经验丰富的 C# 开发者应该拥有所需的一切,可以使用我在此处使用的相同技术来构建自己的邓白氏开发者沙箱 API 自然语言界面。 

© . All rights reserved.