2016-11-30 8 views
0

명명 된 엔티티 인식/분류를 수행하고 IOB 태그가 지정된 형식으로 출력을 생성해야합니다.NLTK - 청크 트리를 목록으로 변환 (IOB 태깅)

NLTK-train library에 의해 전달되는 NLTK 청크를 사용하고 있지만 IOB 태그 목록이 아닌 트리가 생성됩니다.

def chunk_iob(list_of_words): 
    nltk_tagger = nltk.data.load("taggers/conll2002_aubt.pickle") 
    nltk_chunker = nltk.data.load("chunkers/conll2002_NaiveBayes.pickle") 

    t = nltk_tagger.tag(list_of_words) 
    print(t) 
    c = nltk_chunker.parse(t) 
    print(c) 

우리는 같은 트리로 C를 얻을 :

(S 
    (LOC Barcelona/NC) 
    (PER Juan/NC :/Fd) 

...

하지만 내가 좋아하는 뭔가를 찾고 다음 IOB입니다

Barcelona - LOC 
Juan - PER 
... 

list_of_words와 동일한 순서로 list_of_words 매개 변수의 태그가 추가 된 목록.

트리에서 어떻게 태그가 달린 목록을 가져올 수 있습니까?

+0

그들은 2.7에 해당하는 피클을 가지고 있습니까? 스크립트를 실행하는 중에 오류가 발생했습니다. –

+0

NLTK-trainer는 NLTK가 아니며 P – alvas

+0

@bogs입니다. IOB가 무엇인지 명확하게 알고있는 것 같습니다. IOB가 명확하지 않은 것 같습니다. 설명해주십시오. 단순한 평신도 용어로 무엇을 의미합니까 내부 또는 외부 청크 시작 간단한 예제와 함께 ... 나는 내가 Chinking 및 Chunking 이해 믿습니다 .. 많은 감사 환호의 raky https://stackoverflow.com/questions/1598940/in-natural- 언어 처리, 즉 chunking의 목적 – raky

답변

3

당신이 찾고있는 것은 tree2conlltags이고 그 반대는 conlltags2tree입니다. 작동 방식은 다음과 같습니다

from nltk import word_tokenize, pos_tag, ne_chunk 
from nltk import conlltags2tree, tree2conlltags 


tree = ne_chunk(pos_tag(word_tokenize("New York is my favorite city"))) 
print tree 
# (S (GPE New/NNP York/NNP) is/VBZ my/PRP$ favorite/JJ city/NN) 

iob_tags = tree2conlltags(tree) 
print iob_tags 
# [('New', 'NNP', u'B-GPE'), ('York', 'NNP', u'I-GPE'), ('is', 'VBZ', u'O'), ('my', 'PRP$', u'O'), ('favorite', 'JJ', u'O'), ('city', 'NN', u'O')] 

tree = conlltags2tree(iob_tags) 
print tree 
# (S (GPE New/NNP York/NNP) is/VBZ my/PRP$ favorite/JJ city/NN) 

참고 IOB 태그 내부와 외부에 대한 O이 형식 시작에 대한 B- {태그}, I- {태그}에 있는지.