Определение языка с данными в PostgreSQL - PullRequest
8 голосов
/ 22 января 2012

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

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

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

Ответы [ 6 ]

7 голосов
/ 22 января 2012

Вы можете использовать PL / Perl (CREATE FUNCTION langof(text) LANGUAGEplperluAS ...) с 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 / Библиотека языка PL / Perl (plperl.dll) предустановлена ​​в последнем инсталляторе Windows postgres.

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

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

CREATE LANGUAGE plperlu;

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

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

5 голосов
/ 28 января 2012

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

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

4 голосов
/ 22 января 2012

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

3 голосов
/ 27 января 2012

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

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

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

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

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

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

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

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

2 голосов
/ 26 января 2012

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

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

0 голосов
/ 22 января 2013

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

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

...