2017-03-16 54 views
3

Spacy有两个特点,我想结合 - part-of-speech(POS)和rule-based matching怎么写POS正则表达式匹配spacy

我该如何将它们以一种整洁的方式结合起来?

例如 - 假设输入是一个简单的句子,我想,以验证它满足一些POS排序条件 - 比如动词是名词之后(类似名词动词**正则表达式)。结果应该是真或假。这是可行的吗?或匹配器具体如在示例中

基于规则的匹配可以有POS规则吗?

如果没有 - 这是我目前的计划 - 聚集在一个字符串的一切,并应用正则表达式

import spacy 
nlp = spacy.load('en') 
#doc = nlp(u'is there any way you can do it') 
text=u'what are the main issues' 
doc = nlp(text) 

concatPos = '' 
print(text) 
for word in doc: 
    print(word.text, word.lemma, word.lemma_, word.tag, word.tag_, word.pos, word.pos_) 
    concatPos += word.text +"_" + word.tag_ + "_" + word.pos_ + "-" 
print('-----------') 
print(concatPos) 
print('-----------') 

# output of string- what_WP_NOUN-are_VBP_VERB-the_DT_DET-main_JJ_ADJ-issues_NNS_NOUN- 

回答

6

当然,简单地使用POS属性。

import spacy 
nlp = spacy.load('en') 
from spacy.matcher import Matcher 
from spacy.attrs import POS 
matcher = Matcher(nlp.vocab) 
matcher.add_pattern("Adjective and noun", [{POS: 'ADJ'}, {POS: 'NOUN'}]) 

doc = nlp(u'what are the main issues') 
matches = matcher(doc) 
+0

看起来很有趣。两个问题 - 这个匹配数组是什么?我只用数字打印它。第二 - 我能以某种方式集成硬编码的单词(例如“什么”等) - 就像正则表达式可以同时在POS和文本上工作? – user1025852

+1

1.看到spacy包目录matcher.py文件,这里就是写关于Matcher对象的__call__方法 - 列表 的列表(entity_key,label_id,开始,结束)的元组, 描述匹配。匹配元组描述跨度文档[开始:结束]。 label_id和entity_key都是整数。 2.是的,试试这个matcher.add_pattern(“形容词和名词”,[{POS:'ADJ',LOWER:'main'},{POS:'NOUN'}]]) –