Итерация по различным перестановкам 4 функций в Python - PullRequest
1 голос
/ 04 марта 2011

ОК. Я использую разные теги для пометки текста. По умолчанию, униграмма, биграмма и триграмма.

Я должен проверить, какая комбинация из трех из этих четырех тегеров является наиболее точной.

Чтобы сделать это, я должен просмотреть все возможные комбинации, которые я делаю так:

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

так что каждый элемент представляет собой кортеж из трех меток типа, например: ('default_tagger', 'bigram_tagger', 'trigram_tagger')

В функции точности мне теперь нужно динамически вызывать три сопутствующих метода каждого тегера, проблема в следующем: я не знаю, как это сделать.

Функции тегера следующие:

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')

Итак, для примера код должен выглядеть так:

t0 = nltk.DefaultTagger('NN')
t1 = nltk.BigramTagger(brown_train, backoff=t0)
t2 = nltk.TrigramTagger(brown_train, backoff=t1)
t2.evaluate(brown_test)

Так что, по сути, проблема в том, как перебрать все 24 комбинации этого списка из 4 функций.

Какие-нибудь Мастера Python, которые могут мне помочь?

Ответы [ 3 ]

1 голос
/ 04 марта 2011

Не уверен, что я понял, что вам нужно, но вы можете использовать методы, которые вы хотите называть сами, вместо строк - так ваш код может выглядеть примерно так:

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 голосов
/ 04 марта 2011

на основе кода 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
0 голосов
/ 04 марта 2011

Начиная с кода jsbueno, я предлагаю написать функцию-обертку для каждого из тегеров, чтобы дать им одинаковую подпись.И поскольку они нужны вам только один раз, я предлагаю использовать лямбду.

permutaties = itertools.permutations([lambda: ntlk.DefaultTagger("NN"),
                                      lambda: nltk.UnigramTagger(brown_train, backoff),
                                      lambda: nltk.BigramTagger(brown_train, backoff),
                                      lambda: nltk.TrigramTagger(brown_train, backoff)],3)

Это позволит вам вызывать каждый из них напрямую, без специальной функции, которая определяет, какую функцию вы вызываете, и использует соответствующую сигнатуру..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...