Расстояние Дамерау – Левенштейна для специфических особенностей языка - PullRequest
3 голосов
/ 04 января 2011

Для говорящих на нидерландском языке два символа «ij» считаются одной буквой, которую легко заменить на «y».

Для проекта, над которым я работаю, мне бы хотелось иметь вариант расстояния Дамерау – Левенштейна , которое вычисляет расстояние между "ij" и "y" как 1 вместо текущего значения 2.

Я пробовал это сам, но не смог.Моя проблема в том, что я понятия не имею, как справиться с тем фактом, что оба текста имеют разную длину.У кого-нибудь есть предложение / фрагмент кода о том, как решить эту проблему?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 04 января 2011

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

Некоторые комбинации символов являются пережитками исторических условностей, сохранившихся до наших дней, как в современном английском языке «грубый», где «gh» может звучать как -f- или вообще не издавать ни звука. Мне кажется, что при фокусировке на необработанных «строках» алгоритм должен быть независим от исторических взаимосвязей языка и орфографического соглашения, что приводит к некоторым произвольным метрикам всякий раз, когда комбинации символов соотносятся с одной фонемой. Как бы это измерить "грубо", чтобы "ruf"? Или "через" до "через"? Или по-немецки o-umlaut до "oe"?

В вашем случае -y- можно обменять фонетически и орфографически на -ij-. Так что же это согласно алгоритму: два удаления, за которыми следует вставка или одно удаление -j- или -i- с последующим переносом оставшегося символа в -y-? Или -ij- объединяется, и за объединением следует транспозиция?

Я бы порекомендовал вам использовать другой неиспользуемый символ объединения для -ij- перед применением алгоритма, возможно, U00EC, латинскую строчную букву i с серьезным акцентом.

Как алгоритм обрабатывает символы с несколькими кодами?

1 голос
/ 04 января 2011

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

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

Чтобы прояснить ситуацию, поскольку ваш запрос в общих чертах,

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

0 голосов
/ 04 января 2011

Идея состоит в том, чтобы перевести каждую строку в некое построенное орфографическое представление, в котором орграфы, такие как «ij» и английский «gh», «th» и друзья, имеют длину только один символ.Метрика расстояния не обязательно должна быть одинаковой для всех типов замен при выполнении Дамерау-Левенштейна, чтобы вы могли использовать любые штрафы, которые вы хотите, но таблица должна быть заполнена локально, поэтому вы действительно хотите, чтобы каждый звук был одной ячейкой в ​​таблице,

Это, однако, нарушается, когда «ij» не был задуман как «ij», но был написан с ошибкой или на границе сегментации слова (я не знаю, может ли это произойти на голландском языке) или в любой другой ситуациина самом деле он не является (подразумевается) орграфом.

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

...