如何构建一个系统?


本文摘自php中文网,作者PHP中文网,侵删。

如何构建一个系统,用于从非结构化的文本中提取结构化的信息和数据?哪些方法使用这类行为?哪些语料库适合这项工作?是否可以训练和评估模型?

信息提取,特别是结构化信息提取,可以类比数据库的记录。对应的关系绑定了对应的数据信息。针对自然语言这类非结构化的数据,为了获取对应关系,应该搜索实体对应的特殊关系,并且用字符串、元素等一些数据结构记录。

实体识别:分块技术

比如:We saw the yellow dog ,按照分块的思想,会将后三个词语分到NP中,而里面的三个词又分别对应 DT/JJ/NN;saw 分到VBD中;We 分到NP中。对于最后三个词语来说,NP就是组块(较大的集合)。为了做到这点,可以借助NLTK自带的分块语法,类似于正则表达式,来实现句子分块。

分块语法的构建

注意三点即可:

  • 基本的分块:组块 :{组块下的子组块}(类似于:"NP: {<DT>?<JJ>*<NN>}"这样的字符串)。而?*+保存了正则表达式的意义。

import nltk
sentence = [('the','DT'),('little','JJ'),('yellow','JJ'),('dog','NN'),('brak','VBD')]
grammer = "NP: {<DT>?<JJ>*<NN>}"cp = nltk.RegexpParser(grammer) #生成规则result = cp.parse(sentence) #进行分块print(result)

result.draw() #调用matplotlib库画出来


  • 可以为不包括再大块中的标识符序列定义一个缝隙}<VBD|IN>+{

import nltk
sentence = [('the','DT'),('little','JJ'),('yellow','JJ'),('dog','NN'),('bark','VBD'),('at','IN'),('the','DT'),('cat','NN')]
grammer = """NP:             {<DT>?<JJ>*<NN>}            }<VBD|NN>+{            """  #加缝隙,必须保存换行符cp = nltk.RegexpParser(grammer) #生成规则result = cp.parse(sentence) #进行分块print(result)


  • 可以递归式的调用,这符合语言结构中的递归嵌套。例如:VP: {<NP|PP|CLAUSE>*} PP:{<NN><VP>} 。此时,RegexpParser函数的参数loop即可以设置为2,多次循环,来防止遗漏。

树状图

如果调用print(type(result))查看类型就会发现,是 nltk.tree.Tree。从名字看出来这是一种树状结构。nltk.Tree 可以实现树状结构,并且支持拼接技术,提供结点的查询和树的绘制。

tree1 = nltk.Tree('NP',['Alick'])print(tree1)
tree2 = nltk.Tree('N',['Alick','Rabbit'])print(tree2)
tree3 = nltk.Tree('S',[tree1,tree2])print(tree3.label()) #查看树的结点tree3.draw()


IOB标记

分别代表内部,外部,开始(就是英语单词的首字母)。对于上面讲的 NP,NN这样的分类,只需要在前面加上 I-/B-/O-即可。这样就能使规则外的集合被显式出来,类似上面的加缝隙。


开发和评估分块器

NLTK已经为我们提供了分块器,减少了手动构建规则。同时,也提供了已经分块好的内容,供我们自己构建规则时候进行参考。

#这段代码在python2下运行from nltk.corpus import conll2000print conll2000.chunked_sents('train.txt')[99] #查看已经分块的一个句子text = """   he /PRP/ B-NP   accepted /VBD/ B-VP   the DT B-NP   position NN I-NP   of IN B-PP   vice NN B-NP   chairman NN I-NP   of IN B-PP   Carlyle NNP B-NP   Group NNP I-NP   , , O   a DT B-NP   merchant NN I-NP   banking NN I-NP   concern NN I-NP   . . O"""result = nltk.chunk.conllstr2tree(text,chunk_types=['NP'])


阅读剩余部分

相关阅读 >>

Python经典算法有哪些

Python如何判断文件是否存在

Python是如何爬取散文网的文章的?

Python爬虫如何爬取get请求的页面数据?(附代码)

Python是解释型语言么

Python中日期和时间格式化输出的方法小结_Python

Python中赋值&浅拷贝&深拷贝的简单介绍(示例)

三篇文章帮你搞定怎样进行mysql数据库学习之安装sql数据库

推荐几个适合小白学习Python的免费网站

pytho 中闭包与装饰器详解

更多相关阅读请进入《Python》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...