Код для реализации тегов Trigram с помощью pomegranate.HiddenMarkovModel выдает ошибку - PullRequest
0 голосов
/ 28 октября 2019

Я пытаюсь создать тэгер Trigram PoS, используя pomegranate.HiddenMarkovModel, следуя коду, указанному в этой ссылке: http://haofan.wicp.io/wordpress/wp-content/uploads/2018/08/HMMTagger.html

Приведенная выше ссылка содержит код для реализации модели биграмм.

Я усовершенствовал подход к реализации тегера триграмм.

Я создал функцию для подсчета триграмм:

def trigram_counts(sequences):
    return Counter(zip(sequences, sequences[1:],sequences[2:]))
    raise NotImplementedError

tag_trigrams = trigram_counts(tags)

Далее, добавляя код для вычисления вероятности перехода, я получил ошибку. Мой код приведен ниже:

tag_transition = defaultdict(lambda:0)
for tag in tag_unigrams.keys():
    for tag2 in tag_unigrams.keys():
      for tag3 in tag_unigrams.keys():
          basic_model.add_transition(tag_state[tag], tag_state[tag2],tag_state[tag3],
                                   tag_trigrams[(tag,tag2,tag3)] / tag_bigrams[(tag,tag2)])
    basic_model.add_transition(basic_model.start, tag_state[tag],
                              tag_starts[tag] / len(data.training_set))
    basic_model.add_transition(tag_state[tag], basic_model.end,
                              tag_ends[tag] / tag_unigrams[tag])

Полная кодовая база для построения модели выглядит следующим образом:

basic_model = HiddenMarkovModel(name="base-hmm-tagger")

tag_counts = pair_counts(tags, words)
tag_state = {}
for tag in data.training_set.tagset:
    for word in data.training_set.vocab:
        try:
            tag_counts[tag][word] /= tag_unigrams[tag]
        except:
            tag_counts[tag][word] = 0
    emission = DiscreteDistribution(dict(tag_counts[tag]))
    tag_state[tag] = State(emission, name=tag)
basic_model.add_states(list(tag_state.values()))

tag_transition = defaultdict(lambda:0)
for tag in tag_unigrams.keys():
    for tag2 in tag_unigrams.keys():
        basic_model.add_transition(tag_state[tag], tag_state[tag2],
                                   tag_bigrams[(tag,tag2)] / tag_unigrams[tag])
    basic_model.add_transition(basic_model.start, tag_state[tag],
                              tag_starts[tag] / len(data.training_set))
    basic_model.add_transition(tag_state[tag], basic_model.end,
                              tag_ends[tag] / tag_unigrams[tag])

tag_transition = defaultdict(lambda:0)
for tag in tag_unigrams.keys():
    for tag2 in tag_unigrams.keys():
      for tag3 in tag_unigrams.keys():
          basic_model.add_transition(tag_state[tag], tag_state[tag2],tag_state[tag3],
                                   tag_trigrams[(tag,tag2,tag3)] / tag_bigrams[(tag,tag2)])
    basic_model.add_transition(basic_model.start, tag_state[tag],
                              tag_starts[tag] / len(data.training_set))
    basic_model.add_transition(tag_state[tag], basic_model.end,
                              tag_ends[tag] / tag_unigrams[tag])

basic_model.bake()

Я получил следующую ошибку:

TypeError Traceback (большинствопоследний вызов последним) в () 4 для tag3 в tag_unigrams.keys (): 5 basic_model.add_transition (tag_state [tag], tag_state [tag2], tag_state [tag3], ----> 6 tag_trigrams [(tag, tag2,tag3)] / tag_bigrams [(tag, tag2)]) 7 basic_model.add_transition (basic_model.start, tag_state [tag], 8 tag_starts [tag] / len (data.training_set))

/ usr / local/lib/python3.6/dist-packages/pomegranate/hmm.pyx в pomegranate.hmm.log ()

TypeError: должно быть действительным числом, а не pomegranate.base.State

ЕслиЯ удаляю tag_state [tag3] из basic_model.add_transition () Я не получаю никакой ошибки.

Не могли бы вы помочь мне исправить мой код, чтобы триггерный тегер мог выполняться без ошибок?

...