Лингвофорум

Лингвоблоги => Личные блоги => Блоги => Алексей Гринь => Тема начата: Алексей Гринь от августа 30, 2012, 00:59

Название: Програмное определение языка
Отправлено: Алексей Гринь от августа 30, 2012, 00:59
Для интересу сделал простейший алгоритм автоматического определения языка (как в Google Translate) на основе буквенной статистики. На удивление довольно точно определяет язык основываясь только на распределении букв для отдельного взятого текстого фрагмента (хватает 1-ого абзаца). Сигнатура языка, таким образом, всего 200-700 байт в текстовой форме.

Для тесту прогнал Отче Наш на всех поддерживаемых в данный момент языках (37).
Точно определил следующие языки:
Цитироватьдатский, голландский, английский, немецкий, шведский, исландский, африкаанс, ирландский, валлийский, финский, эстонский, венгерский, эсперанто, идо, французский, итальянский, латынь, португальский, испанский, валлонский, польский, македонский, чешский, новогреческий, тагалог, суахили, турецкий, баскский, курдский, иврит, малайский, вьетнамский, хинди, гренландский

Ошибки:
* норвежский определил как датский;
* русский определил как македонский (что, наверное, имеет некоторый смысл для Отче Наш);
* эстонский определил как литовский.

Две последние ошибки связаны с плохими таблицами (инфа 100%, нашёл только куцые, сэмплированные из 4 тысяч букв); нужно найти хорошие таблицы для македонского и литовского.

У норвежского же и датского таблицы хорошие, однако программа упорно определяет норвежский как датский, такие дела (точнее, считает «скорей всего это датский, менее вероятно - норвежский»)
Название: Програмное определение языка
Отправлено: Python от августа 30, 2012, 01:28
Есть ли смысл в подобных алгоритмах? По-моему, в половине случаев достаточно сравнения алфавитного состава (македонский и русский спутать по этому признаку практически невозможно).
Название: Програмное определение языка
Отправлено: Алексей Гринь от августа 30, 2012, 01:37
Цитата: Python от августа 30, 2012, 01:28
По-моему, в половине случаев достаточно сравнения алфавитного состава
Ну, сей алгоритм более-менее успешно отличает африкаанс от голландского, например. С простым сравнением алфавитного состава было бы больше ошибок, мне кажется, особенно в языках, использующих одну и ту же письменность. Конечно, можно вручную захардкодить определение для каждого языка (напр., английский текст наверняка содержит артикль "the"), но гибкие и элегантные алгоритмы сами по себе интереснее. При этом он не только определяет язык, но и выводит список "похожести", иногда интересно выходит.

Или, например, что если русский текст цитирует некие иноалфавитные слова? Или текст неполный, поэтому не содержит все буквы? Простое "сравнение алфавитного состава" в таких случаях обломится.
Название: Програмное определение языка
Отправлено: Алексей Гринь от августа 30, 2012, 01:51
Пример.

Голландский:
ЦитироватьDe term God is de Nederlandse benaming voor een monotheïstische Godheid.
Вывод программы (чем меньше число, тем вероятнее):
Цитироватьголландский (73,5684)
----------
немецкий (79,90258)
африкаанс (81,755190)
...
(ещё 34 сравнения)




Африкаанс:
ЦитироватьDie woord kom uit die Germaanse talegroep en is in die Westerse kultuur ekwivalent aan die Latyns-gebaseerde "Deus".
Вывод программы:
Цитироватьафрикаанс (35,47332)
----------
голландский (55,76665)
немецкий (62,14666)


