NLTK学习笔记——信息抽取(1)

来源:互联网 发布:网络直播游戏 编辑:程序博客网 时间:2024/06/06 02:27

信息抽取的内容在《Natural Language Processing》第7章,对于文本的信息抽取,命名实体及其关系的识别是至关重要要的,信息抽取分为以下几个步骤:
1. 文本切分,将string类型的文本划分为list类型的句子
2. 句子切分,将每个list类型的句子划分成由单词或chunk组成的list
3. 词性标注,生成由一个list,其组成内容是多个形如(word,lable)的tuple
4. 命名实体识别,生成各个tree组成一个list
5. 关系识别,生成一个list,其内容是多个形如(entity,relation,entity)的tuple

在tree的构成中,分块是个重要的过程,如NP(DT,JJ,JJ,NN)可构成一个NP短语。nltk中有重要的类是RegexpParser,分析预先定义的分块语法grammar,得到多个语法规则,然后利用parser函数对句子分析,得到语法树。下面就介绍一个RegexpParser分析grammar的过程和parser函数的解析过程。

  • RegexpParser类

调用:cp=nltk.RegexpParser(grammar)
输入:分块语法grammar,有一个或多个识别块信息的正则表达式,如:

grammar = r"""    NP: {<.*>*}             # start by chunking everything    }<[\.VI].*>+{       # chink any verbs, prepositions or periods    <.*>}{<DT>          # separate on determiners    PP: {<IN><NP>}          # PP = preposition + noun phrase    VP: {<VB.*><NP|PP>*}    # VP = verb words + NPs and PPs    """

输出:
过程:分析过程主要是在read_grammar函数里实现,当grammar是string类型时(如上),就调用read_grammar进行分析。下面就介绍一下分析过程中的要点。
(1)按行读取,并将每行的开头、结尾空格删除
(2)分离非终结符和规则,调用re.py里的match函数进行分离(其细节与chunk模块无关,这里就先不研究了),分离的依据仍然是正则表达式,冒号之前的是非终结符,如NP、PP、VP,冒号之后的是rule
(3)程序用stage来记录有多少个非终结符,一旦遇到非终结符就重设stage,将上一个rule记录下来(之所以记录的是上一个,是因为当前的rule尚未处理,可能存在注释,需要经过处理之后才能记录下来),因此在重设stage时需要判断rule是否为空,那么在首次记录时就不会报错
(4)对于记录rule的过程,首先设定识别chunk、chink、split和merge的规则:

{regexp}         # chunk rule      }regexp{         # chink rule      regexp}{regexp   # split rule      regexp{}regexp   # merge rule  

因此,对于传入的rule,将进行如下处理:
①类似于分离非终结符和rule的方法,将rule和#注释分离,依据是#
②对于分离出的rule(不带注释),根据上面讲的规则,识别出对应的类别,分别调用ChunkRule、ChinkRule、SplitRule和MergeRule进行处理。

0 0
原创粉丝点击