Как стать автором
Обновить

Комментарии 73

На сегодня пожалуй самым удобным является Google Language API, есть также определитель от Xerox orchid.xrce.xerox.com/c/portal_public/layout?p_l_id=1.1
Это что касается монстров, а простых определителей кроме вышеназванных ещё был PHPLangautodetect, ну и в гугле есть архивы конференций с тем же автором vitaly_at
НЛО прилетело и опубликовало эту надпись здесь
Вот ктстаи страница с парочкой определителей для ручного теста mrtranslate.ru/guessers.php
Португальский и немецкий — несложно. Куда труднее — словацкий от чешского, македонский от сербского. Чего уж говорить про разнообразные индийские или китайские языки. Для нас их алфавиты выглядят одинаково, а между тем, это разные языки. На которых, к тому же, говорит гораздо больше людей, чем, скажем, на португальском.
Справится ли такой алгоритм с вот таким:
पौराणिक जम्बुद्वीप
ਦੇਸ਼ ਹੈ। ਭਾਰਤ ਦੇ ਤਿੰਨ
भारतको जनसंख्य
महाद्वीपे दक्षिणे एक
Все четыре — абсолютно разные языки.

У меня задача немного упрощается тем, что македонский от сербского отличать не нужно. Достаточно сказать, что это точно македонский или сербский. Если языки настолько похожи, что их сложно различить, значит и обрабатывать я их буду одинаково.

Если подумать в этом направлении и дальше, то имеет ли смысл задача точного определения одного языка для конкретного слова? А двух слов? На языках одной группы целые предложения могут быть одинаковыми. Значит мне нужно определить, что данный текст написан точно на [be, uk, ru], например.

Насчет иероглифов ничего сказать не могу, т.к. вижу только прямоугольнички…
А почему бы по кодам символов из UTF-8 не брать язык? Не 1 символа, так большинства, чтобы точнее было.
НЛО прилетело и опубликовало эту надпись здесь
Умляуты он чем поставит?
умляуты в таких случаях они пишут как сочетания «oe» «ae»
Хм… не знал. Ну тогда по специфичным вхождениям. Да и мы уже занимаемся некрофилией постов)
Да и это 1 из первичных анализов, которые позволяют очень сильно сузить круг поисков.
Македонский от сербского сильно отличается. Македонский имеет буквы Ѓ и Ќ, которых нет в сербско(-хорватско-)м.
Итальянский, испанский, португальский и французский ты будешь обрабатывать одинаково?
Ну он же не визуально сравнивает, может и справиться…
Хинди, Маратхи, Непальский, Санскрит.
угадал? :)
так по номерам символов в кодировке utf это без проблем различается
эта письменность (Деванагари, U+0900–U+097F) используеся кучей языков в Индии и Непале.
In addition, the Devanagari script is used
to write the following languages: Awadhi, Bagheli, Bhatneri, Bhili, Bihari, Braj Bhasha,
Chhattisgarhi, Garhwali, Gondi (Betul, Chhindwara, and Mandla dialects), Harauti, Ho,
Jaipuri, Kachchhi, Kanauji, Konkani, Kului, Kumaoni, Kurku, Kurukh, Marwari, Mundari,
Newari, Palpa, and Santali.

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

Вероятно за турецкий ваш текст приняли из-за того что сайт не работает с utf-8. Поменяйте принудительно кодировку страницы на другую и он выдаст язык правильно
НЛО прилетело и опубликовало эту надпись здесь
Киса куку, апридили изык маиво камента.

Понимаете, со стопроцентной гарантией определить, все-равно не удастся. Все-равно получите лишь вероятности. Особенно, со включением иностранных слов.
Албанский, адназначна!

Кстати, если автор текста сам не знает, на каком языке он пишет, то определить язык будет сложновато… К счастью, большинство пользователей пишут тексты с небольшим количеством ошибок.
Google translate кагбе говорит
Перевод: русский (Автоматически определен) » английский
Kish Cook, apridili izyk maivo kamenta.

