Некоторое время я размышлял, как Google переводит (или, может быть, гипотетический переводчик) язык из строки, введенной в поле "from". Я думал об этом, и единственное, что я могу придумать, - искать слова, которые уникальны для языка во входной строке. Другим способом может быть проверка формирования предложения или другой семантики в дополнение к ключевым словам. Но это, кажется, очень сложная задача, учитывая разные языки и их семантику. Я провел некоторое исследование, чтобы найти, что существуют способы использования n-граммовых последовательностей и использование некоторых статистических моделей для определения языка. Поблагодарите также ответ высокого уровня.
Как работает распознавание языка?
Ответ 1
Вам не нужно делать глубокий анализ текста, чтобы иметь представление о том, на каком языке он находится. Статистика говорит нам, что каждый язык имеет специфические шаблоны символов и частоты. Это довольно хорошее приближение первого порядка. Ухудшается, когда текст находится на нескольких языках, но все же это не что-то чрезвычайно сложное. Конечно, если текст слишком короткий (например, одно слово, хуже, одно короткое слово), статистика не работает, вам нужен словарь.
Ответ 2
Если вы хотите реализовать легкий язык угадывания на языке программирования по вашему выбору, вы можете использовать метод "Cavnar and Trenkle" 94: категоризация текста на основе N-грамм". Вы можете найти документ в Google Scholar, и это довольно прямолинейно.
Их метод строит статистику N-Грама для каждого языка, который он должен угадать впоследствии из некоторого текста на этом языке. Затем такая статистика строится и для неизвестного текста, и по сравнению с ранее подготовленной статистикой с помощью простой нестандартной меры. Если вы используете Unigrams + Bigrams (возможно, + Trigrams) и сравниваете 100-200 наиболее часто используемых N-граммов, ваш рейтинг попадания должен быть более 95%, если текст догадываться не слишком короткий. Там была демонстрационная версия , но в настоящий момент она не работает.
Существуют другие способы определения языка, включая вычисление вероятности N-граммов и более сложных классификаторов, но в большинстве случаев подход Cavnar и Trenkle должен выполняться достаточно.
Ответ 3
Возьмите Википедию на английском языке. Проверьте, какова вероятность того, что после буквы "a" появится "b" (например) и сделайте это для всей комбинации букв, вы получите матрицу вероятностей.
Если вы сделаете то же самое для Википедии на разных языках, вы получите разные матрицы для каждого языка.
Чтобы обнаружить язык, просто используйте все эти матрицы и используйте вероятности в качестве оценки, скажем, что на английском языке вы получите эту вероятность:
t- > h = 0,3 h- > e =.2
а в испанской матрице вы получите
t- > h = 0,01 h- > e =.3
Слово "the", используя английскую матрицу, даст вам оценку 0,3 + 0,2 = 0,5 и используя испанский: 0,01 + 0,3 = 0,31
Английская матрица выигрывает так, что она должна быть английской.
Ответ 4
Пример реализации.
Mathematica подходит для реализации этого. Он распознает (т.е. имеет несколько словарей) слова на следующих языках:
dicts = DictionaryLookup[All]
{"Arabic", "BrazilianPortuguese", "Breton", "BritishEnglish", \
"Catalan", "Croatian", "Danish", "Dutch", "English", "Esperanto", \
"Faroese", "Finnish", "French", "Galician", "German", "Hebrew", \
"Hindi", "Hungarian", "IrishGaelic", "Italian", "Latin", "Polish", \
"Portuguese", "Russian", "ScottishGaelic", "Spanish", "Swedish"}
Я построил небольшую и наивную функцию для вычисления вероятности предложения на каждом из этих языков:
f[text_] :=
SortBy[{#[[1]], #[[2]] / [email protected]} & /@ ([email protected](First /@
Flatten[DictionaryLookup[{All, #}] & /@ (k =
StringSplit[text]), 1])), -#[[2]] &]
Итак, просто ищу слова в словарях, вы можете получить хорошее приближение, также для коротких предложений:
f["we the people"]
{{BritishEnglish,1},{English,1},{Polish,2/3},{Dutch,1/3},{Latin,1/3}}
f["sino yo triste y cuitado que vivo en esta prisión"]
{{Spanish,1},{Portuguese,7/10},{Galician,3/5},... }
f["wszyscy ludzie rodzą się wolni"]
{{"Polish", 3/5}}
f["deutsch lernen mit jetzt"]
{{"German", 1}, {"Croatian", 1/4}, {"Danish", 1/4}, ...}
Ответ 5
Возможно, вас заинтересует Набор данных теста WiLI для идентификации письменного языка. Ответ на высокий уровень, который вы также можете найти в документе, следующий:
- Очистите текст: удалите ненужные вещи; сделайте unicode un-ambigyious, применив нормальную форму.
- Извлечение функции: подсчитайте n-граммы, создайте функции tf-idf. Что-то вроде этого
- Нарисуйте классификатор по функциям: нейронные сети, SVM, Naive Bayes,... все, что вы думаете, может работать.