2017-10-12 11 views
0

텍스트 파일을 입력으로 사용하여 NLTK에서 다른 POS 태그를 평가하고 싶습니다.NLTK에서 POS 타거 평가

예를 들어, Unigram tagger를 사용합니다. 나는 갈색 자료를 사용하여 Unigram 태그를 평가하는 방법을 찾았습니다.

from nltk.corpus import brown 
import nltk 

brown_tagged_sents = brown.tagged_sents(categories='news') 
brown_sents = brown.sents(categories='news') 
# We train a UnigramTagger by specifying tagged sentence data as a parameter 
# when we initialize the tagger. 
unigram_tagger = nltk.UnigramTagger(brown_tagged_sents) 
print(unigram_tagger.tag(brown_sents[2007])) 
print(unigram_tagger.evaluate(brown_tagged_sents)) 

아래와 같이 출력됩니다.

[('Various', 'JJ'), ('of', 'IN'), ('the', 'AT'), ('apartments', 'NNS'), ('are', 'BER'), ('of', 'IN'), ('the', 'AT'), ('terrace', 'NN'), ('type', 'NN'), (',', ','), ('being', 'BEG'), ('on', 'IN'), ('the', 'AT'), ('ground', 'NN'), ('floor', 'NN'), ('so', 'QL'), ('that', 'CS'), ('entrance', 'NN'), ('is', 'BEZ'), ('direct', 'JJ'), ('.', '.')] 
0.9349006503968017 

비슷한 방식으로 텍스트 파일에서 텍스트를 읽고 다른 POS 태그 태그의 정확성을 평가하고 싶습니다.

텍스트 파일을 읽는 방법과 토큰에 pos 태그를 적용하는 방법을 알아 냈습니다. 내가하고 싶었 무엇

import nltk 
from nltk.corpus import brown 
from nltk.corpus import state_union 

brown_tagged_sents = brown.tagged_sents(categories='news') 

sample_text = state_union.raw(
    r"C:\pythonprojects\tagger_nlt\new-testing.txt") 
tokens = nltk.word_tokenize(sample_text) 

default_tagger = nltk.UnigramTagger(brown_tagged_sents) 

default_tagger.tag(tokens) 