А если язык определить нельзя, я хочу получить результат: это на 100% какая-то неведомая херня.
— Чёта ме сыкатна нащёт кармы Хабра. Чёза нах?
Google: Перевод этой языковой пары (белорусский – русский) пока не поддерживается.

Суровый белорусский язык :)
Гугл хорош. К вашему алгоритму, я бы добавил определение символов из которых состоит текст. Кириллица, латиница и т.д. Сужать область поиска.
Определить набор символов — это первый шаг алгоритма.
Ну да, определить массив символов, а потом сделать во так там автор приводит пример
В полиграммной модели со степенью n и основанием M текст представляется вектором {fi}, i = 1..Mn, где fi – частота встречаемости i-ой n-граммы в тексте.n-грамма является последовательностью подряд идущих n – символов вида a1…an-1an…
Ну и процентное соотношение посчитать.
И что здесь непонятного?

По-моему непонятно только одно — что не устраивает автора?
Маленькие тексты так не обработать.
Легко обрабатывается и даёт очень неплохие результаты. Когда-то я писал модуль для распознавания двух десятков языков — точность была неплохая. Одна беда: там таблицы были в 500MB. Вряд ли такое скачивание такого дела на клиент для работы в JS кого-нибудь обрадует…
500 МБ? Да это весь мой словарный запас!
И что? Вам шашечки или ехать?
ммм. а что мешает хранить таблицы на стороне сервера и AJAX'ом дергать скрипт, ковыряющийся в этих таблицах и выплевывающий результат?
Это называется Google API. Но по условиям задачки нужно проделать это на стороне клиента, с использованием javascript… Я не уверен что эта задача решается в случае сколько-нибудь похожих языков…
На данный момент использовал Google API. Задачу немного переформулировал: не грузить свой сервер такими запросами. Сервер Google — можно.
Такой вариант:
хранить только самые частоупотребительные слова (порог частоупотребительности задать по вкусу) для большинства языков. Или хранить только показательные слова, которые отличают один язык от другого. Это классификаторы уже, получается…
Также обязательно смотреть на суфиксы/префиксы/прочие части слова, которые являются отличительной чертой для языков.
Также, как предложено в соседних каментах, обязательно смотреть на буквы (что за алфавит).
Также есть метод — дерево решений. Пошагово сужать круг «подозреваемых» языков.
Я думаю чистая статистика не так эффективна, как стистика, хоть немножко приправленная лингвистикой!
во многих языках есть отдельные символы, по которым его можно определить. в чешском — «гачики» и «чарки» над буквами, в испанском — волна над «n», и так очень много где. Просто создайте наборы символов для каждого языка, и если будут вхождения — узнаете язык.

Хотя, только что написал гуглу чешскую фразу без диакритики, и он все равно сказал, что это чешский…
В латышском: ščž — те же самые.
И в литовском ščž, соответственно.
В чешском есть U c кружком (ů s kroužkem), в латышском гласные с макроном (garumzīme), в литовском гласные с огонеком (nosinė) и Е с точкой, и прочие различия. Но тем не менее, пользуясь этим несложным способом, невоможно будет различить:

английский, нидерландский, суахили, гавайский
чешский, словацкий (кажется)
русский, болгарский (если «ы» не встретится)
приведённые выше примеры на деванагари,
и разумеется, кантонский китайский и мандарин.
> А мне нужны не вероятности. Мне нужно язык определить :-)

Ну так надо всего лишь выбрать язык, для которого получилась самая большая вероятность ;)

Нет, серьезно, как тут можно обойтись без вероятностей? Особенно если есть включения иностранных слов. Просто хороший алгоритм должен выдавать правильные вероятности. Google Translate, судя по примерам, явно статистически определяет язык.
Чтобы сработали статистические методы, нужно много данных.
Google Translane может использовать словарь как последний аргумент. Хотя, он и тарабарщину разбирает довольно уверенно.
Чтобы сработали статистические методы, нужно много данных.
Абсолютно верно, но кто вам сказал, что нужно много входных данных? Можно либо построить маленькую табличку, которая будет уверенно определять язык статей в сотни килобайт, либо табличку с сотнями миллионов чисел, которая работает на фразах буквально в 2-3 слова. Я думаю у Гугла просто второй вариант — вот и всё.

