PHP中的语言检测(UTF-8)

3

有哪些代码片段可以检测UTF-8文本块的语言?我需要过滤大量中文和阿拉伯文垃圾邮件。虽然有一个PECL扩展可以实现这一点,但我想纯粹使用PHP代码来完成。我想需要用unicode版本的ord()循环遍历Unicode字符串,然后创建不同语言的范围表。


请注意,您无法通过简单的分析轻易地确定语言,这可能超出了您想要做的范围。但是,找到脚本可能会更容易,并且可能已经足够了。 - Joachim Sauer
@saua:是的,你可以。谷歌已经为你做好了这项工作。请看我的回答。 - cletus
4个回答

4

通过Google的语言检测对您的文本进行管道传输。您可以通过AJAX实现这一点。这里是文档/开发者指南。例如:

<html>
  <head>
    <script type="text/javascript" src="http://www.google.com/jsapi"></script>
    <script type="text/javascript">

    google.load("language", "1");

    function initialize() {
      var text = document.getElementById("text").innerHTML;
      google.language.detect(text, function(result) {
        if (!result.error && result.language) {
          google.language.translate(text, result.language, "en",
                                    function(result) {
            var translated = document.getElementById("translation");
            if (result.translation) {
              translated.innerHTML = result.translation;
            }
          });
        }
      });
    }
    google.setOnLoadCallback(initialize);

    </script>
  </head>
  <body>
    <div id="text">你好,很高興見到你。</div>
    <div id="translation"></div>
  </body>
</html>

2
你可以将UTF-8字符串转换为Unicode代码点,并查找“可疑范围”。
function utf8ToUnicode($utf8)
{
    if (!is_string($utf8)) {
        return false;
    }
    $unicode  = array();
    $mbbytes  = array();
    $mblength = 1;
    $strlen   = strlen($utf8);

    for ($i = 0; $i < $strlen; $i++) {
        $byte = ord($utf8{$i});
        if ($byte < 128) {
            $unicode[] = $byte;
        } else {
            if (count($mbbytes) == 0) {
                $mblength = ($byte < 224) ? 2 : 3;
            }
            $mbbytes[] = $byte;
            if (count($mbbytes) == $mblength) {
                if ($mblength == 3) {
                    $unicode[] = ($mbbytes[0] & 15) * 4096 + ($mbbytes[1] & 63) * 64 + ($mbbytes[2] & 63);
                } else {
                    $unicode[] = ($mbbytes[0] & 31) * 64 + ($mbbytes[1] & 63);
                }
                $mbbytes = array();
                $mblength = 1;
            }
        }
    }
    return $unicode;
}

0

最简单的方法可能是拥有一个包含不同语言常用词汇的字典,然后测试每种语言中有多少个正匹配。但这是一项相当昂贵(计算方面)的任务。


不必使用文字,只需在特定范围内使用单个字符即可识别阿拉伯语和中文。 - deadprogrammer

0

阿拉伯字符主要在Unicode范围0600-06FF内。Unicode还有一些补充等用于阿拉伯语。例如,代码范围0750-077F主要包含一些非洲语言中使用的阿拉伯字符。代码范围08A0-08FF涵盖了一些非洲语言、欧洲和中亚语言、巴基斯坦古兰经标记等的更多字母。如果您已经涵盖了0600-06FF,则另外两个阿拉伯Unicode代码范围FB50-FDFFFE70-FEFF可能不那么重要。

关于中文(以及日语和韩语)的字符被注册在不同的Unicode范围内(包括几个扩展)。最重要的一个范围是4E00–9FD5。假设你不需要考虑日语,这应该足够用于脚本检测,但如果你想检查扩展范围,请查看Unicode联盟的代码图表列表

所以,如果你需要仅过滤阿拉伯文和中文脚本,并且不想使用troelskn建议的方法(即使用要识别的语言的常见词汇列表 - 这对于大量语言来说不太可行),检测输入中字符的代码范围应该足够了。StackOverflow已经解决了一个早期问题,关于如何在PHP中检测Unicode范围


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接