介绍
什么是表达式,用一组规则来进行信息表示与提取。
这个名字起的有点绕,本质来讲他是做下面这个事情的。
假设分词结果如下所示:
1 | [ |
表达式
演变1
如果从这句话中进行关键词提取,分词粒度太低,那么我们首先会想着聚合。
1 | [('社区', 'n'), ('网格化', 'n'), ('管理', 'n')] |
网格化管理
更能体现出比管理更具体的含义,那么你会接着使用2阶的n-gram
,那么网格化管理
会提取出来。
演变2
现在社区
也是2阶n-gram,他们应该聚合吗?显然是不应该的,那么我们认识到:
n-gram是必须的,但是配置出来的规则不止n-gram。
那么我们尝试添加进去词性
特征。
伪代码如下:
1 | if before_token.pos == 'n' and cur_token.pos == 'n': |
演变3
假设到此我们都可以用一堆hardcode来解决了,如果我们允许自定义配置,那么上面的hardcode就要换一种方式来表达。
演变4
此方法自行实现。我们可以定义每个token的判断逻辑。
1 | def token_match(token, element): |
演变5
到这里为止,我们认为实现了一个可自定义配置的表达式,但是问题来了,上面这个准确来讲是实现了硬匹配的,只能一个token一个token的来写表达式规则,比如我想实现[‘!n’, ‘!n’, ‘!n’, ‘!n’]这种,那就要写4遍这个。而不是!n+这种。
那么自行实现正则表达式会是更优的方式。
那先转换下思路,有没有现成的实现方式或者相关术语,可以拿来参考。
分块(chunk)
根据Nature Language Processing with Python第七章Extracting Information from Text中介绍到分块
概念。
我们将用于实体检测的基本技术是分块,它分割和标记多令牌序列,如下图所示。
那么由此可见,我们可以看到用于分块的正则表达式和n-gram方法。
例子1
1 | 'the', 'DT'), ('little', 'JJ'), ('yellow', 'JJ'), ('dog', 'NN'), ('barked', 'VBD'), ('at', 'IN'), ('the', 'DT'), ('cat', 'NN')] sentence = [( |
由这个例子可见,grammer中:
NP
为自定义的名字,nonterminal,表示为这个grammer应该对应的label是什么。这个可自行参考constituency tree parser。{}
表示一套表达式的范围,rule。<>
对应token的表示。?
,*
,+
就对应正常的正则。
搜了些资料,貌似没有根据词特征来进行patten匹配的。
通过源码可看出的确是不支持词匹配的。
基于这个的应用,可看SIFRank_zh
算法的应用。
结论
如果需要其他特征,可以先词性匹配,后续加规则来实现。
自己实现一个更高级的😂😂😂。