Главное меню
Мы солидарны с Украиной. Узнайте здесь, как можно поддержать Украину.

Програмное определение языка

Автор Алексей Гринь, августа 30, 2012, 00:59

0 Пользователи и 1 гость просматривают эту тему.

Алексей Гринь

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

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

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

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

У норвежского же и датского таблицы хорошие, однако программа упорно определяет норвежский как датский, такие дела (точнее, считает «скорей всего это датский, менее вероятно - норвежский»)
肏! Τίς πέπορδε;

Python

Есть ли смысл в подобных алгоритмах? По-моему, в половине случаев достаточно сравнения алфавитного состава (македонский и русский спутать по этому признаку практически невозможно).
Пролетареві ніколи вчити європейських мов, бодай би свою знати добре і на ній принести до своєї хати світло знання (Гнат Хоткевич)
ÆC CASALI NAXI PRASQURI: AHOV CÆRU, MERTVÆRI TÆ SLAVUTÆT!
Вони просили його: «Скажи: кетум», а він говорив: «сатем», і не міг вимовити правильно.
Хотелось бы также отметить, что "Питон" - это "мышиный язык" : "пи+тон". © АБР-2

Алексей Гринь

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

Или, например, что если русский текст цитирует некие иноалфавитные слова? Или текст неполный, поэтому не содержит все буквы? Простое "сравнение алфавитного состава" в таких случаях обломится.
肏! Τίς πέπορδε;

Алексей Гринь

Пример.

Голландский:
Цитировать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

Пока только латиница поддерживается?
Определение по отдельным уникальным для определённых алфавитов буквам вообще присутствует (в гугле его нет, кстати)?
Пиши, что думаешь, но думай, что пишешь.
MONEŌ ERGŌ MANEŌ.
Waheeba dokin ʔebi naha.
«каждый пост в интернете имеет коэффициент бреда» © Невский чукчо

Python

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

Можно ли формализовать задачу определения языка, абстрагировавшись при этом от конкретной письменности?
Пролетареві ніколи вчити європейських мов, бодай би свою знати добре і на ній принести до своєї хати світло знання (Гнат Хоткевич)
ÆC CASALI NAXI PRASQURI: AHOV CÆRU, MERTVÆRI TÆ SLAVUTÆT!
Вони просили його: «Скажи: кетум», а він говорив: «сатем», і не міг вимовити правильно.
Хотелось бы также отметить, что "Питон" - это "мышиный язык" : "пи+тон". © АБР-2

Alone Coder

Цитата: Алексей Гринь от августа 30, 2012, 00:59
Для интересу сделал простейший алгоритм автоматического определения языка (как в Google Translate) на основе буквенной статистики.
А там разве не по n-граммам?

Alone Coder

У меня вот AkelPad всё время норовит текст в Win1251, который начинается с

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

открыть как KOI-8.
Что я только не пробовал. И в начало вставлял другие куски текста, и в конец.

Алексей Гринь

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

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

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

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

Цитата: Python от августа 30, 2012, 03:41
Еще пример: есть множество текстов на различных любительских латиницах. требуется найти среди них тексты на определенном языке (например, русском), в реальном мире использующем кириллицу или другую нелатинскую письменность.
Вот это кстати интересная задача! Но она из другой малость оперы. Да, интересно будет поэкспериментировать с алгоритмом, который бы переводил латиницу обратно в кириллицу просто основываясь на статистическом распределении, и ничего больше.
肏! Τίς πέπορδε;

Python

ЦитироватьДа, интересно будет поэкспериментировать с алгоритмом, который бы переводил латиницу обратно в кириллицу просто основываясь на статистическом распределении, и ничего больше.
При том, что некоторые буквы кириллицы могут соответствовать диграфам латиницы.
Пролетареві ніколи вчити європейських мов, бодай би свою знати добре і на ній принести до своєї хати світло знання (Гнат Хоткевич)
ÆC CASALI NAXI PRASQURI: AHOV CÆRU, MERTVÆRI TÆ SLAVUTÆT!
Вони просили його: «Скажи: кетум», а він говорив: «сатем», і не міг вимовити правильно.
Хотелось бы также отметить, что "Питон" - это "мышиный язык" : "пи+тон". © АБР-2

Алексей Гринь

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

Сделаем систему оценок:
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:36ст.-фр. Je puis mangier del voirre. Ne me nuit. → голландский (C)
Почему не B? Вполне «неродственный географический/культурный сосед».
Пиши, что думаешь, но думай, что пишешь.
MONEŌ ERGŌ MANEŌ.
Waheeba dokin ʔebi naha.
«каждый пост в интернете имеет коэффициент бреда» © Невский чукчо

Алексей Гринь

Пересчитал фризский, всё-таки английский для него наиболее близкий язык, это не просто сосед.

Цитата: Bhudh от сентября  2, 2012, 01:41
Почему не B? Вполне «неродственный географический/культурный сосед».
Ну не знаю, насколько я знаю, они как-то сильно пересекаются только в Бельгии, в остальном там довольно большие расстояния (между Парижем и Амстердамом, ага?), что их связывает? Другое дело словацкий (Австро-Венгрия/сами венгры суть гаплогрупно омадьяренные словаки и т.д.) или Эстония/Латвия (маленький компактный регион, некий культурно-лингво-генетический континуум между Эстонией и Латвией и т.д.)
肏! Τίς πέπορδε;

Тайльнемер

Цитата: Алексей Гринь от сентября  2, 2012, 01:36
оксит. → идо (B)
Идо окситанскому — географический, культурный сосед, или в одной языковой группе?

Алексей Гринь

肏! Τίς πέπορδε;

Быстрый ответ

Обратите внимание: данное сообщение не будет отображаться, пока модератор не одобрит его.

Имя:
Имейл:
Проверка:
Оставьте это поле пустым:
Наберите символы, которые изображены на картинке
Прослушать / Запросить другое изображение

Наберите символы, которые изображены на картинке:

√36:
ALT+S — отправить
ALT+P — предварительный просмотр