2017-04-05 8 views
0

私の質問はこのquestionと似ています。 spacyでは、私は品詞タグ付けと名詞句識別を別々に行うことができます。名詞句チャンクによるPOSタグmergnig

import spacy 
nlp = spacy.load('en') 
sentence = 'For instance , consider one simple phenomena : 
      a question is typically followed by an answer , 
      or some explicit statement of an inability or refusal to answer .' 
token = nlp(sentence) 
token_tag = [(word.text, word.pos_) for word in token] 

出力は次のようになります。私はもしそこに思ったんだけど

[nc for nc in token.noun_chunks] # [instance, one simple phenomena, an answer, ...] 

:名詞句またはチャンクについて

[('For', 'ADP'), 
('instance', 'NOUN'), 
(',', 'PUNCT'), 
('consider', 'VERB'), 
('one', 'NUM'), 
('simple', 'ADJ'), 
('phenomena', 'NOUN'), 
...] 

、私は次のように言葉の塊ですnoun_chunksを得ることができますnoun_chunksに基づいてPOSタグをクラスタ化する方法です。出力は次のようになります。

[('For', 'ADP'), 
('instance', 'NOUN'), # or NOUN_CHUNKS 
(',', 'PUNCT'), 
('one simple phenomena', 'NOUN_CHUNKS'), 
...] 

答えて

0

私はそれを行う方法を理解しました。

noun_phrase_position = [(s.start, s.end) for s in token.noun_chunks] 
noun_phrase_text = dict([(s.start, s.text) for s in token.noun_chunks]) 
token_pos = [(i, t.text, t.pos_) for i, t in enumerate(token)] 

それから私はstartに基づいてtoken_posのリストをマージするために、このsolutionと結合し、stop位置

result = [] 
for start, end in noun_phrase_position: 
    result += token_pos[index:start] 
    result.append(token_pos[start:end]) 
    index = end 

result_merge = [] 
for i, r in enumerate(result): 
    if len(r) > 0 and isinstance(r, list): 
     result_merge.append((r[0][0], noun_phrase_text.get(r[0][0]), 'NOUN_PHRASE')) 
    else: 
     result_merge.append(r) 

:基本的に、我々は次のように名詞句トークンの開始位置と終了得ることができます出力

[(1, 'instance', 'NOUN_PHRASE'), 
(2, ',', 'PUNCT'), 
(3, 'consider', 'VERB'), 
(4, 'one simple phenomena', 'NOUN_PHRASE'), 
(7, ':', 'PUNCT'), 
(8, 'a', 'DET'), ... 
関連する問題