Как определить язык (английский, китайский...) данной строки в Oracle?

Как определить язык (английский, китайский...) заданного значения (значение столбца таблицы) в Oracle (многоязыковая среда)?

Ответ 1

Должна быть возможность использовать библиотеку, например Language Dectection для Java и связать ее с PL/SQL.

Вероятно, более эффективно использовать SQL для наивной байесовской фильтрации и использовать полученные языковые профили, например. из Википедии (они аккуратно упакованы здесь).

Это всего лишь указатели, а не полное решение в соответствии с просьбой о награждении, но должны помочь искателям сокровищ.

Ответ 2

Вы имеете в виду язык как "какой язык это слово принадлежит" или как "кодировка символов"?

В первом случае я думаю, что есть только эвристика, я не уверен, что Oracle Database отправляет какие-либо. Oracle Ultra Search имеет статистический распознаватель языка.

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

Ответ 3

Возможное решение может быть:

1) поддерживайте некоторые файлы dictionary.txt на языках, которые вы ожидаете

2) при анализе входной строки, о которой идет речь, используйте что-то вроде сканера, чтобы читать каждое слово и искать его в наиболее ожидаемом словаре, пока разумное количество совпадений или сбоев не позволит вам утверждать, что строка не из этого (возможно, определенный процент).

3) Проверьте следующий, скорее всего, словарь и т.д., пока не найдете ответ или не сможете его определить.

Например, у вас есть английскийDict.txt, spanishDict.txt и frenchDict.txt, и, возможно, проверьте, есть ли первые первые слова в englishDict.txt, и если вы найдете разумное число (скажем, 70 из 100), вы можете разумно предположить, что это на английском языке; в противном случае проверьте следующий файл. Или вы также можете прочитать из каждого Словаря и выбрать результат с наибольшим количеством совпадений.

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

Ответ 4

Комплект разработки Oracle для глобализации может обнаруживать языки.

GDK входит в состав Oracle, но по умолчанию он не установлен в базе данных. Чтобы загрузить файлы .jar в базу данных, найдите каталог jlib в Oracle  домой и запустите эту команду операционной системы:

loadjava -u [email protected] orai18n.jar orai18n-collation.jar orai18n-lcsd.jar orai18n-mapping.jar orai18n-net.jar orai18n-servlet.jar orai18n-tools.jar orai18n-translation.jar orai18n-utility.jar

Некоторые дополнительные привилегии Java необходимы, даже если у вашего пользователя есть DBA. Запустите эту команду, а затем снова подключите:

exec dbms_java.grant_permission( 'YOUR_USER_NAME', 'SYS:java.lang.RuntimePermission', 'getClassLoader', '' );

Создайте класс Java для обнаружения. Ниже приведен очень простой пример, который возвращает наилучшее предположение для строки:

create or replace and compile java source named "Language_Detector"
as
import oracle.i18n.lcsd.*;
public class Language_Detector
{
    public static String detect(String some_string)
    {
        LCSDetector detector = new LCSDetector();
        detector.detect(some_string);
        LCSDResultSet detector_results = detector.getResult();
        return detector_results.getORALanguage();
    }
}
/

Оберните класс Java в PL/SQL-функцию:

create or replace function detect_language(some_string varchar2)
return varchar2
as language java
name 'Language_Detector.detect(java.lang.String) return java.lang.String';
/

Создать образец таблицы:

create table unknown_language(id number, text varchar2(4000));

insert into unknown_language
select 1, 'The quick brown fox jumps over the lazy dog' from dual union all
select 2, 'El zorro marrón rápido salta sobre el perro perezoso' from dual union all
select 3, '敏捷的棕色狐狸跳过懒狗' from dual union all
select 4, 'Der schnelle braune Fuchs springt über den faulen Hund' from dual union all
select 5, 'Быстрая коричневая лиса прыгает через ленивую собаку' from dual;

Теперь эта функция доступна в простых операциях SELECT. В этом тривиальном примере распознавание языков работает отлично.

select id, detect_language(text) language
from unknown_language
order by id;

ID  LANGUAGE
--  --------
1   ENGLISH
2   SPANISH
3   SIMPLIFIED CHINESE
4   GERMAN
5   RUSSIAN