Название: Програмное определение языка
Отправлено: Bhudh от августа 30, 2012, 03:23
Пока только латиница поддерживается?
Определение по отдельным уникальным для определённых алфавитов буквам вообще присутствует (в гугле его нет, кстати)?
Название: Програмное определение языка
Отправлено: Python от августа 30, 2012, 03:41
А если расширить задачу? Например, в ХІХ веке существовало множество украинских орфографий, часто несовместимых между собой, различия между которыми затрагивали не только графическую форму, но и методику обозначения фонем. Тем не менее, человек может как-то определить, является ли текст украинским.
Другой пример: представим белорусский текст в орфографии, аналогичной русской. Можно ли автоматически отличить его от русского (при том, что другие примеры текстов в данной орфографии отсутствуют)?
Еще пример: есть множество текстов на различных любительских латиницах. требуется найти среди них тексты на определенном языке (например, русском), в реальном мире использующем кириллицу или другую нелатинскую письменность.

Можно ли формализовать задачу определения языка, абстрагировавшись при этом от конкретной письменности?
Название: Програмное определение языка
Отправлено: Alone Coder от августа 30, 2012, 08:43
Цитата: Алексей Гринь от августа 30, 2012, 00:59
Для интересу сделал простейший алгоритм автоматического определения языка (как в Google Translate) на основе буквенной статистики.
А там разве не по n-граммам?
Название: Програмное определение языка
Отправлено: Alone Coder от августа 30, 2012, 15:44
У меня вот AkelPad всё время норовит текст в Win1251, который начинается с

?недешёвый, дешёвый
?темно-коричневый, коричневый /ьн/
дворцовый /ьц/
свинцовый /ьц/
образцовый /ьц/
пуховый
гороховый
ореховый
неистовый, истовый
оптовый
сотовый
дворовый
липовый
сосновый
слоновый
малиновый /ин/

открыть как KOI-8.
Что я только не пробовал. И в начало вставлял другие куски текста, и в конец.
Название: Програмное определение языка
Отправлено: Алексей Гринь от августа 30, 2012, 15:58
Мне вообще это интересно в том отношении, что после пополнения базы данных достаточным количеством языков, я хочу подсунуть ему неклассифицированные, и посмотреть что выйдет, просто ради забавы. Поэтому я не использую и не буду использовать модели, основанные на каких-то конкретных словах/сочетаниях. Ведь что забавно получается пока что, родственные языки кучкуются меж собой (но многое шибко зависит от особенностей конкретного алфавита, поэтому нужно в будущем привести всё к некоему общему псевдо-фонематическому алфавиту).

Цитата: Bhudh от августа 30, 2012, 03:23
Пока только латиница поддерживается?
Весь юникод.

Цитата: Bhudh от августа 30, 2012, 03:23
Определение по отдельным уникальным для определённых алфавитов буквам вообще присутствует
Если в текстовом фрагменте нет какой-то буквы из алфавита сравниваемого языка, то вероятность понижается на процент важности этой буквы (один из шагов). Если буква не слишком «важная» (= «распространённая»), то она не сильно влияет на исход. Потом выбирается самый вероятный вариант из списка.

Цитата: Python от августа 30, 2012, 03:41
Другой пример: представим белорусский текст в орфографии, аналогичной русской. Можно ли автоматически отличить его от русского
Думаю, можно, если белорусский язык имеет принципиальное отличное от русского распределение букв. Но я не знаю (но в принципе вероятно, т.к. белорусская лексика сильно отличается от русской, много полонизмом, мало церковнославянизмов и т.д.)

Цитата: Python от августа 30, 2012, 03:41
Еще пример: есть множество текстов на различных любительских латиницах. требуется найти среди них тексты на определенном языке (например, русском), в реальном мире использующем кириллицу или другую нелатинскую письменность.
Вот это кстати интересная задача! Но она из другой малость оперы. Да, интересно будет поэкспериментировать с алгоритмом, который бы переводил латиницу обратно в кириллицу просто основываясь на статистическом распределении, и ничего больше.
Название: Програмное определение языка
Отправлено: Python от августа 30, 2012, 18:42
ЦитироватьДа, интересно будет поэкспериментировать с алгоритмом, который бы переводил латиницу обратно в кириллицу просто основываясь на статистическом распределении, и ничего больше.
При том, что некоторые буквы кириллицы могут соответствовать диграфам латиницы.
Название: Програмное определение языка
Отправлено: Алексей Гринь от сентября 2, 2012, 01:36
Проверка на весёлое распознавание языков, отсутствующих в базе, на небольшой фразе. Берутся только языки, родственные существующим в базе.

