2011-03-04 4 views
1

다른 태그를 사용하여 텍스트에 태그를 지정하고 있습니다. 기본, unigram, bigram 및 trigram.Python에서 4 가지 함수의 다른 순열을 반복합니다.

나는이 4 개의 taggers 중 3 개의 조합이 가장 정확한지 확인해야합니다. 정확도 ('default_tagger', 'bigram_tagger', 'trigram_tagger')

: 각각의 요소는, 예를 들면 같은 세 tagmethods 터플은

permutaties = list(itertools.permutations(['default_tagger','unigram_tagger', 
               'bigram_tagger','trigram_tagger'],3)) 
resultaten = [] 
for element in permutaties: 
     resultaten.append(accuracy(element)) 

:

내가 이렇게 할 모든 가능한 조합을 통해 루프 것을해야 할 function 이제 각 tagger의 3 가지 방법을 동적으로 호출해야합니다. 문제는 다음과 같습니다. 어떻게 해야할지 모르겠습니다.

unigram_tagger = nltk.UnigramTagger(brown_train, backoff=backofff) 

bigram_tagger = nltk.BigramTagger(brown_train, backoff=backofff) 

trigram_tagger = nltk.TrigramTagger(brown_train, backoff=backofff) 

default_tagger = nltk.DefaultTagger('NN') 

은 그래서 예를 들어 코드가되어야 :

그래서 본질적으로 문제는 그 목록의 모든 24 개 조합을 통해 반복하는 방법이다
t0 = nltk.DefaultTagger('NN') 
t1 = nltk.BigramTagger(brown_train, backoff=t0) 
t2 = nltk.TrigramTagger(brown_train, backoff=t1) 
t2.evaluate(brown_test) 

다음과 같이

태그 지정자 기능

은 4 가지 기능 중

저를 도울 수있는 파이썬 마스터가 있습니까? 나는 당신이 필요로 이해하면

+1

은 예 '('defaultTagger '해야하지 않을까 싶네요 백 오프 인자로 평가를 다시 사용하려는 생각,'bigramTag ','trigramTag ')'? – Rod

+1

파이썬 마스터가 나타나면 첫 번째 스 니펫은 다음과 같이 작성 될 수 있습니다 : itertools.permutations ([ 'defaultTagger', 'unigramTag', 'bigramTag', 'trigramTag' '], 3)] – tokland

+0

@Rod 사실, 더 이해하기 쉽도록 편집했지만 나머지는 편집하는 것을 잊어 버렸습니다. 이제 수정했습니다. @ tokland, 읽기 쉽도록 제안 해 주셔서 감사합니다 !! 함수 문제에 대한 아이디어가 있습니까? – Javaaaa

답변

1

는 슈어 아니,하지만 당신은 당신이 문자열 대신 자신을 호출 할 방법을 사용할 수 있습니다 - soemthing처럼 될 수있는 코드를 SOU :

permutaties = itertools.permutations([nltk.UnigramTagger, nltk.BigramTagger, nltk.TrigramTagger, nltk.DefaultTagger],3) 
resultaten = [] 
for element in permutaties: 
    resultaten.append(accuracy(element, brown_Train, brown_element)) 

def accuracy(element, brown_train,brown_element): 
    if element is nltk.DeafultTagger: 
     evaluator = element("NN") 
    else: 
     evaluator = element(brown_train, backoff=XXX) #maybe insert more elif 
        #clauses to retrieve the proper backoff parameter --or you could 
        # usr a tuple in the call to permutations so the apropriate backoff 
        #is avaliable for each function to be called 
    return evaluator.evaluate(brown_test) # ? I am not shure from your code if this is your intent 
+0

감사합니다. 그러나이 요소는 세 가지 방법으로 구성된 튜플입니다. 그러면 동적으로 처리해야하는 내용을 이해하게됩니다. 재 경기에 대한 당신의 가정은 매우 좋았습니다. 그것이 나의 의도였습니다! – Javaaaa

+0

당신이 대답 할 때까지 놀고 난 후에 나는 아직도 그것을 할 수 없다. – Javaaaa

+0

답장을 보내 주셔서 감사합니다. 정확히 작동하지 않았지만 올바른 방향을 보여 주셨습니다. 감사합니다. – Javaaaa

0

jsbueno의 코드를 시작으로, 내가 제안 각 서명자에 대해 동일한 서명을 제공하는 래퍼 함수를 ​​작성합니다. 한 번만 필요하기 때문에 람다를 사용하는 것이 좋습니다.

이렇게하면 호출하는 기능을 파악하고 적절한 서명을 사용하는 특별한 기능없이 직접 각각을 호출 할 수 있습니다.

+0

예. 감사합니다. 이미 제 코드에서 그렇게 이해하기 쉽도록 포함하지 않았습니다. 그러나 요소의 첫 번째 메서드가 DefaultTagger이면 defaulttagger는 NN이있는 텍스트의 모든 단어에 태그를 지정하므로 백 오프 할 필요가 없으므로 정의에 따라 해당 메서드를 수행하면됩니다.하지만 어쨌든 좋은 제안입니다. 그러나, 나는 지금 백 오프를 구현하는 방법을 아직도 이해하지 못한다. 어떤 아이디어? – Javaaaa

0

jsbueno 코드를 내놓고 난 당신이 코드가

permutaties = itertools.permutations([nltk.UnigramTagger, nltk.BigramTagger, nltk.TrigramTagger, nltk.DefaultTagger],3) 
resultaten = [] 
for element in permutaties: 
    resultaten.append(accuracy(element, brown_Train, brown_element)) 

def accuracy(element, brown_train,brown_element): 
    evaluator = "NN" 
    for e in element: 
     if evaluator == "NN": 
       evaluator = e("NN") 
     else: 

       evaluator = e(brown_train, backoff=evaluator) #maybe insert more elif 
        #clauses to retrieve the proper backoff parameter --or you could 
        # usr a tuple in the call to permutations so the apropriate backoff 
        #is avaliable for each function to be called 

    return evaluator.evaluate(brown_test) # ? I am not shure from your code if this is your intent 
관련 문제