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

AlchemyAPI、OpenCalais 和 Semantria 这三款自然语言处理器评测

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.91/5 (17投票s)

2014年7月28日

CPOL

25分钟阅读

viewsIcon

57907

在本文中,我将评测三款 NLP 服务

 

源代码

本文的源代码位于:https://github.com/cliftonm/nlp

要运行代码,您需要注册每个 NLP 提供商并获取 API 密钥(下文讨论)。

引言

我一直在研究自然语言处理器 (NLP),并认为我会分享我的调查结果。我们将查看

  • 定价
  • .NET 支持
  • API 调用示例
  • NLP 结果

我评测了三个 NLP 提供商:AlchemyAPI、OpenCalais 和 Semantria。它们都提供类似的服务,即它们会处理文本,生成实体列表和这些实体的相关性,以及每个提供商独有的其他信息,我也会简要探讨这些信息。我特别感兴趣的是使用 NLP 从网站(博客、新闻源、文章等)获取语义内容,并开始投入研究 AlchemyAPI、OpenCalais 和 Semantria 这三款 NLP 的价格和功能。您还可以阅读我关于如何使用 AlchemyAPI 服务解析 RSS 源的文章此处。出于我的特定目的,我感兴趣的是一种低文档量服务,希望能免费用于有限使用,并且可以提供网页内容抓取。当我开始调查这三项服务时,我想到这可能对其他人也有用,因此本文应运而生。

关于我的具体要求(针对不同的项目),结果是只有 AlchemyAPI 和 OpenCalais 提供了我的小批量需求的价格点(免费),而且只有 AlchemyAPI 原生提供了网页抓取功能,而不是使用可能成本高昂的第三方软件包。话虽如此,我的要求显然与您的不同,您应该相应地选择提供商。

什么是 NLP?

“自然语言处理 (NLP) 是计算机科学、人工智能和语言学领域,关注计算机与人类(自然)语言之间的交互。因此,NLP 与人机交互领域相关。NLP 中的许多挑战涉及自然语言理解,即使计算机能够从人类或自然语言输入中获取含义,而另一些挑战涉及自然语言生成。”维基百科

NLP 的用途

借鉴了另一个我在此处未评测的 NLP 提供商 Smartlogic 的内容

“实时获取元数据的能力意味着可以与大数据流一起提供内容中锁定的信息。正是这些元数据将帮助您将大数据转化为智能数据,用于决策支持。”

以及...

“生成的元数据驱动一系列业务关键型任务,包括”

  • 搜索的语义用户体验
  • 文本分析
  • 由含义驱动的工作流流程
  • 涉及非结构化内容的法规遵从
  • 内容管理的自动分类
  • 使用内容中锁定的信息进行决策支持
  • 知识管理
  • 记录管理的策略应用
  • 内容可视化
  • 内容货币化
  • 改进 SEO
  • 文本挖掘

我认为这说得很好。

但 NLP 到底能做什么?

我在此处评测的三款 NLP 服务都会解析文本并确定所谓的“实体”。虽然每项服务都给出了一些实体示例,但只有 Semantria 提供了关于实体是什么的清晰定义:“Semantria 的命名实体提取 (NER) 功能自动从文本中提取专有名词,例如人名、地名、公司、品牌、职位等。每个提取的命名实体都被分类、标记并分配一个情感分数,这为每个实体赋予了含义和上下文。”https://semantria.com/features/entity-extraction

换句话说,NLP 的主要目的是提取名词,确定其类型,并提供文本中实体的“评分”(相关性或情感)。使用相关性,可以过滤实体以保留文档中最相关的实体。使用情感分析,可以确定文档中实体​​的整体情感,这有助于确定文档中关于实体的“语气”——例如,实体“主权债务”在文档中是被描述为负面、中立还是正面?NLP 还能够提取更高级的概念,在 OpenCalais 的情况下,还可以提取事件。

根据 OpenCalais 文档:“实体相关性分数在输入文本之间是可比较的。这意味着您可以使用实体相关性分数来确定集合级别的实体相关性,而不仅仅是文档级别。”http://www.opencalais.com/documentation/calais-web-service-api/api-metadata/entity-relevance-score)如果此含义可以应用于其他提供商,那么它对于与其他文档进行比较是一个有用的值,但如果没有“相关性”一词的明确含义,我不确定这种比较的结果实际上意味着什么。据我所知,Semantria 是唯一能够原生比较文档的 NLP 服务,这是一个我在此文章中未探讨的功能。

实体提取

实体是指人、公司、组织、城市、地理特征等等。除了实体提取之外,每项服务还提供关于实体的附加信息,通常是相关性或情感。

AlchemyAPI 实体

AlchemyAPI 的实体具有几个属性

  • 类型
  • 相关性
  • Count
  • 文本

此外,情感分析默认关闭,因为它会占用额外的每日/每月额度交易计数。

AlchemyAPI 还支持“链接数据”的概念。“链接数据是一种通过可解引用的 URI 在网络上公开、共享和连接数据的方法。链接数据旨在通过在网络上以 RDF 形式发布各种开放数据集,并在不同数据源的数据项之间设置 RDF 链接,来扩展网络上的数据公共。链接数据云目前包含超过 74 亿个 RDF 三元组,通过 1.42 亿多个 RDF 链接相互连接。”http://www.alchemyapi.com/api/linked-data-support/)。链接数据在演示程序中的概念(见下文)中部分演示。目前,Alchemy 借鉴了几个链接数据资源(参见上面的链接以及http://linkeddata.org/)。

OpenCalais 实体

请注意,在此演示中,我使用的是 OpenCalais 的“简单格式”输出。据 Ofer Harari 称

“简单格式输出在功能方面是最差的格式(简单格式用于从 Calais 快速简便地输出。不适用于详细响应)。标准格式是 RDF 或 JSON。这些输出包括 Open Calais 可以提取的所有元数据。”

“资源描述框架(RDF)是万维网联盟(W3C)规范[1]家族,最初设计为元数据数据模型。它已被用作概念描述或建模网络资源中实现的信息的通用方法,使用各种语法符号和数据序列化格式。它也用于知识管理应用程序。”http://en.wikipedia.org/wiki/Resource_Description_Framework

解析生成的 RDF 超出了本文的范围。

一个 OpenCalais 实体有几个属性

  • 频率
  • 相关性
  • 类型

OpenCalais 支持将实体链接到 DBpedia、Wikipedia、Freebase、Reuters.com、GeoNames、Shopping.com、IMDB、LinkedMDB。此功能未在演示代码中演示。另请参阅 http://linkeddata.org/)。

Semantria 实体

Semantria 的实体具有几个属性(这与他们网页上的文档 https://semantria.com/features/entity-extraction 基本冲突)。

  • 类型
  • 证据
  • 自信的
  • 关于
  • 实体类型
  • 标题
  • Label
  • 情感分数
  • 情感极性

其他语义信息

此外,每个都提供几个额外的解析类别。请注意,这些类别的名称及其属性源自 API 名称。

AlchemyAPI

  • 关键词
    • 关键字的属性是文本和相关性
  • 概念
    • 概念的属性是文本、相关性、dbpedia(链接数据)、freebase(链接数据)和 opencyc(链接数据)。
  • 关系 - “AlchemyAPI 提供了识别已识别的主体-动作-对象关系的主体和对象中的命名实体的能力,支持高级实体识别功能,包括消歧、共指解析和链接数据输出。”http://www.alchemyapi.com/api/relation/entities.html)我没有在演示代码中显示关系信息。

OpenCalais

  • 主题
    • 主题的属性是值、分数和分类法(到目前为止我只看到“Calais”作为分类法)。
  • 事件
    • 事件的属性是事件名称

Semantria

  • 主题
    • 属性有 Title、Type、Hitcount、StrengthScore、SentimentScore、Label 和 SentimentPolarity
  • 主题 - “Semantria 提取内容中的主题,以便您可以确定并跟踪一段时间内出现的趋势。主题是从文本中提取的名词短语,是识别内容中主要思想的主要方式。此外,Semantria 为每个提取的主题分配一个情感分数,因此您将了解主题背后的语气。”https://semantria.com/features/themes
    • 属性是证据、关于、强度分数、情感分数、情感极性、标题

照应解析

正如 OpenCalais 的人们指出的那样,NLP 包括一种叫做照应解析的东西

“在语言学中,照应(/əˈnæfərə/)是指其解释依赖于语境中另一个表达(其先行词或后行词)的表达的使用。在“Sally 到了,但没人看到她”这个句子中,代词“她”是照应的,指代 Sally。术语“照应”表示指代的行为,而实际进行指代的词有时被称为照应词(或前指词)。”http://en.wikipedia.org/wiki/Anaphora_%28linguistics%29

起初,我对实体计数为何常常高于这些实体的实际实例感到困惑,而上述内容解释了原因。

三个竞争者

我们将很快了解这三家提供商对自己的评价。不过,首先我想谈谈文档处理、网络内容抓取和初始化。

文档和网络内容抓取

所有三个提供商都可以处理文本文档,但只有 AlchemyAPI 直接作为 API 的一部分提供网络内容抓取。OpenCalais 和 Semantria 都是基于文档的 NLP,因此需要事先完成网页抓取。虽然 AlchemyAPI 使用自己的网页抓取技术,但 Semantria 可以与 Diffbot 集成以提供此服务。出于本次演示的目的(因为 DiffBot 只提供 7 天有限免费试用),我将使用 AlchemyAPI 的 URLGetText API 方法为 OpenCalais 和 Semantria NLP 提供抓取的内容。

/// <summary>
/// We use AlchemyAPI to get the page text for OpenCalais and Semantria.
/// </summary>
protected string GetPageText(string url)
{
  AlchemyWrapper alchemy = new AlchemyWrapper();
  alchemy.Initialize();

  string xml = alchemy.GetUrlText(url);
  XmlDocument xdoc = new XmlDocument();
  xdoc.LoadXml(xml);

  return xdoc.SelectSingleNode("//text").InnerText;
}

为了减少对 AlchemyAPI 服务器的访问次数,提取的 URL 内容会根据 URL 散列码进行缓存

/// <summary>
/// Uses AlchemyAPI to scrape the URL. Also caches the URL, so
/// we don't hit AlchemyAPI's servers for repeat queries.
/// </summary>
protected string GetUrlText(string url)
{
  string urlHash = url.GetHashCode().ToString();
  string textFilename = urlHash + ".txt";
  string pageText;

  if (File.Exists(textFilename))
  {
    pageText = File.ReadAllText(textFilename);
  }
  else
  {
    pageText = GetPageText(url); 
  }

  File.WriteAllText(textFilename, pageText);

  return pageText;
}

这样,传递给每个 NLP 的文本将是相同的。如果您不处理来自网页(博客、新闻源、文章等)的内容,那么这对 OpenCalais 和 Semantria 来说就不是问题了。

初始化和限制

AlchemyAPI 和 OpenCalais 的初始化非常简单。但是,您可能会遇到的一个问题是返回的实体数量(或其他项目)的限制。OpenCalais 不施加任何限制,而 AlchemyAPI 默认限制为 50 个实体(我记得最大为 250 个),Semantria 默认限制为 5 个(最大为 50 个)。更改 AlchemyAPI 中的限制非常简单——您在请求处理时传入一些额外的参数

eparams = new AlchemyAPI_EntityParams();
eparams.setMaxRetrieve(250);

Semantria 更侧重于批量文档处理。您可以根据要处理的文档选择大量不同的配置。但是,这些配置的初始化需要一些时间与服务器通信并获得响应。在演示代码中,我首先请求当前配置(最初有 8 个,基于语言),然后我更改限制(最大为 50),然后必须上传这个新配置。

protected void IncreaseLimits()
{
  // This takes considerable time to get the configurations back from the server.
  List<Configuration> configurations = session.GetConfigurations();
  config = configurations.FirstOrDefault(item => item.Language.Equals("English"));

  if (config != null)
  {
    config.Document.NamedEntitiesLimit = 50;
    config.Document.ConceptTopicsLimit = 50;
    config.Document.EntityThemesLimit = 50;
    session.UpdateConfigurations(new List<Configuration>() { config });
  }
}

这一切都需要时间,这也是应用程序启动时“处理”按钮长时间禁用的原因。但是,一旦完成,配置就可以使用,而不会进一步产生时间损失。有趣的是,配置在会话之间是持久的——我假设它们与您的 API 密钥相关联,因此一旦创建了配置,从技术上讲,除非我想进行更改,否则我不需要运行此步骤。因此,在您首次配置 Semantria 后,可以注释掉 Initialize 方法中的 IncreaseLimits() 方法

public void Initialize()
{
  string apikey = File.ReadAllText("semantriaapikey.txt");
  string[] keys = apikey.Split('\r');
  consumerKey = keys[0].Trim();
  consumerSecret = keys[1].Trim();
  serializer = new JsonSerializer();
  session = Session.CreateSession(consumerKey, consumerSecret, serializer);

  IncreaseLimits();     // <---- Comment me out when the limits have been increased after the first-ever run
}

AlchemyAPI

http://www.alchemyapi.com/

“AlchemyAPI 正在帮助开创计算机理解人类语言和视觉的能力。我们用于实时文本分析和计算机视觉的网络服务为您提供所需的情报,将大量非结构化数据转化为推动您业务发展的行动。现在,您可以轻松地对每秒产生的大量网页、文档、推文和照片进行情感分析、关键词提取、实体提取、图像标记等等。”

我立刻注意到 AlchemyAPI 的独特之处之一是它不仅对文本而且对图像进行分析。

AlchemyAPI 支持以下八种语言的内容的命名实体、关键词和文本提取

  • English
  • French
  • German
  • Italian
  • 葡萄牙语
  • 俄语
  • 西班牙语
  • 瑞典语

内容情感分析目前支持英语和德语,对其他语言的支持正在开发中。

为了避免对计时结果产生偏差,我首先使用 AlchemyAPI 请求页面文本,然后将此文本输入到所有三个 NLP 中。应该指出的是,这会导致 AlchemyAPI 的计时结果比我直接提供网页 URL 更差——这意味着如果您向 AlchemyAPI 提供 URL,它的性能会更好,在许多情况下,比其他两个显著更好。

OpenCalais

http://www.opencalais.com/

“我们希望让世界上所有的内容更易访问、互操作且更有价值。有些人称之为 Web 2.0、Web 3.0、语义网或巨型全球图谱——我们称之为 Calais。Calais 是一个快速增长的功能工具包,可让您轻松地将最先进的语义功能整合到您的博客、内容管理系统、网站或应用程序中。”

OpenCalais 支持英语、法语和西班牙语。

OpenCalais

Semantria

https://semantria.com/

“Semantria 将文本和情感分析应用于推文、Facebook 帖子、调查、评论或企业内容。Semantria 是一个完整的基于云的文本和情感分析解决方案,于 2011 年推出。它比人类快(60,000 倍),比两个人准确(80% 的时间更智能),并且在亚马逊云中运行,Semantria 从任何给定文本中提取含义、语气以及更多信息。”

Semantria 有趣的一点是它的 Excel 插件:“Semantria 是唯一适用于 Excel 的文本和情感分析解决方案。它将 Excel 变成一个强大易用的工具,用于监控和可视化 Twitter、Facebook、调查和其他非结构化数据。”

此外,Semantria 支持以下语言

  • 英语(美国/英国)
  • 法语(法国/加拿大)
  • 西班牙语
  • 葡萄牙语
  • Italian
  • German
  • 普通话(繁体和简体)
  • Korean
  • 日语(测试版)
  • 马来语(Bahasa Melayu)
  • 印尼语(Bahasa Indonesia)
  • 新加坡式英语(新加坡口语)

此外,Semantria 与 Diffbot 紧密集成,用于网页抓取。

定价

定价差异很大,取决于每日/每月处理的交易数量和客户支持级别。

AlchemyAPI

我在此处描述的定价可能在撰写本文时不在 AlchemyAPI 网站上,因为我直接收到通知,定价结构正在更改。

共有五个等级

  1. 免费:1,000 次交易/天,支持 5 个并发请求,无支持
  2. 250 美元/月:90,000 次交易/月,5 个并发请求,电子邮件支持
  3. 750 美元/月:300,000 次交易/月,15 个并发请求,电子邮件支持
  4. 1750 美元/月:3,000,000 次交易/月,25 个并发请求,电子邮件和电话支持,正常运行时间保证
  5. 超过 3M 次交易的自定义价格。

对于学术界,AlchemyAPI 在免费层中提供每日增加的交易数量。

还有一个您可以选择的“性能和支持包”

  • 免费
  • 专业版计划 - 595 美元/月
  • 企业版计划 - 1995 美元/月

以及按月订阅选项

  • 前 250,000 次交易/月:0.0035 美元/次交易
  • 接下来的 750,000 次交易/月:0.0015 美元/次交易
  • 接下来的 1,000,000 次交易/月:0.00075 美元/次交易
  • 接下来的 3,000,000 次交易/月:0.00050 美元/次交易
  • 超过 5,000,000 次交易/月:0.0035 美元/次交易

OpenCalais

免费:每个许可证每天 50,000 次交易,每秒 4 次交易

商业许可证:“我们的商业服务提供与 OpenCalais 相同的功能,但具有生产级强度。该服务提供高性能 SLA,每日交易限制为 100,000 次交易,并增强到每秒 20 次交易。可提供高达每天 2,000,000 次交易的额外容量块。ProfessionalCalais 满足大型出版商的独特需求。ProfessionalCalais 可作为年度合同提供。”

Semantria

共有五个等级

  1. 免费试用:前 10,000 次交易(总数,非每月)免费,功能齐全(但在下面的 API 讨论中查看我遇到的问题)
  2. 999 美元/月:Excel 席位,无限交易
  3. 999 美元/月:API 标准版,100,000 次交易/月,有某些限制(如支持的语言数量)
  4. 1999 美元/月:API 高级版,1,000,000 次交易/月
  5. 超过 1M 次交易/月的自定义价格

与 Semantria 集成进行网页抓取的 DiffBbot 有自己的定价结构,我不知道它如何改变定价结构。

API

每个提供商都要求您获取产品密钥以与 API 交互,这是一个简单的过程。我没有包含我的密钥,因此要运行代码,您需要注册每个提供商以获取您自己的 API 密钥并将其放入相应的文本文件(请参阅代码中的文件名)。因为我正在使用 C# / .NET,所以我获得了 .NET 库来处理 SOAP/REST 调用,要么直接来自提供商,要么是提供商推荐给我的。所有 API 都提供了示例和不同程度的单元测试。

AlchemyAPI

简单来说,AlchemyAPI 只是工作了。它提供了我正在寻找的功能(给它一个 URL,它返回语义结果),并且它没有任何问题,这与我在 OpenCalais 或 Semantria 的经验不同,尽管事后看来,我与 Semantria 的问题更多地与不完全理解 Semantria 使用的文档排队模型有关。与 AlchemyAPI 提供的 .NET API 接口非常简单,例如

protected AlchemyAPI.AlchemyAPI alchemyObj;

public void Initialize()
{
  alchemyObj = new AlchemyAPI.AlchemyAPI();
  alchemyObj.LoadAPIKey("alchemyapikey.txt");
}

// Process a URL directly.
public DataSet LoadEntitiesFromUrl(string url)
{
  DataSet dsEntities = new DataSet();
  string xml = alchemyObj.URLGetRankedNamedEntities(url);
  TextReader tr = new StringReader(xml);
  XmlReader xr = XmlReader.Create(tr);
  dsEntities.ReadXml(xr);
  xr.Close();
  tr.Close();

  return dsEntities;
}

AlchemyAPI 返回一个 XML 文档,非常适合直接加载到 DataSet 中,如上述代码所示。

我在使用 .NET AlchemyAPI 时遇到的一个问题是,它没有返回有用的异常消息,所以我对其进行了稍微修改,以将服务器返回的消息作为异常的一部分返回

if (status.InnerText != "OK")
{
  string errorMessage = "Error making API call.";

  try
  {
    XmlNode statusInfo = root.SelectSingleNode("/results/statusInfo");
    errorMessage = statusInfo.InnerText;
  }
  catch
  {
    // some problem with the statusInfo. Return the generic message.
  }

  System.ApplicationException ex = new System.ApplicationException (errorMessage);

  throw ex;
}

此更改已整合到 GitHub 上托管的 C# AlchemyAPI 中。

AlchemyAPI 的内容大小限制为 150KB 的清洗文本和 600KB 的 HTML。

OpenCalais

Codeplex 上的 Open Calais .NET 库是三个库中最难使用的,需要我修复实体枚举器。这个库的第一个问题是,解压缩后,所有文件都是只读的。这使得在不先将所有文件和文件夹更改为读写的情况下,无法将项目和解决方案加载到 VS2012 中。

其次,使用他们的示例文档,我收到“未处理的异常:System.ArgumentException:未找到请求的值 'PoliticalEvent'”,因为 CalaisSimpleEntityType 枚举器中缺少类型

// Ignore topics and events are they are processed seperately
if (elementName != "Topics" && elementName != "Event" && elementName != "Topic")
{
  newSimpleEntity.Type = (CalaisSimpleEntityType)Enum.Parse(typeof(CalaisSimpleEntityType), result.Name.ToString());
  yield return newSimpleEntity;
}

为了解决这个问题,我不得不进去修改这个类

public class CalaisSimpleEntity
{
  public string Value { get; set; }
  public int Frequency { get; set; }
  public string Relevance { get; set; }
  public CalaisSimpleEntityType Type { get; set; }
}

这样 Type 就是一个字符串了(为什么它被映射到枚举器我就不知道了)

public class CalaisSimpleEntity
{
  public string Value { get; set; }
  public int Frequency { get; set; }
  public string Relevance { get; set; }
  public string Type { get; set; }
}

以及有问题的代码行

newSimpleEntity.Type = result.Name.ToString();

我还必须修复一个由于类型更改而无法编译的单元测试。

我还发现 Entities、Topics 和 Events 的属性是 IEnumerable's 令人恼火,这意味着您必须显式遍历集合才能获取内容,这实际上涉及对 XML 文档的一些处理。这似乎效率低下,特别是如果集合被不同函数多次迭代,但可以通过将集合转换为列表来解决,就像我在简单的“get”函数中所做的那样,例如

return document.Entities.ToList();

鉴于这些集合的内容不变,我认为没有理由不预先填充这些集合。

我对 OpenCalais 的另一个问题是我的示例文档(维基百科计算机科学页面的文本)导致服务器返回“内容无效”异常。事实证明,有问题的句子是这个

该术语主要用于斯堪的纳维亚国家。此外,在计算的早期,ACM 通信中提出了许多用于描述计算领域从业者的术语——turingineer、turologist、flow-charts-man、applied meta-mathematician 和 applied epistemologist。[34]

并且可以进一步简化为使用“–”字符——Unicode 字符 0x2013“EN DASH”。OpenCalais 显然相当敏感,但我们可以去除 Unicode

// A couple options: http://stackoverflow.com/questions/123336/how-can-you-strip-non-ascii-characters-from-a-string-in-c
string asAscii = Encoding.ASCII.GetString(
  Encoding.Convert(
    Encoding.UTF8,
    Encoding.GetEncoding(
        Encoding.ASCII.EncodingName,
        new EncoderReplacementFallback(string.Empty),
        new DecoderExceptionFallback()
    ),
    Encoding.UTF8.GetBytes(content)
  )
); 

一旦正确净化,解析文档和提取数据的实际调用就非常简单了

CalaisDotNet calais = new CalaisDotNet(apikey, asAscii);
document = calais.Call<CalaisSimpleDocument>();

...

public IList GetEntities()
{
  return document.Entities.ToList();
}

关于 OpenCalais 的其他零碎信息

有一个互补服务 http://semanticproxy.com/,它应该执行内容抓取,但是,当我尝试使用它时(在不同的时间),我不断收到“Java 内存不足”错误。

在此演示代码中,我正在使用“简单格式”输出。据 Ofer Harari 称

“简单格式输出在功能方面是最差的格式(简单格式用于从 Calais 快速简便地输出。不适用于详细响应)。标准格式是 RDF 或 JSON。这些输出包括 Open Calais 可以提取的所有元数据。”

Semantria

我最初发现 Semantria 的 .NET API 使用起来很复杂,但在成功使用后我意识到它对文档处理采用了不同的方法。对于 AlchemyAPI 和 OpenCalais,您发出调用并等待结果。对于 Semantria,它非常以批量文档为中心。发送到 Semantria 服务器的文档会排队,并且可以异步返回结果,或者以与原始输入到队列中不同的顺序返回结果。这使得处理单个文档变得更加复杂(请参阅下面的代码),但显然,当处理批量文档时,Semantria API 的优势更加明显。

还有两种文档分析模式,此处描述:https://semantria.com/support/developer/overview/processing

  1. 详细模式
  2. 发现模式

详细模式

“提交文档排队后,每个文档将独立于其他文档进行分析。Semantria API 将为每个文档返回一个分析结果。”

发现模式

“此方法提交一个文档数组,以便相互关联地进行分析并返回一个输出。发现分析将包含所有文档集合的共同点、情感、命名实体提取、主题和分类的摘要。”

本文仅回顾详细模式,但是,在使用发现模式时,我“发现”了一个文档大小问题——使用我抓取的网页内容字符串,我收到“行太长”异常。似乎发现模式旨在处理较小的数据集,例如段落或单个句子。我不知道发现模式下的行限制是多少。

调用解析器需要轮询以查看文档是否已分析。虽然有 DocsAutoResponse 事件回调,但它并非如此——如果文档排队(这是标准行为),此回调永远不会被调用,我也不确定此事件如何提供帮助,除非它与批量处理相关联。这是解析请求和响应轮询代码

public void ParseUrl(string content)
{
  string docId = Guid.NewGuid().ToString();
  Document doc = new Document() {Id = docId, Text = content};
  docResults = new List<DocAnalyticData>();
  int result = session.QueueDocument(doc, configID);
  DocAnalyticData ret;
  DateTime start = DateTime.Now;

  do
  {
    // Semantria guarantees a result within 10 seconds. But how fast is it really?
    Thread.Sleep(100);
    ret = session.GetDocument(doc.Id, configID);

    if ((DateTime.Now - start).TotalSeconds > 15)
    {
        throw new ApplicationException("Semantria did not return with 15 seconds.");
    }
  } while (ret.Status == Semantria.Com.TaskStatus.QUEUED);

  if (ret.Status == Semantria.Com.TaskStatus.PROCESSED)
  {
    docResults.Add(ret);
  }
  else
  {
    throw new ApplicationException("Error processing document: " + ret.Status.ToString());
  }
}

如本文开头“初始化”部分所述,实体默认数量为 5 个(主题也为 5 个,话题为 10 个)。在本文中,我已将限制增加到 50 个,这是最大值。

运行演示

我使用的屏幕截图来自解析此页面:http://en.wikipedia.org/wiki/Computer_science。您当然可以在演示应用程序中输入您自己的 URL(尝试 Code Project 文章,结果通常很有趣)。处理代码异步运行每个服务请求,将 UI 数据网格更新封送到 UI 线程(未显示)。我还缓存(使用 URL 的哈希码)由 AlchemyAPI 返回的抓取网页,这样在反复测试相同的网页时,我就不会不断向 AlchemyAPI 发出“获取页面内容”请求。

/// <summary>
/// Process the URL with AlchemyAPI, OpenCalais, and Semantra NLP's.
/// </summary>
protected async void Process(object sender, EventArgs args)
{
  btnProcess.Enabled = false;
  ClearAllGrids();
  string url = tbUrl.Text;
  sbStatus.Text = "Acquiring page content...";

  // Eases debugging when we comment out one or more of the NLP's to test the other.
  double alchemyTime = 0;
  double calaisTime = 0;
  double semantriaTime = 0;

  string pageText = await Task.Run(() => GetUrlText(url));

  sbStatus.Text = "Processing results with Alchemy...";

  double alchemyTime = await Task.Run(() =>
  {
    LoadAlchemyResults(pageText);
    return ElapsedTime();
  });

  sbStatus.Text = "Processing results with OpenCalais...";

  double calaisTime = await Task.Run(() =>
  {
    LoadCalaisResults(pageText);
    return ElapsedTime();
  });

  sbStatus.Text = "Processing results with Semantria...";

  double semantriaTime = await Task.Run(() =>
  {
    LoadSemantriaResults(pageText);
    return ElapsedTime();
  });
  
  sbStatus.Text = "Done processing.";

  ReportTimes(alchemyTime, calaisTime, semantriaTime);
  btnProcess.Enabled = true;
}

使用 .NET 的 Task.Run 可以让 UI 保持响应,以便您可以在其他结果仍在传入时与其交互。

密钥

当然,要运行演示,您需要注册每个提供商并获取您自己的 API 密钥。这些密钥将放入 bin\debug 文件夹中的相应文件中

alchemyapikey.txt

[您的密钥]

calaisapikey.txt

[您的密钥]

semantriaapikey.txt

[您的消费者密钥]
[您的秘密密钥]

第二个例子

我决定给这些提供商一些更有趣的东西——鲁道夫·施泰纳讲座系列《社会有机体的更新》中的第三章“文化、法律与经济”。结果很有趣,揭示了三种 NLP 之间的差异。请记住,我正在使用 OpenCalais 的简单格式,因此结果可能无法代表其完整的语义处理能力。解析生成的 RDF 超出了本文的范围。

结果实体

AlchemyAPI 实体

type 相关性 计数 文本
印刷媒体 0.734508 1 法律与经济
犯罪 0.684892 1 垄断
职位 0.635413 1 业务经理
设施 0.61222 1 圣西蒙
职位 0.606995 1 官方
人员 0.602684 1 马克思
人员 0.581026 1 傅里叶

OpenCalais 实体

(未返回主题或事件)

频率 相关性 类型
自然法 2 0.286 行业术语
设计外部系统 1 0.251 行业术语
经济服务 1 0.318 行业术语
经理 1 0.314 职位
政府官员 1 0.239 职位
业务经理 1 0.314 职位
店主 1 0.239 职位

Semantria 实体

类型 证据 自信的 关于 实体类型 标题 Label 情感分数 情感极性
命名 7 True 职位 经理 职位 0.171760261 中性
命名 4 True 人员 马克思 人员 0.294535 中性
命名 2 True 引用 “通过这种社会有机体的形成不可能带来令人满意的条件。这只能通过合适的经济组织来实现。” 引用 0.218072414 中性
命名 1 True 引用 “社会问题” 引用 0 中性
命名 1 True 引用 “简单性” 引用 0.49 中性
命名 1 True 引用 “不言而喻的事实” 引用 0 中性
命名 1 True 引用 “社会问题” 引用 0 中性

AlchemyAPI 概念

文本 相关性 dbpedia freebase opencyc
社会学 0.965445 http://dbpedia.org/resource/Sociology http://rdf.freebase.com/ns/m.06ms6 http://sw.opencyc.org/concept/Mx4rvVvb3pwpEbGdrcN5Y29ycA
法律 0.445281 http://dbpedia.org/resource/Law http://rdf.freebase.com/ns/m.04gb7 http://sw.opencyc.org/concept/Mx4rvV1TLJwpEbGdrcN5Y29ycA
经济 0.40107 http://dbpedia.org/resource/Economy http://rdf.freebase.com/ns/m.0gfps3  
经济学 0.391207 http://dbpedia.org/resource/Economics http://rdf.freebase.com/ns/m.02j62 http://sw.opencyc.org/concept/Mx4rvqlEOpwpEbGdrcN5Y29ycA
人类 0.36315 http://dbpedia.org/resource/Human http://rdf.freebase.com/ns/m.0dgw9r http://sw.opencyc.org/concept/Mx4rIcwFloGUQdeMlsOWYLFB2w
宗教 0.353719 http://dbpedia.org/resource/Religion http://rdf.freebase.com/ns/m.06bvp http://sw.opencyc.org/concept/Mx4rvVkCHZwpEbGdrcN5Y29ycA
灵性 0.344812 http://dbpedia.org/resource/Spirituality http://rdf.freebase.com/ns/m.070wm  
共产主义 0.280482 http://dbpedia.org/resource/Communism http://rdf.freebase.com/ns/m.01m59 http://sw.opencyc.org/concept/Mx4rvVi0EZwpEbGdrcN5Y29ycA

AlchemyAPI 关键词

(我只显示了返回的 250 个关键词中的前 10 个。)

生命 0.926948
文化生活 0.884749
经济生活 0.766198
经济力量 0.720022
自由文化生活 0.717939
实际生活 0.669134
现代社会运动 0.668291
精神生活 0.654856
自然 0.638823
个人意志 0.635454

..等等..

Semantria 主题

标题 类型 命中计数 强度分数 情感分数 情感极性 Label
科学 概念 0 0.78942883 0.121833332 中性  
经济学 概念 0 0.748247862 0.414984226 中性  
法律 概念 0 0.7397579 0.356725723 中性  
教育程度 概念 0 0.494773239 0.351259947 中性  
科学 查询 3 0 0.750133157 积极的  

Semantria 主题

证据 关于 强度分数 情感分数 情感极性 标题
7 True 2.95010757 0.7593447 积极的 个体
7 2.93402934 7.267939 积极的 经济生活
7 True 2.7541132 -13.2000027 负面 邪恶 — 邪恶
7 True 2.544567 6.680146 积极的 社会主义思想家
7 True 2.48574352 9.6 积极的 广泛的

结论

这里的测试并不详尽——有些人可能会认为甚至不全面。我没有测试高吞吐量,也没有模拟客户服务问题。当我发邮件告诉他们我正在撰写这篇文章时,所有三家提供商都回复得非常快,而且我都与他们进行了出色且有益的交谈。在与每家提供商合作之后,我意识到他们各自都值得一篇“深入探讨”的文章。即使是这种高层次的评论也花费了大量时间,我只是概括(或完全跳过)了这些提供商的许多功能。

我强烈建议您亲自详细研究每个提供商,以了解存在的其他功能和能力。特别是对于 OpenCalais,我强烈建议任何有兴趣进一步使用此服务的人调查 RDF 输出。

此外,作为一个普遍的批评,每个提供商都应该明确定义其 API 中的各种术语以及集合属性的含义。如果要在严肃的文档分析中使用这些服务,精确的含义是必需的。

最后,我发现自然语言处理的概念引人入胜,它为帮助过滤和分析网络上浩瀚且不断增长的信息提供了许多可能性。但是,我不太确定如何以超越简单关键词匹配的有效方式使用 NLP 服务的输出。有些人当然会关心情感是积极还是消极,我认为提取概念(AlchemyAPI)和主题(Semantria)的想法对于提取关于文档的更高层次的抽象很有用。因此,NLP 是一个有趣的研究领域,我相信提供 NLP 服务的人将受益于用户的反馈,以增加其服务的价值。

© . All rights reserved.