Вы же хотите алгоритм, в котором вообще всех данных мало. Я сомневаюсь что такие в принципе существуют, хотя для некоторых пар (скажем Английский и Русский) проблем нет.
Собственно там нет двух вариантов — можно «обрезать» таблицу до любого уровня. Начиная с некоторого момента наступает насыщение (скажем таблица на несколько гиг работает не лучше чем таблица на 500MB), но в промежутке между десятком байт и этим размером можно взять что угодно: можно взять таблицу и в мегабайт (работает для коротких текстов, но плохо) и в килобайт (на коротких текстах практически не работает).
Задача, несомненно, интересная.
Но применительно именно к практике и Вебу (глядя на тематику блога), чем же не устраивает Accept-Language?

По теме — предположу, что к визуальному определению наиболее близок метод «частоты двухбуквенных сочетаний», развитый до N-буквенных или (1,N)-буквенных.
Глядя на результаты экспериментов с генератором абракадабры, можно предположить, что для алфавитных систем должно хватить 5ти буквенных сочетаний.
«Перенасыщение» здесь наступает, когда вероятность буквы с Nым префиксом мало отличается от вероятности с (N+1)ым префиксом.
Такую таблицу можно построить пауком, просканировав достаточное количество страниц с достоверно известным языком. Именно так оно в голове и работает.
НЛО прилетело и опубликовало эту надпись здесь


:)
Эх, знал бы профессор, что его пьяную фотку по всему миру покажут )
ну почему же сразу пьяную, просто человек с чувством юмора :)
надежный способ только один — прогонка через словари каждого слова во входном тексте, на 90% слов перевод будет существовать только с одного языка (даже для европейских языков написание подобных слов отличны)+в 90% переводов обязательно будет присутствовать один из языков, дополнительная проверка по спец символам.
Хотя абсолютно надежного способа не существует, есть фразы, которые абсолютно одинаково пишутся на разных языках и тут без смыслового анализатора не обойтись, а такое доступно только гуглу благодаря большой базе словосочетаний. (пример fine line возможно написать как на английском так и на итальянском).
Мне кажется, что вы потратите больше ресурсов своих и пользоваетля, а так же времени, организовывая все через скрипт, нежели просто спрося пользователя об этом. Я понимаю, конечно, что лень — двигатель прогресса, но не в таких фундаментальных вещах.
Так в чем проблема, если текст в UTF? Смотрим какой набор символов — определяем язык сразу или если не получается языковую группу, дальше по предлогам, артиклям и прочим характерным признакам уточняем какой именно
Из личного опыта — механизм распознавания по двухбуквенным сочетаниям работает более чем неплохо.
Выдаваемые «вероятности», как уже указывали, неважны — берём верхний элемент списка и все дела.

Сам как-то писал такую программу.

В папке languages лежат эталонные языки.
В папке testdocs — документы, для которых нужно определить язык.

Запускаете lngrecogn.exe bigram и смотрите результаты.
Можно попробовать посмотреть результат не по частотности сочетаний, а целых слов:
lngrecogn.exe wordfreq

Писалось для ascii, но для utf доработать, думаю, нетрудно.
Думаю после определения группы языков дальше следуют сделать морфологический анализ.
В каждом языке есть свои падежи и характерные им окончания. Т.е. не нужно хранить целые словари по каждому языку, достаточно только окончаний — а их не так много — и некие правила как определить окончания. Возможно еще понадобиться, хотя уже совсем в сложных ситуация, анализ не только подижей но и всего предложения, т.е. определяем к каким частям речи пренадлежит слово — тут зачему что не обязательно определить все 100% слов — и дальше смотрим на структру предложения, что за чем идет. Думаю этих методов должно хватить.
В итоге мы получим по каждому языку небольшую базу правил определения, буквенных конструкци и анализа конструкций предложения. Их можно организовать в виде модулей и подгружать только нужные (например если не удалось определить по кодировки или другими вышеперечисленными способами).
В каждом языке есть свои падежи и характерные им окончания.

