2017-03-16 58 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'}]]) –