Это часть серии статей о НЛП для тамильского языка. Пожалуйста, найдите первую здесь.

Подводя итог предыдущему посту, тамильский - это агглютинативный язык, который может образовывать сложные слова с потенциально бесконечными суффиксами. Мы определили морфологию как изучение того, как слова меняют форму, чтобы отображать вариации значения. Затем мы описали, как производную конечных автоматов, преобразователь конечного состояния (FST) можно использовать как для морфологического анализа, так и для генерации.

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

Для тамильского языка мы определили правила словоизменения 716 для существительных и 519 правила для глаголов.

Неконтролируемая настройка

В этом посте мы исследуем неконтролируемый способ морфологического анализа. Под этим мы подразумеваем, что мы используем необработанный, немаркированный корпус тамильского языка для разработки набора правил. Для этого мы воспользуемся основополагающей работой Джона Голдсмита (2001). Работа, которая привела к созданию программы Linguistica, автоматически извлекает основы и суффиксы на основе распознавания образов. Я объясню эту работу на английском, а затем продемонстрирую, как она прошла с тамильским языком.

Подход Linguistica

Идея Linguistica состоит в том, чтобы предложить набор подписей, которые описывают основу и набор суффиксов / префиксов (аффиксов). Например, слово / основа «играть» может быть преобразовано в «играет», «играет», «играет», «игрок», «играет»}. Подпись - это, по сути, шаблон суффиксов {‘-s’, ‘-ed’, ‘-ing’, ‘-er’, ‘’}. Алгоритм сканирует корпус на наличие частых закономерностей.

В этом виде анализа есть проблема: не все слова, оканчивающиеся на «-ing», представляют собой непрерывное настоящее (пение, струна и т. Д.). Точно так же частота слов, оканчивающихся на «-у», будет намного больше, чем «-ты». Linguistica элегантно справляется с такими вопиющими проблемами за счет использования минимальной длины описания.

Минимальная длина описания

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

Проще говоря, записать (что-то) в базу «2», вы получите количество битов, необходимых для представления этого «чего-то». Чтобы измерить средний объем информации, которую нам нужно закодировать, мы измеряем количество битов вероятности события, взвешенное по его вероятности. Отрицательный знак связан с тем, что вероятность - это дробь. Интуиция здесь заключается в том, что если вероятность события составляет 1/4, то есть 4 возможности и то, что нам действительно нужно, log (4). Это фиксируется отрицательным знаком log (4) = -log (1/4).

Теперь, независимо от корпуса, энтропия системы измеряет ее «компактность». В нашем контексте, среди различных сигнатур и суффиксов, эта мера энтропии, называемая «минимальной длиной описания», позволяет нам узнать, насколько компактна и эффективна предлагаемая нами система. Это захватывает элементы многих проблем, которые мы видели в предыдущем разделе.

В контексте морфологии мы измеряем вероятность появления слова, и каждое слово состоит из основы и подписи.

Linguistica на тамильском корпусе

Сначала я попытался запустить код для всего набора работ в Project Madurai. Поскольку статистики моей системы было недостаточно для обработки этих данных, я использовал относительно небольшой список слов, доступный в репозитории с открытым исходным кодом.

Вы не поверите, насколько прост для этого код.

import linguistica as lxa
lxa_object = lxa.read_corpus(file_path='Unique-nouns.txt')
print(lxa_object.run_signature_module(verbose=True))
print(lxa_object.signatures())

Из этого набора данных, состоящего примерно из 25000 существительных, я смог извлечь 236 правил. Точно так же для глаголов у меня есть 189 правил. Ниже я даю вам некоторые из извлеченных правил для ознакомления. Стебли также были извлечены из корпуса.

стержень - стержень, стержень + க்கு [напр. செலவு, செலவுக்கு]

стержень - стержень, стержень + த்தை, стержень + மும், стержень + ம் [например. பிரஸாத, பிரஸாதத்தை, பிரஸாதமும், பிரஸாதம்]

Как можно заметить, полученные правила являются хорошей отправной точкой. Есть проблемы, которые можно предвидеть, особенно когда применяется несколько суффиксов. Затем процедура создания основы может включать в себя суффикс также в основе. Например, தேசத்து определяется как основа для தேசத்துக்கு. Однако правильная лемма - «», а основа - «». Эта процедура не учитывает преобразование букв, просто из-за определения основы. Несмотря на эти задержки, он представляет собой прекрасную отправную точку.

Заключительные замечания

Имея набор данных среднего размера, я смог выработать довольно репрезентативный набор правил. Хотя я признаю, что могут быть ошибки, а также то, что он не решает бесконечно агглютинирующую природу языка, такого как FST, как упоминалось в предыдущем посте, он обеспечивает справедливую отправную точку по сравнению с кодированием всех этих правил с нуля. . Другими словами, это упражнение предоставляет данные для проектирования FST. Это потому, что легче исследовать и деконструировать набор морфологических правил, чем создать их с нуля.