Какая наивность. Контрпример: английский (и не надо про то, что в нем >1,5 падежей). Есть и другие.
я думаю анали окончаний, падежей и конструкции предложения поможет отличить его от других языков. Одних падежей мало, но этих методов в совокупности достаточно.
Я к тому, что не нужны базы словарного запаса языком, есть более гуманные методы.
НЛО прилетело и опубликовало эту надпись здесь
Конечная цель данной затеи сделать что бы сайт распознавал язык пользователя? или всетаки научить определять машину введенный текст. Насколько я знаю сайт может определить о пользователе в том числе и язык системы. что может существенно упросить задачу.
Гугл кстати не идеален…
Идеал вообще недостижим так как много фраз что-нибудь да значат на десятке языков. Часто — не одно и то же.
Посмотрите работы по когнитивной аналитической системе Луценко Евегния, он там и не такие предметы различал к примеру как распознать и сформировать составы из 9 вагонов на основе их графического изображение

Прикрутить определение языка через всеми любимый гугль. Лень ленью на лени поганяет.
1) берем википедию, считаем n-граммы символов для нужных языков
2) берем наивный байесовский классификатор, тренируем на расчитанных n-граммах
3) берем входной текст, пропускаем через тренированный классификатор, на выходе получаем вероятности для каждого из языков
4) выбираем язык с наибольшей вероятностью (можно предполагать, что изначально языки равновероятны, либо проставлять веса для каждого языка)
автор текста знает язык, на котором пишет.

А что не спросить у него? Сложно будет ответить? Или с браузера брать. Или с ip. С клиента надо спрашивать)
можно взять ip. и предложить на выбор десяток близлежащих языков. потому, что выбирать из всех языков свой — геморрой еще тот.
я имел ввиду сначало по броузеру, потом по ip (бывает, что люди ставят систему на другом языке, нежиле на родном, для примера: я нахожусь в португалии, пользуюсь системой на английском языке и пишу по-русски ) и предложить выбор нескольких ближайших языков вначале, крупным и все остальные мелким шрифтом.
тоже вариант. я просто немного Вашу мысль развил=)
Исключительно для примера… Провайдер Corbina выдает пользователям если не ошибаюсь американские… (точyо не Российские ip адреса) в результате чего их банят в Staem.
К тому же пользователь может работать за границей. Вернее всё же ориентироваться на язык системы пользователя.
ip не подходит. Мне язык текста нужно определить, а не страну автора.

Спрашивать не хочу, т.к. это не очень-то вежливо :-)
если спрашивать по-ajax'овски? Человек вводит текст, скрипт работает и выводит несколько возможных языков, и клиент выбирает из них свой) Будет выглядить эффективно. Еще если со временем число языков будет убираться) Можно придумать что-то эффектное. или с google tanslator'а парсить)
А если по IP определять страну и соответственно язык?

Допустим, определили по IP, что это Россия и уже выбор языков сужается до двух штук: русский/английский

Или, скажем считывать раскладки клавиатуры у клиента (или ява этого не может?)
А интересно, в каком сценарии работы с сайтом может понадобится, чтоб посетитель сначала набрал абзац-другой текста, а потом определять его язык? Обычно ж сначала посетителю предлагают выбрать язык интерфейса на сайте…
Например, для редактора. Когда редактор заходит в систему администрирования и что-то там пишет.

Кроме того, на некоторых сайтах пользователи общаются на нескольких языках. Представьте, например, форум переводчиков или лингвистов :-)
хм, резонно.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории