文本是用来储存关于我们生活的世界的大量科学知识的媒介。然而,随着其规模和吞吐量的不断增长,分析这种非结构化数据已经成为一项不可能完成的乏味任务。这导致了文本挖掘和自然语言处理技术和工具的兴起,成为检查和处理大量自然文本数据的工具。
文本挖掘是从非结构化机器可读文本中自动提取结构化语义信息。对这些显式概念和关系的识别和进一步分析有助于以一种可伸缩和高效的方式发现文本中包含的多种见解。
各种文本挖掘/自然语言处理技术包括:结构提取、标记化、首字母缩略词规范化、引理化、去复合以及识别语言、句子、实体、关系、短语和段落。
但是一旦我们有了所谓的“结构语义信息”,我们该怎么办?这些文本挖掘技术只是产生了我们试图揭示的见解吗?
嗯,没那么简单。即使从文本中提取了一些信息,要将这些信息首先转化为知识,然后转化为有价值的见解,还有很长的路要走。这种洞察力可能是一个新的发现,或者以在我们现有的关于我们领域的知识中创造新的联系的形式,确认和验证一个先前的假设。让我们看看为什么超越文本挖掘不是一件容易的事情。
在使用许多自然语言处理工具时,我发现在文本挖掘/自然语言处理工具的输出和我所寻求的洞察力之间存在一些挑战。这些可以总结如下:
考虑到这一点,我们可以想出应对这些挑战的潜在解决方案。基于我的研究,我建议采用以下方法:
确定了前面列出的挑战的解决方案后,让我们使用Grakn来构建一个文本挖掘的知识图。
如果你不熟悉它,Grakn是一个智能数据库,以知识图的形式来组织复杂的数据网络。它包含一个knowledge representation基于的系统hyper-graphs;支持任何类型的复杂网络的建模。这个知识表示系统然后被自动推理引擎解释,该引擎实时执行推理。该软件以灵活且易于理解的查询语言的形式展示给用户Graql。
但是我们实际上如何使用Grakn构建一个文本挖掘的知识图呢?
首先,我们需要知道我们正在挖掘并想要存储的文本。在这篇文章中,我想特别关注生物医学数据。因此,我看到的非结构化文本数据类型包括:
从上面列出的文本语料库中,我选择了专门研究医学文献。具体来说,PubMed文章摘要。
当我观察这个空间时,我发现它很容易整合Stanford's CoreNLP允许我训练和挖掘文本。挖掘文本的脚本可以在我们的GitHub报告中找到here。可以替代使用的其他工具包括:NLTK,TextBlob,gensim,spaCy,IBM Watson NLU,PubTator,LitVar,NegBio,OpenNLP,和BioCreative。
多亏了CoreNLP,我们现在有了原始的文本挖掘数据,我们可以进行数据建模了。为此,Grakn利用了entity-relationship model将每个概念分成实体、属性或关系。这意味着我们所要做的就是将每个概念映射到一个schema concept type并认识到它们之间的关系。让我们看一个例子来演示我们将如何着手做这件事。
为了开始对我们的CoreNLP输出进行建模,我们首先需要知道它实际上是什么样子的。最基本的挖掘从正文中提取句子。这些句子有情感、标记(组成句子)和某些标记之间的关系。我们还获得了工具识别的每种类型的置信度度量。这方面的视觉表现如下所示:
正如我们所看到的,我们的输出结构已经像图形一样了。传统的方法努力将这些丰富的信息封装到表格中,然而,这种方法剥离了信息的整个维度,并且产生了相反的效果。保持这种类似图形的结构来构建我们从文本语料库中提取的所有内容的集成复杂知识图感觉更自然。
我们可以轻松地将输出映射到Graql:
我们首先认识到mined-text
,sentence
,和token
作为实体,具有如下属性text
,sentiment
,lemma
,和type
。我们还可以看到他们在我们接下来要定义的关系中扮演的角色。
我们可以确定两种关系。一个是containing
事物之间的关系contained
这就是container
。我们可以看到实体mined-text
实体播放container
对于一个sentence
,asentence
播放contained
关于mined-text
,并且作为container
关于atoken
。最后,是token
只播放contained
关于sentence
。
第二个关系是mined-relation
,它与tokens
如同objects
或者subjects
也有contained
显示哪个的关系sentence
那mined-relation
是从。关系mined-relation
也有一个属性type
来表示关系的类型。
最后,我们还需要指定我们定义的每个属性的数据类型,这可以通过上面模式的最后四行来完成。
架构:Link to code
现在我们已经有了数据,以及强加在这些数据上的结构,下一步就是将这些数据移植到Grakn中,并将其转化为知识。请注意,有许多不同的方法来进行迁移,但在这里我想具体谈谈我们将如何使用Java,NodeJS,和Python。
为此,我们可以轻松地使用这些语言中的任何一种来插入符合我们建模的模式的提取信息的实例。下图描述了如何插入的单个实例token
带着lemma
和type
使用这三种语言中的任何一种:
要了解更多信息migrating data进入Grakn,确保阅读this article。
迁移后,我们可以开始发现新的见解。发现真知灼见是指发现对我们努力实现的目标有价值的新数据。为了做到这一点,我们需要首先寻找或要求一些东西。换句话说,我们从一个问题开始。这些问题的范围可以从在文本中提问,甚至是关于其他数据的更复杂的问题,这些数据被文本挖掘的输出所扩充。
让我们看一些例子,看看我们的文本挖掘知识图如何为它们提供答案:
问题1:从一篇公共医学文章中提取了什么知识?
Graql查询1
回答1:
反应的视觉表现
我们得到的答案是从我们感兴趣的PubMed文章的摘要中挖掘出的各种概念。上图显示了一个例子,其中提取的实体是:
这些实体和关系是在我们的CoreNLP工具上进行的培训中提取的。关于这方面的更多信息可以找到here。
现在让我们试着问一个更难的问题:
问题2:哪篇公共医学文章提到了黑色素瘤和基因BRAF?
Graql查询2
回答2:
反应的视觉表现
我们从Grakn那里得到的答案是符合所提供条件的所有PubMed文章的列表。这种查询的一个很好的应用可以在精确医学领域中提出,在该领域中,我们希望将个体患者链接到与其个人生物医学病例相关的医学文献。如果你对精确医学和知识图表感兴趣,看看这个article。
这些查询是有用的,但是现在它回避了一个问题——它如何利用我们的文本挖掘知识图来扩充我们现有的知识?我们如何利用我们所挖掘的东西来扩展我们的洞察力,并将它们应用到生命科学的其他领域?下一个问题展示了这一点:
问题3:哪种药物与黑色素瘤相关?
Graql查询3
回答3:
反应
尽管格拉克恩给了我们一个正确的答案,但是这个数据实际上从未被格拉克恩接受——疾病和药物之间不存在联系。那么,我们是如何得到这个相关答案的呢?
简而言之,Grakn的自动推理机通过automated reasoning。由于这种类型的推理是完全可以解释的,我们可以解释任何推断出的概念来理解它是如何被推断/创造出来的。在下面,您可以看到这个解释在中的样子Workbase。在下一节中,我将深入探讨我们是如何创建允许Grakn推断这些关系的逻辑和规则的。
说明
我们上面看到的关系是一阶逻辑的产物。这可以建模为当...的时候和然后场景。
论证
这当...的时候在这种情况下,指的是我们的文本挖掘知识图的一个子图,也就是说,每当找到像左边这样的子图时,右边的关系就会被创建。
这个逻辑在整个知识图中传播,创建新的有价值的连接,这是通过用Graql编写的规则来完成的。我用于上述推论的规则如下:
规则:治疗规则
上述规则规定当...的时候:
如果这是真的,然后在药物和疾病之间建立治疗关系。我们也可以从上面的规则看出,它对疾病或药物是不可知的;因此在每种药物和疾病之间建立了符合给定条件的治疗关系。
应该注意的是,上面的规则演示了如何使用自动推理来创建复杂见解的高级抽象,这些见解可以在数据中扩展。它决不能与最终用户应用程序的完整实现相比。
现在,让我们后退一步,看看构建文本挖掘知识图的所有组件是如何拼凑在一起的。
我们从文本开始,它可以来自多种来源和各种格式。一个自然语言处理工具被用来挖掘文本并产生某种带有结构的输出。该结构用于创建schema(高级数据模型)在原始NLP输出上实施结构。一旦完成,我们使用Grakn's clients将NLP输出的实例迁移到Grakn,确保每次插入都符合模式。Grakn将这些信息存储在它的知识表示系统中,可以通过查询这些信息来发现复杂的概念,甚至检验假设。这些见解可能已经在图表中,或者甚至在查询时由推理引擎创建;例如,发现基因簇鉴定、蛋白质相互作用、基因-疾病关联、蛋白质-疾病关联、药物-疾病关联、患者匹配,甚至用于临床决策支持。
所以,我们知道文本挖掘在几个领域都非常有前途,在这篇文章中,我们特别关注了生物医学领域。我们知道,从从文本中提取信息到真正发现有用的东西,需要做很多工作。我希望已经展示了一个解决方案来帮助弥合这一差距。