python分块处理功能_【语言处理与Python】7.2分块

实体识别的基本技术是分块(chunking)

30173826-493495f3fd5343b6a18d08cfe00d6e45.png

名词短语分块(NP-分块)

这里有一段已经标注的例子:

30173827-9677a771a354412aab2ac9cc108ca059.png

方括号中是名词标注的例子。

NP-分块信息最有用的来源之一是词性标记。

为了创建一个NP块,我们将首先定义一个块语法,规定了句子应该如何分块。

我们使用正则表达式来定义,规则可以我们自己定:一个NP块由一个可选的限定词(DT)后面跟着任何数目的形容词(JJ),然后是一个名词(NN组成)。

下面是示例代码:

>>>sentence = [("the", "DT"), ("little", "JJ"), ("yellow", "JJ"),

... ("dog", "NN"), ("barked", "VBD"), ("at", "IN"), ("the", "DT"), ("cat", "NN")]>>>grammar= "NP: {

?*}"

>>>cp =nltk.RegexpParser(grammar)>>>result =cp.parse(sentence)>>>printresult

(S

(NP the/DT little/JJ yellow/JJdog/NN)

barked/VBD

at/IN

(NP the/DT cat/NN))>>>result.draw()

30173828-469cf2b7f9e34488a62ff936ce1f3286.png

标记模式类似于正则表达式模式。

?*

用正则表达式分块

在这个例子中,不仅仅只有一个规则,定义了两个规则。依然可以类似于上面的做法进行分块。

NNP为专有名词;DT为限定词;PP$为所有格代名词($为特殊符号,必须加转义\进行匹配);JJ为形容词;

grammar= r"""NP:{

?*} # chunk determiner/possessive,adjectives and nouns

{+} #chunksequences of propernouns"""cp=nltk.RegexpParser(grammar)

sentence= [("Rapunzel", "NNP"), ("let", "VBD"), ("down", "RP"),

("her", "PP$"), ("long", "JJ"), ("golden", "JJ"), ("hair", "NN")]>>>printcp.parse(sentence)

(S

(NP Rapunzel/NNP)

let/VBD

down/RP

(NP her/PP$long/JJ golden/JJhair/NN))

如果标记模式匹配位置重叠,最左边的优先。

例如:

>>>nouns= [("money", "NN"), ("market", "NN"), ("fund", "NN")]>>>grammar= "NP: {} #Chunktwo consecutive nouns"

>>>cp =nltk.RegexpParser(grammar)>>>printcp.parse(nouns)

(S (NP money/NNmarket/NN)fund/NN)

为了解决这个问题,可以改进一下这个规则:NP:{+}。

搜索文本语料库

我们也可以使用分块器更容易的做同样的具体的工作:

>>>cp = nltk.RegexpParser('CHUNK: {}')>>>brown=nltk.corpus.brown240

>>>for sent inbrown.tagged_sents():

... tree=cp.parse(sent)

...for subtree intree.subtrees():

...if subtree.node =='CHUNK': printsubtree

...

(CHUNK combined/VBN to/TO achieve/VB)

(CHUNKcontinue/VB to/TO place/VB)

(CHUNK serve/VB to/TO protect/VB)

(CHUNK wanted/VBDto/TO wait/VB)

(CHUNK allowed/VBN to/TO place/VB)

(CHUNK expected/VBN to/TO become/VB)

...

(CHUNK seems/VBZ to/TO overtake/VB)

(CHUNK want/VBto/TO buy/VB)

加缝隙

加缝隙,是从一大块中出去一个标识符序列的过程。如果匹配的标识符序列贯穿成一整块,那么这一块会被去除。

下面这个例子将会演示代码过程:

grammar= r"""NP:

{<.*>+} #Chunkeverything

}+{ #Chinksequences of VBDand IN"""sentence= [("the", "DT"), ("little", "JJ"), ("yellow", "JJ"),

("dog", "NN"), ("barked", "VBD"), ("at", "IN"), ("the", "DT"), ("cat", "NN")]

cp=nltk.RegexpParser(grammar)>>>printcp.parse(sentence)

(S

(NP the/DT little/JJ yellow/JJdog/NN)

barked/VBD

at/IN

(NP the/DT cat/NN))

块的表示:标记与树

块结构是标注和分析之间的中间状态。

块结构可以用标记或者树来表示。使用最多的,是使用IOB标记。

每个标识符被用三个特殊的块标签之一标注。

I内部,O外部,B开始。一般没有必要指定出现在块外的标识符类型,都标志为O。

如图所示:

30173829-1db649284f854f6c84fd37540e4e5dab.png

同样,块也可以使用树来表示。如图:

30173830-50d165877d6a4d39909d840407320cfd.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值