Части речи являются полезными подсказками к структуре и значению предложения. Вот как мы можем их идентифицировать.

Полный код этой статьи можно найти ЗДЕСЬ.

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

Мы будем использовать классический алгоритм разметки последовательностей, Скрытую марковскую модель, чтобы продемонстрировать, разметка последовательностей - это задача, в которой мы присваиваем каждому слову x1 во входной последовательности слов метку y1, поэтому выходная последовательность Y имеет ту же длину, что и входная последовательность X. HMM - это модель вероятностной последовательности, основанная на увеличении цепи Маркова. Цепь Маркова делает очень сильное предположение, что если мы хотим предсказать будущее в последовательности, все, что имеет значение, - это текущее состояние. Например, прогнозирование вероятности того, что я напишу статью на следующей неделе, зависит от того, напишу ли я статью на этой неделе, и не более того. Вы можете посмотреть видео ЗДЕСЬ, чтобы увидеть больше примеров и я бы сказал более подробное объяснение.

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

Мы будем реализовывать наш теггер, используя Коричневый корпус, где каждый файл содержит предложения токенизированных слов, за которыми следуют теги POS, и где каждая строка содержит предложение. Вы можете найти инструкцию к нашим данным с описанием тегов ЗДЕСЬ. Обратите внимание, что мы реализуем наш POS-теггер, используя биграмму HMM.

Мы можем увидеть образец наших данных ниже:

[('RB', 'manifestly'), ('VB', 'admit')]

Сначала создадим функцию для генерации n-граммов.

def ngrams(self, text, n):
    n_grams = []
    for i in range(len(text)): n_grams.append(tuple(text[i: i + n]))
    return n_grams

Вероятности перехода

HMM состоит из двух компонентов: вероятности перехода A и вероятности выбросов Б.

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

Здесь мы делим количество биграмм на количество униграмм для каждой создаваемой биграммы и сохраняем их в словаре transition_probabilities.

Вероятности выбросов

Вероятности выбросов - это вероятность того, что тег будет связан с данным словом. Мы можем рассчитать эту вероятность, используя приведенное выше уравнение, реализованное ниже:

Здесь мы делим количество тегов, за которыми следует это слово, на количество тех же тегов и сохраняем его в словаре memory_probabilities.

Тегеры HMM делают еще два упрощающих предположения. Во-первых, вероятность появления слова зависит только от его собственного тега и не зависит от соседних слов и тегов, второе предположение, предположение биграммы, заключается в том, что вероятность появления тега зависит только от предыдущего тега, а не от вся последовательность тегов. Объединение двух предположений приводит к следующему уравнению для наиболее вероятной последовательности тегов из нашего теггера bigram:

Расшифровка HMM

Для любой модели, такой как HMM, которая содержит скрытые переменные - части речи, задача определения последовательности скрытой переменной, соответствующей последовательности наблюдений, называется декодированием, и это делается с помощью Алгоритм Витерби.

Алгоритм Витерби

Алгоритм Витерби - это алгоритм динамического программирования для получения максимальной апостериорной вероятностной оценки наиболее вероятной последовательности скрытых состояний, называемый путем Витерби - что приводит к последовательности наблюдаемых событий, особенно в контексте марковских источников информации и скрытых марковских моделей (HMM). Также хороший пояснительный видеоролик можно найти ЗДЕСЬ.

Декодирование Витерби эффективно определяет наиболее вероятный путь из экспоненциально большого числа возможностей. Он находит самую высокую вероятность для слова по всем нашим тегам, просматривая наши вероятности передачи и излучения, умножая вероятности, а затем находя максимальную вероятность. Мы определим значение по умолчанию 0,0000000000001 для неизвестных вероятностей.

Мы начнем с вычисления наших начальных вероятностей / вероятности начала для этого состояния, это вероятность того, что слово начало предложение, в нашем случае мы использовали токен «START».

def initial_probabilities(self, tag):
    return self.transition_probabilities["START", tag]

Тестирование

Чтобы протестировать наше решение, мы будем использовать предложение, уже разбитое на слова, как показано ниже:

test_sent = ["We",
            "have",
            "learned",
            "much",
            "about",
            "interstellar",
            "drives",
            "since",
            "a",
            "hundred",
            "years",
            "ago",
            "that",
            "is",
            "all",
            "I",
            "can",
            "tell",
            "you",
            "about",
            "them",
            ]
cleaned_test_sent = [self.clean(w) for w in test_sent]
print(self.vertibi(cleaned_test_sent, all_tags))

Наш результат i:

we,PPSS
have,HV-HL
learned,VBN
much,AP-TL
about,RB
interstellar,JJ-HL
drives,NNS
since,IN
a,AT
hundred,CD
years,NNS
ago,RB
that,CS
is,BEZ-NC
all,QL
i,PPSS
can,MD
tell,VB-NC
you,PPO-NC
about,RP
them,DTS

Это правильно на основе нашей документации.

Я с нетерпением жду отзывов или вопросов.