如何确定Oracle中给定字符串的语言(英文,中文…)?

如何确定Oracle(多语言环境)中给定sting(表列值)的语言(英语,中文…)?

应该可以使用像Language Dectection for Java这样的库,并将它与PL / SQL联系起来。

使用SQL进行朴素贝叶斯过滤并使用例如来自维基百科的语言配置文件可能更有效( 它们在这里整齐地包装 )。

这些只是指针,而不是赏金要求的完整解决方案,但应该帮助赏金的人。

你的意思是“这个词属于哪种语言”或“字符编码”?

对于第一种情况,我认为只有启发式,我不确定Oracle数据库是否发布。 Oracle Ultra Search具有统计语言识别器。

在第二种情况下:编码始终是数据库的系统编码(但实际上您不应该使用它,因为它在您检索它时会转换为您的本地表示(当然,取决于您的客户端框架和驱动程序)。

可能的解决方案可能是:

1)使用您期望的语言维护一些dictionary.txt文件

2)在解析有问题的输入字符串时,使用类似扫描程序的东西来读取每个单词并在最期望的字典中搜索它,直到合理数量的匹配或失败允许你断言字符串不是来自该语言(也许一定比例)。

3)检查下一个最可能的字典等,直到找到答案,或者无法确定答案。

例如,有englishDict.txt,spanishDict.txt和frenchDict.txt,并且可能先检查englishDict.txt中是否存在前100个单词,如果找到合理的数字(例如,100个中的70个),可以合理地假设它是英文的; 否则,请检查下一个文件。 或者,您也可以从每个词典中读取,并选择匹配最多的结果。

或者,您可以首先搜索常用的语言单词,例如文章,代词和普通动词。 我有一种感觉,无论解决方案如何,您都必须执行一些搜索和比较才能找到答案。

Oracle全球化开发工具包可以检测语言。

GDK包含在Oracle中,但默认情况下不会安装在数据库中。 要将.jar文件加载到数据库中,请在Oracle主目录中找到jlib目录并运行此操作系统命令:

loadjava -u USER_NAME@SID 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 

即使您的用户具有DBA,也需要一些额外的Java权限。 运行此命令,然后重新连接:

 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