Определение языка с данными в PostgreSQL

У меня есть таблица в PostgreSQL, где столбец - это текст. Мне нужна библиотека или инструмент, который может определить язык каждого текста в тестовых целях.

Код PostgreSQL не нужен, потому что у меня проблемы с установкой языков, но приветствуются любые языки, которые могут подключаться к базе данных, извлекать тексты и идентифицировать их.

Я использовал Lingua::Identify, предложенный в ответах, прямо в сценарии Perl, это сработало, но результаты неточные.

Тексты, которые я хочу идентифицировать, взяты из Интернета, и большинство из них на португальском языке, но Lingua::Identify классифицирует во многом как французский, итальянский и испанский языки, которые являются схожими языками.

Мне нужно что-то более точное.

Я добавил теги java и r, потому что это языки, которые я использую в системе, и решение, использующее их, будет легко реализовать, но решения на любом языке приветствуются.


person Renato Dinhani    schedule 21.01.2012    source источник
comment
Можете ли вы добавить информацию об операционной системе и версии postgres?   -  person filiprem    schedule 23.01.2012
comment
Этот поток является связанным R-решением, которое использует GoogleTranslate для перевода заданной веб-страницы. Вы можете каким-то образом решить свою проблему аналогичным образом, отправив отдельные слова и проанализировав определение языка GoogleTranslate. stackoverflow.com/questions/4258171/   -  person Rguy    schedule 29.01.2012


Ответы (6)


Попробуйте это:

В этом сообщении в блоге представлены некоторые тесты для сравнения 2 библиотеки (вместе с третьей - модулем идентификации языка Apache Tika, который на самом деле представляет собой полный набор инструментов для анализа текста).

person Gaurav    schedule 28.01.2012
comment
Здорово! И, конечно же, вы можете использовать либо PL / Java, либо драйвер JDBC для ваших целей. Всего наилучшего! - person Gaurav; 29.01.2012

Вы можете использовать PL / Perl (_ 1_ langof(text) LANGUAGE _ 3_ AS ...) с Lingua :: Identify CPAN модуль.

Сценарий Perl:

#!/usr/bin/perl
use Lingua::Identify qw(langof);
undef $/;
my $textstring = <>;  ## warning - slurps whole file to memory
my $a = langof( $textstring );    # gives the most probable language
print "$a\n";

И функция:

create or replace function langof( text ) returns varchar(2)
immutable returns null on null input
language plperlu as $perlcode$
    use Lingua::Identify qw(langof);
    return langof( shift );
$perlcode$;

Работает на меня:

filip@filip=# select langof('Pójdź, kiń-że tę chmurność w głąb flaszy');
 langof
--------
 pl
(1 row)

Time: 1.801 ms

PL / Perl для Windows

Библиотека языков PL / Perl (plperl.dll) предустановлена ​​в последней версии установщика postgres для Windows.

Но для использования PL / Perl вам понадобится сам интерпретатор Perl. В частности, Perl 5.14 (на момент написания). Самый распространенный установщик - ActiveState, но он платный. Бесплатное приложение предоставляет StrawberryPerl. Убедитесь, что у вас есть PERL514.DLL.

После установки Perl войдите в свою базу данных postgres и попробуйте запустить

CREATE LANGUAGE plperlu;

Библиотека языковой идентификации

Если вас беспокоит качество, у вас есть несколько вариантов: вы можете улучшить Lingua :: Identifyself (это открытый исходный код) или вы можете попробовать другую библиотеку. Я нашел этот, который коммерческий, но выглядит многообещающим.

person filiprem    schedule 21.01.2012
comment
Как установить PL / Perl в PostgreSQL в Windows? Думаю, эта функция заработает. - person Renato Dinhani; 23.01.2012
comment
какая версия postgres и какая винда? - person filiprem; 23.01.2012
comment
Я использовал ваше решение прямо в Perl, сработало, но обнаружение не очень хорошее, многие результаты неверны. Я объявил конкурс на открытие еще одной библиотеки в надежде, что результаты будут лучше. Спасибо за помощь. - person Renato Dinhani; 24.01.2012

Наивные классификаторы Байеса очень хорошо справляются с определением языка. Вы найдете реализации на всех основных языках или можете реализовать их самостоятельно, это не очень сложно. Интересна и запись в википедии: https://en.wikipedia.org/wiki/Naive_Bayes_classifier.

person Savino Sguera    schedule 21.01.2012
comment
Действительно, если вы создадите свои собственные классификаторы и обучите их на собственных данных, вы можете получить очень точный результат. Тем не менее, вам может потребоваться некоторое время, чтобы обучить алгоритм. - person Marcelo; 30.01.2012

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

Однако вот некоторые моменты, которые следует учитывать:

Я не уверен, какой модуль Perls Lingua::Identify действительно использует, но чаще всего эти задачи обрабатываются наивными байсовскими моделями, как кто-то указал в другом ответе. Байесские модели используют вероятность для классификации по ряду категорий, в вашем случае это будет другой язык. Теперь эти вероятности являются как зависимыми вероятностями, то есть как часто определенная характеристика появляется для каждой категории, так и независимыми (априорными) вероятностями, то есть как часто каждая категория появляется в целом.

Поскольку используются обе эти информации, вы, скорее всего, получите низкое качество прогноза, когда априорные значения неверны. Я полагаю, что Linua::Identify в основном обучался корпусу онлайн-документов, поэтому наивысшим приоритетом, скорее всего, будет английский. Это означает, что Lingua::Identify, скорее всего, классифицирует ваши документы как английские, если только у него нет серьезных причин полагать иначе (в вашем случае, скорее всего, у этого есть серьезная причина, потому что вы говорите, что ваши документы ошибочно классифицируются как итальянские, французские и испанские).

Это означает, что вам следует попытаться повторно обучить вашу модель, если это возможно. В Lingua::Identify могут быть некоторые методы, которые помогут вам в этом. Если нет, я бы посоветовал вам написать свой собственный наивный байесовский классификатор (на самом деле он довольно простой).

Если у вас есть наивный байесовский классификатор, вам нужно выбрать набор функций. Чаще всего частота букв очень характерна для каждого языка, так что это будет первое предположение. Просто попробуйте сначала обучить свой классификатор на этих частотах. Наивный байесовский классификатор используется в спам-фильтрах, поэтому вы можете тренировать его как один из них. Запустите его на выборочном наборе, и всякий раз, когда вы получаете неправильную классификацию, обновите классификатор до правильной классификации. Через некоторое время ошибаться будет все меньше и меньше.

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

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

person LiKao    schedule 27.01.2012

Я нашел библиотеку под названием TextCat, которая доступна в LGPL. . Я не могу сказать, каково качество его идентификации, но у него есть онлайн-демонстрационная форма, так что, возможно, вы можете бросить в него какой-нибудь текст, прежде чем решить, стоит ли его загружать.

Он также написан на Perl, поэтому, если вы действительно хотите его использовать, подход, описанный в ответе filiprem, будет хорошей отправной точкой.

person Gary    schedule 25.01.2012

Также существует веб-сервис определения языка, который предоставляет как бесплатные, так и дополнительные услуги по адресу http://detectlanguage.com

В нем есть Ruby и клиенты PHP, но могут быть доступны через простой веб-запрос на любом языке. Вывод в JSON.

person Laurynas    schedule 21.01.2013