Я пытаюсь создать тэгер 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 () Я не получаю никакой ошибки.
Не могли бы вы помочь мне исправить мой код, чтобы триггерный тегер мог выполняться без ошибок?