📌  相关文章
📜  分块和信息提取

📅  最后修改于: 2020-10-14 09:26:05             🧑  作者: Mango


什么是块?

分块是自然语言处理中的重要过程之一,用于识别词性(POS)和短短语。换句话说,通过分块,我们可以获得句子的结构。也称为部分解析

块状和花纹

块模式是词性(POS)标签的模式,它定义了组成词块的单词类型。我们可以借助修改后的正则表达式定义块模式。

此外,我们还可以定义什么样的话不应该是一大块这些unchunked词被称为裂口模式。

实施实例

在下面的示例中,连同解析句子“这本书有很多章”的结果,还有一个名词短语的语法,该语法将大块和斜率模式结合在一起-

import nltk
sentence = [
   ("the", "DT"),
   ("book", "NN"),
   ("has","VBZ"),
   ("many","JJ"),
   ("chapters","NNS")
]
chunker = nltk.RegexpParser(
   r'''
   NP:{
<.>*} }{ ''' ) chunker.parse(sentence) Output = chunker.parse(sentence) Output.draw()

输出

块模式

如上所示,用于指定块的模式将使用花括号,如下所示:

{
}

为了指定一个小缺口,我们可以如下所示翻转括号:

}{.

现在,对于特定的短语类型,可以将这些规则组合成语法。

信息提取

我们已经研究了可用于构建信息提取引擎的标记器和解析器。让我们看一个基本的信息提取管道-

萃取

信息提取有很多应用,包括-

  • 商业情报
  • 恢复收获
  • 媒体分析
  • 情绪检测
  • 专利检索
  • 邮件扫描

命名实体识别(NER)

命名实体识别(NER)实际上是一种提取一些最常见实体的方法,例如名称,组织,位置等。让我们来看一个示例,该示例采取了所有预处理步骤,例如句子标记,POS标记,分块,NER,并遵循上图中提供的管道。

Import nltk
file = open (
   # provide here the absolute path for the file of text for which we want NER
)
data_text = file.read()
sentences = nltk.sent_tokenize(data_text)
tokenized_sentences = [nltk.word_tokenize(sentence) for sentence in sentences]
tagged_sentences = [nltk.pos_tag(sentence) for sentence in tokenized_sentences]
for sent in tagged_sentences:
print nltk.ne_chunk(sent)

某些经过修改的命名实体识别(NER)也可以用于提取实体,例如产品名称,生物医学实体,品牌名称等等。

关系提取

关系提取是另一种常用的信息提取操作,它是提取各个实体之间不同关系的过程。可能存在不同的关系,例如继承,同义词,类似关系等,其定义取决于信息需求。例如,假设如果我们要查找书籍的写作,那么作者身份将是作者名和书名之间的关系。

在以下示例中,我们使用与上图所示相同的IE管道,直到命名实体关系(NER)为止,并使用基于NER标签的关系模式对其进行扩展。

import nltk
import re
IN = re.compile(r'.*\bin\b(?!\b.+ing)')
for doc in nltk.corpus.ieer.parsed_docs('NYT_19980315'):
for rel in nltk.sem.extract_rels('ORG', 'LOC', doc, corpus = 'ieer',
pattern = IN):
print(nltk.sem.rtuple(rel))

输出

[ORG: 'WHYY'] 'in' [LOC: 'Philadelphia']
[ORG: 'McGlashan & Sarrail'] 'firm in' [LOC: 'San Mateo']
[ORG: 'Freedom Forum'] 'in' [LOC: 'Arlington']
[ORG: 'Brookings Institution'] ', the research group in' [LOC: 'Washington']
[ORG: 'Idealab'] ', a self-described business incubator based in' [LOC: 'Los Angeles']
[ORG: 'Open Text'] ', based in' [LOC: 'Waterloo']
[ORG: 'WGBH'] 'in' [LOC: 'Boston']
[ORG: 'Bastille Opera'] 'in' [LOC: 'Paris']
[ORG: 'Omnicom'] 'in' [LOC: 'New York']
[ORG: 'DDB Needham'] 'in' [LOC: 'New York']
[ORG: 'Kaplan Thaler Group'] 'in' [LOC: 'New York']
[ORG: 'BBDO South'] 'in' [LOC: 'Atlanta']
[ORG: 'Georgia-Pacific'] 'in' [LOC: 'Atlanta']

在上面的代码中,我们使用了一个名为ieer的内置语料库。在该语料库中,标记句子直到命名实体关系(NER)。在这里,我们只需要指定我们想要的关系模式以及我们想要定义关系的NER类型。在我们的示例中,我们定义了组织和位置之间的关系。我们提取了这些模式的所有组合。