2014-07-26 4 views
0

일부 텍스트 분석을 위해 Python과 nltk + Textblob를 사용하고 있습니다. 흥미로운 것은 동의어에 대한 검색을보다 명확하게하기 위해 wordnet에 POS를 추가 할 수 있지만 불행히도 nltk와 Textblob의 태그는 wordnet이 synset 클래스에 대해 기대하는 입력과 "호환"되지 않습니다.POS 태그를 TextBlob에서 Wordnet 호환 입력으로 변환

Wordnet.synsets()는 당신이 그것을주는 POS 그렇게

wn.synsets("dog", POS="n,v,a,r") 

처럼, N, V, A, R 중 하나입니다하지만 upenn_treebank에서 태그 표준 POS는

처럼 보이는 것을 요구한다
JJ, VBD, VBZ, etc. 

그래서 두 가지를 변환하는 좋은 방법을 찾고 있습니다.

누구든지이 변환을 무력과 함께 할 수있는 좋은 방법을 알고 있습니까?

+0

당신이 ""호환 "아니다"에 대한 자세한 내용을 설명 할 수 있을까요? – Daniel

+0

예를 들면 ... – Daniel

+0

아래 답변은 훌륭합니다.이 게시물에 걸려 넘어지는 사람들이 문제가 무엇인지 느낄 수 있도록 몇 가지 예를 추가했습니다. –

답변

2

textblob이 PennTreeBank (ptb) 태그 세트를 사용하는 경우 POS 태그의 첫 번째 문자를 사용하여 WN pos 태그에 매핑하면됩니다.

WN POS 태그 세트에는 'a'= 형용사/부사식, 's'= 위성 형용사, 'n'= 명사 및 'v'= 동사가 포함됩니다.

시도 :

>>> from nltk import word_tokenize, pos_tag 
>>> from nltk.corpus import wordnet as wn 
>>> text = 'this is a pos tagset in some foo bar paradigm' 
>>> pos_tag(word_tokenize(text)) 
[('this', 'DT'), ('is', 'VBZ'), ('a', 'DT'), ('pos', 'NN'), ('tagset', 'NN'), ('in', 'IN'), ('some', 'DT'), ('foo', 'NN'), ('bar', 'NN'), ('paradigm', 'NN')] 
>>> for tok, pos in pos_tag(word_tokenize(text)): 
...  pos = pos[0].lower() 
...  if pos in ['a', 'n', 'v']: 
...    wn.synsets(tok, pos) 
... 
[Synset('be.v.01'), Synset('be.v.02'), Synset('be.v.03'), Synset('exist.v.01'), Synset('be.v.05'), Synset('equal.v.01'), Synset('constitute.v.01'), Synset('be.v.08'), Synset('embody.v.02'), Synset('be.v.10'), Synset('be.v.11'), Synset('be.v.12'), Synset('cost.v.01')] 
[Synset('polonium.n.01'), Synset('petty_officer.n.01'), Synset('po.n.03'), Synset('united_states_post_office.n.01')] 
[] 
[] 
[Synset('barroom.n.01'), Synset('bar.n.02'), Synset('bar.n.03'), Synset('measure.n.07'), Synset('bar.n.05'), Synset('prevention.n.01'), Synset('bar.n.07'), Synset('bar.n.08'), Synset('legal_profession.n.01'), Synset('stripe.n.05'), Synset('cake.n.01'), Synset('browning_automatic_rifle.n.01'), Synset('bar.n.13'), Synset('bar.n.14'), Synset('bar.n.15')] 
[Synset('paradigm.n.01'), Synset('prototype.n.01'), Synset('substitution_class.n.01'), Synset('paradigm.n.04')] 
+0

이것은 내가 찾고있는 것입니다. 단순히 첫 번째 캐릭터를 보는 것보다 더 좋은 해결책이 있는지 알지 못했지만 가장 좋은 방법입니다. 감사! –

+0

가장 가까운 근사값을 사용할 수있는 몇 가지 참조가있는 경우 더 편안 할 것입니다. –

+0

올바르지 않습니까? PTB는 각각 형용사/동사에 대해 JJ/RB로 시작하는 태그를 사용합니다. 테스트를 해본 적은 없지만 다음과 같이해야 할 것 같습니다 : '''ptb_wn_pos { 'NN': 'n', 'JJ': 'a', 'RB': 'A', 'VB' 'V' } // POS = POS [0 : 2] // wn_pos의 =의 ptb_wn_pos [POS] '' 편집 : 사과, 난 개행을 삽입 할 수있다 웬일인지, // 문자가 뉴 라인이라고 상상해 보라. –

관련 문제