将文本识别为简体与繁体中文

时间:2010-11-02 23:33:49

标签: php unicode cjk language-detection

鉴于已知为中文并以UTF-8编码的文本块,有没有办法确定它是简体还是传统?

2 个答案:

答案 0 :(得分:4)

我不知道这是否有效,但我尝试使用iconv查看它是否会在字符集之间正确转换,比较来自// TRANSLIT和// IGNORE的同一转换的结果。如果两个结果匹配,那么charset转换没有遇到任何无法翻译的字符,所以你应该匹配。

$test1 = iconv("UTF-8", "big5//TRANSLIT", $text);
$test2 = iconv("UTF-8", "big5//IGNORE", $text);
if ($test1 == $test2) {
   echo 'traditional';
} else {
   $test3 = iconv("UTF-8", "gb2312//TRANSLIT", $text);
   $test4 = iconv("UTF-8", "gb2312//IGNORE", $text);
   if ($test3 == $test4) {
      echo 'simplified';
   } else {
      echo 'Failed to match either traditional or simplified';
   }
}

答案 1 :(得分:0)

由于big5gb2312省略了Unicode中存在的一些常用变体,因此代码依赖于translitignore模式之间的完全匹配会失败在相当多的正常使用案例中:尽管説話中使用的big5常见变体,但它无法将$test1 = iconv("UTF-8", "big5//IGNORE", $text); $test2 = iconv("UTF-8", "gb2312//IGNORE", $text); $len1 = mb_strlen($test1); $len2 = mb_strlen($test2); $len0 = mb_strlen($text) * 0.8; // threshold if ($len1 > $len2 && $len1 > $len0) { return 'Likely Traditional'; } if ($len2 > $len1 && $len2 > $len0) { return 'Likely Simplified'; } return 'Could not identify'; 标识为繁体中文

一个简单的解决方法是以模糊方式进行:

import scipy.stats as ss
list1 = []
list2 = []
for x in range(0, 10):
    list1.append(ss.exponweib.pdf(x, a=1, c=2.09, scale=10.895, loc=0))
    list2.append(ss.weibull_min.pdf(x, c=2.09, loc=0, scale=10.895))
    if list1[x]-list2[x] < .000000001:
        list1[x]=list2[x]

if list1 == list2:
    print("true")

print(ss.distributions.weibull_min.fit(list1, floc=0))
print(ss.distributions.weibull_min.fit(list1, loc=0))
print(ss.distributions.weibull_min.fit(list1, floc=0))
print(ss.distributions.exponweib.fit(list1, 1,1))
print(ss.distributions.exponweib.fit(list1, floc=0, f0=1))
print(ss.distributions.exponweib.fit(list1, floc=0, a=1, f0=1))