Сделаем систему оценок:
A – самый близкий родственник (или непосредственный потомок/прародитель), «попал»;
B – попал в неродственного географического/культурного соседа; или попал в отдалённого родственника языковой группы (герм., слав. и т. д.);
C – мимо.

др.греч. ὕαλον ϕαγεῖν δύναμαι· τοῦτο οὔ με βλάπτει → распознан как новогреческий (A)
ст.-фр. Je puis mangier del voirre. Ne me nuit. → голландский (C)
оксит. Pòdi manjar de veire, me nafrariá pas → идо (B)
галлис. Eu podo xantar cristais e non cortarme → итальянский (B)
корн. Mý a yl dybry gwéder hag éf ny wra ow ankenya → валлийский (A)
англо-сакс. Ic mæg glæs eotan ond hit ne hearmiað me → английский (A)
др.-сканд. Ek get etið gler án þess að verða sár → датский (A)
фар. Eg kann eta glas, skaðaleysur → малайский (C)
фриз. Ik kin glês ite, it docht me net sear → английский (A)
люксемб. Ech kan Glas iessen, daat deet mir nët wei → африкаанс (64,2) (но 2-ое место: немецкий, 69,2) (B)
бавар. I koh Glos esa, und es duard ma ned wei →  африкаанс (B)
сев.-саам. Sáhtán borrat lása, dat ii leat bávččas → эстонский (B)
южно-кар. Minä voin syvvä st'oklua dai minule ei ole kibie → финский (A)
латв. Es varu ēst stiklu, tas man nekaitē → эстонский (B)
слов. Môžem jesť sklo. Nezraní ma → венгерский (B)
болг. Мога да ям стъкло, то не ми вреди → русский (B)

Итого получаем:
37.5% – A
50.0% – B
12.5% – C

Название: Програмное определение языка
Отправлено: Bhudh от сентября 2, 2012, 01:41
Цитата: Алексей Гринь от сентября  2, 2012, 01:36ст.-фр. Je puis mangier del voirre. Ne me nuit. → голландский (C)
Почему не B? Вполне «неродственный географический/культурный сосед».
Название: Програмное определение языка
Отправлено: Алексей Гринь от сентября 2, 2012, 04:13
Пересчитал фризский, всё-таки английский для него наиболее близкий язык, это не просто сосед.

Цитата: Bhudh от сентября  2, 2012, 01:41
Почему не B? Вполне «неродственный географический/культурный сосед».
Ну не знаю, насколько я знаю, они как-то сильно пересекаются только в Бельгии, в остальном там довольно большие расстояния (между Парижем и Амстердамом, ага?), что их связывает? Другое дело словацкий (Австро-Венгрия/сами венгры суть гаплогрупно омадьяренные словаки и т.д.) или Эстония/Латвия (маленький компактный регион, некий культурно-лингво-генетический континуум между Эстонией и Латвией и т.д.)
Название: Програмное определение языка
Отправлено: Тайльнемер от сентября 2, 2012, 04:51
Цитата: Алексей Гринь от сентября  2, 2012, 01:36
оксит. → идо (B)
Идо окситанскому — географический, культурный сосед, или в одной языковой группе? (http://lingvowiki.info/wiki/images/5/5a/Sm_eek.svg)
Название: Програмное определение языка
Отправлено: Алексей Гринь от сентября 2, 2012, 05:55
Цитата: Тайльнемер от сентября  2, 2012, 04:51
в одной языковой группе?
в одной языковой группе :D EBIN