print(default_tagger.tag(tokens)) 
[('Honestly', None), ('last', 'AP'), ('seven', 'CD'), ('lectures', None), ('are', 'BER'), ('good', 'JJ'), ('.', '.'), ('Lectures', None), ('are', 'BER'), ('understandable', 'JJ') 

이다 default_tagger.evaluate 같은 점수(), 나는 주어진 파일에 가장 적합한 POS 술래를 식별하기 위해 동일한 입력 파일을 사용하여 NLTK에서 다른 POS 얇은 생철을 비교할 수 있도록 .

도움이 될 것입니다.

+1

테스트 문장에 지상 진실 태그가 필요합니다. 기존 문장 세트 (예 : 첫 번째 예제에서 사용 된 Brown corpus)를 사용하거나 수동으로 문장에 태그를 추가하려는 영어에 대한 지식이있는 언어 학자를 찾으십시오. – lenz

+0

@Yash 지금하고있는 것과는 다른 것을하려고합니다. 'default_tagger.tag (토큰)'명령을 전달하면 원시 토큰에 태그를 붙입니다. 태그 지정자를 평가하려면 수동으로 태그 된 데이터를 제공해야합니다. – Mohammed

답변

2

이 질문은 본질적으로 모델 평가 메트릭에 대한 질문입니다. 이 경우, 우리의 모델은 특히 UnigramTagger

당신은 "how well"당신의 술래가하고 알고 싶어

을 정량화하는 POS 술래이다. 이것은 qualitative 질문이므로 " how well"의 의미를 정의하는 데 도움이되는 몇 가지 일반 quantitative 측정 항목이 있습니다. 기본적으로, 우리는 우리에게이 정보를 제공하기위한 표준 통계를 가지고 있습니다. 일반적으로 accuracy, precision, recallf1-score입니다.

이 먼저 떨어져, 우리는 우리가 테스트 할 수 있습니다, POS tags와 함께 표시되어 일부 데이터를 필요 평가

. 이것은 일반적으로 train/test 스플릿이라고합니다. 일부는 POS 테거를 교육하는 데 사용하는 데이터이고, 일부는 테스트 용이거나 evaluating 성능입니다.

POS 태깅은 전통적으로 supervised learning 개의 질문이므로, 우리는 훈련하고 테스트하기 위해 POS 태그가있는 문장이 필요합니다.

실제로 사람들은 문장의 묶음에 레이블을 붙여서 testtrain으로 설정합니다. NLTK book은 이것을 잘 설명하고 있습니다. 사용해보십시오.

from nltk import UnigramTagger 
from nltk.corpus import brown 
# we'll use the brown corpus with universal tagset for readability 
tagged_sentences = brown.tagged_sents(categories="news", tagset="universal") 

# let's keep 20% of the data for testing, and 80 for training 
i = int(len(tagged_sentences)*0.2) 
train_sentences = tagged_sentences[i:] 
test_sentences = tagged_sentences[:i] 

# let's train the tagger with out train sentences 
unigram_tagger = UnigramTagger(train_sentences) 
# now let's evaluate with out test sentences 
# default evaluation metric for nltk taggers is accuracy 
accuracy = unigram_tagger.evaluate(test_sentences) 

print("Accuracy:", accuracy) 
Accuracy: 0.8630364649525858 

지금, accuracy는 "how many you got right을"알고에 대한 확인을 측정하지만, 같은 precision, recallf1-score로 우리에게 자세한 내용을주고 다른 측정 기준이있다. sklearnclassification_report을 사용하면 결과에 대한 개요를 잘 알 수 있습니다.

tagged_test_sentences = unigram_tagger.tag_sents([[token for token,tag in sent] for sent in test_sentences]) 
gold = [str(tag) for sentence in test_sentences for token,tag in sentence] 
pred = [str(tag) for sentence in tagged_test_sentences for token,tag in sentence] 
from sklearn import metrics 
print(metrics.classification_report(gold, pred)) 

      precision recall f1-score support 

      .  1.00  1.00  1.00  2107 
     ADJ  0.89  0.79  0.84  1341 
     ADP  0.97  0.92  0.94  2621 
     ADV  0.93  0.79  0.86  573 
     CONJ  1.00  1.00  1.00  453 
     DET  1.00  0.99  1.00  2456 
     NOUN  0.96  0.76  0.85  6265 
     NUM  0.99  0.85  0.92  379 
     None  0.00  0.00  0.00   0 
     PRON  1.00  0.96  0.98  502 
     PRT  0.69  0.96  0.80  481 
     VERB  0.96  0.83  0.89  3274 
      X  0.10  0.17  0.12   6 

avg/total  0.96  0.86  0.91  20458 

이제 우리는 우리가 우리의 얇은 생철을 정량화 볼 수있는 몇 가지 아이디어와 가치를 가지고,하지만 난 당신이 생각하는 확신, "That's all well and good, but how well does it perform on random sentences?"

간단히 말해

, 그것은 다른 답변에서 언급 한 것입니다, 테스트하려는 문장에 POS 태그가 지정된 데이터가 없으면 확실하게 알 수 없습니다!

0

직접 태그가 지정된 데이터를 직접 또는 다른 출처에서 읽어야합니다. 그런 다음 unigram tagger를 평가하는 방식을 따르십시오. 수동으로 태그 된 데이터에 태그를 지정할 필요가 없습니다.

`print(unigram_tagger.evaluate(yash_new_test))` 

나는이 도움이 되었으면 좋겠 : 다음 당신이해야 할 모든이 명령을 실행하는 것입니다, 당신의 새로운 태그 데이터가 yash_new_test라는 변수에 저장되어 있다고 가정!

+0

나는 당신의 제안을 달렸고 나에게이 오류를 주었다. tagged_sents = self.tag_sents (황금으로 보내려면 태그 안함 (보낸)) ValueError : 포장 할 값이 너무 많습니다 (예상 2) – Yash

+0

잘못된 방법으로 사전의 압축을 풀려고합니다. 내 접근 방식과 전혀 관련이 없습니다. – Mohammed