Подумайте об использовании недетерминированного trie автомата , охватывающего полный набор распознанных суффиксов, но анализирующего слово в обратном направлении.Быть недетерминированным означает, что машина может находиться в нескольких состояниях одновременно, и машина в целом находится в состоянии принятия, если какое-либо из этих состояний принимает.
Исходное состояние будет состоянием принятия, поэтому ононе может распознать суффикс (как на английском be
).Например, из начального состояния переходы ()
, ('e', 'z', 'i')
, ('e', 'd', 'a')
и ('e', 'v', 'o')
все бы пришли к принятию состояний, и вам не нужно беспокоиться о конфликтующих 'e'
s при использовании NFA.
Из исходного состояния «символы» каждого слова подаются в обратном направлении.Каждый раз, когда машина попадает в состояние принятия, оставшаяся часть слова ищется в вашем lemmaformdict
, и все результаты сохраняются.Затем обработка продолжается до тех пор, пока состояние машины не станет нулевым (а не просто непринято).
В этот момент общий выбор лемм, указанных вдоль пути, приводит к возможным интерпретациям этого слова, удаленного из контекста (всегда быть маленьким числом).
Именно от того, как вы реализуете NFA, зависит производительность.После создания NFA могут быть преобразованы в DFA, так что машина может иметь только одно состояние в любой момент времени, что может повысить производительность, не усложняя конструкцию машины.С другой стороны, вы должны работать с вводом на уровне отдельных персонажей, что для Python может снизить производительность.(Но если производительность , что драгоценно, возможно, вам стоит перейти на C ++.)