2014-01-08 5 views
2

기준 태그 지정자에 대한 코드를 작성하고 있습니다. Brown corpus를 기반으로 가장 일반적인 태그를 단어에 할당합니다. 따라서 단어 "작품"이 동사로 23 번, 복수형 명사로 30 번 태그가 붙은 경우 사용자 입력 문장의 단어에 따라 복수형으로 태그가 지정됩니다. 단어가 코퍼스에서 발견되지 않으면 기본적으로 명사로 태그가 지정됩니다. 내가 지금까지 가지고있는 코드는 가장 빈번하지 않은 단어에 대한 모든 태그를 반환합니다. 단어 당 빈번한 태그 만 반환하는 방법은 무엇입니까?Python과 NLTK :베이스 라인 태그 지정자

import nltk 
from nltk.corpus import brown 

def findtags(userinput, tagged_text): 
    uinput = userinput.split() 
    fdist = nltk.FreqDist(tagged_text) 
    result = [] 
    for item in fdist.items(): 
     for u in uinput: 
      if u==item[0][0]: 
       t = (u,item[0][1]) 
       result.append(t) 
     continue 
     t = (u, "NN") 
     result.append(t) 
    return result 

def main(): 
    tags = findtags("the quick brown fox", brown.tagged_words()) 
    print tags 

if __name__ == '__main__': 
    main() 
+0

와하하, 귀하의 모든 nltk 질문에 답변하면 곧 지불을 요청할 것입니다. lolz, 그냥 농담을하고 나에게 타입 분을 준다. – alvas

+0

미안하지만 점심 먹으러갔습니다. 아래에 'most_frequent_pos_tagger()'가 필요합니다. – alvas

답변

0

word_tags 키 워드 (의 주석이 달려 있지 않은)와 값이 주파수를 내림차순으로 태그의 목록입니다라는 사전 만들기 (당신의 fdist에 따라.)

다음 :

for u in uinput: 
    result.append(word_tags[u][0]) 
2

영어 인 경우 많은 사람들이 불만을 제기하고있는 NLTK의 기본 POS 태거가 있지만 (패혈증보다 반창고와 비슷합니다) POS tagging - NLTK thinks noun is adjective :

를 참조하십시오.
>>> from nltk.tag import pos_tag 
>>> from nltk.tokenize import word_tokenize 
>>> sent = "the quick brown fox" 
>>> pos_tag(word_tokenize(sent)) 
[('the', 'DT'), ('quick', 'NN'), ('brown', 'NN'), ('fox', 'NN')] 

처음부터 기준 술래를 양성하려는 경우, 당신은이 같은 모범을 따라야하지만 영어 하나에 영장을 변경하는 것이 좋습니다 : spaghetti-tagger에서 같은 UnigramTagger을 구축함으로써 https://github.com/alvations/spaghetti-tagger

, 당신은 자동으로 달성한다 모든 단어에 대한 가장 일반적인 태그.

그러나 기계 학습이 아닌 방식으로 수행하려면 먼저 단어 : POS를 계산하십시오. 어떤 유형의 토큰 비율이 필요합니다. 또한 Part-of-speech tag without context using nltk를 참조하십시오

from nltk.tag import pos_tag 
from nltk.tokenize import word_tokenize 
from collections import Counter, defaultdict 
from itertools import chain 

def type_token_ratio(documentstream): 
    ttr = defaultdict(list) 
    for token, pos in list(chain(*documentstream)): 
     ttr[token].append(pos) 
    return ttr 

def most_freq_tag(ttr, word): 
    return Counter(ttr[word]).most_common()[0][0] 

sent1 = "the quick brown fox quick me with a quick ." 
sent2 = "the brown quick fox fox me with a brown ." 
documents = [sent1, sent2] 

# Calculates the TTR. 
documents_ttr = type_token_ratio([pos_tag(word_tokenize(i)) for i in documents]) 

# Best tag for the word. 
print Counter(documents_ttr['quick']).most_common()[0] 

# Best tags for a sentence 
print [most_freq_tag(documents_ttr, i) for i in sent1.split()] 

참고 : 문서 스트림은 각 문장은 인/아웃 태그 토큰의 목록을 포함 문장의 목록으로 정의 할 수 있습니다.

파이썬

from collections import Counter 
default_tag = Counter(tags).most_common(1)[0][0] 

질문 인 경우 "는 유니 그램 - 술래의 작업을 수행하는 방법?"

0

당신은 단순히 목록에서 가장 반복되는 항목을 찾기 위해 카운터를 사용할 수 있습니다 더 NLTK 소스 코드를 읽을 관심이있을 수 있습니다 이 http://nltk.org/book/ch05.html#the-lookup-tagger

그냥 책의 샘플처럼 조건부 주파수를 가질 수있다 : 어쨌든 http://nltk.org/_modules/nltk/tag/sequential.html#UnigramTagger

을, 나는 당신이 특별히 NLTK 책 5 장 을 읽을 제안 각 단어에 대해 가장 좋은 태그를 반환합니다. 이 경우 cfd["fox"].max()에서

cfd = nltk.ConditionalFreqDist(nltk.corpus.brown.tagged_words()) 

갈색 영장에 따라 "여우"에 대한 가장 가능성이 태그를 반환합니다. 그런 다음 문장의 각 단어에 대해 가장 가능성이 태그의 사전을 만들 수 있습니다, 당신의 문장에 새로운 단어에 대해이 오류를 반환

likely_tags = dict((word, cfd[word].max()) for word in "the quick brown fox".split()) 

알 수 있습니다. 그러나 당신이 당신의 자신의 tagger를 만들 수있는 아이디어를 이해한다면.