从PHP字符串检测语言从PHP字符串检测语言(Detect language from string

2019-05-04 00:00发布

在PHP中,有没有一种方法来检测一个字符串的语言? 假设字符串为UTF-8格式。

Answer 1:

你无法检测从字符类型的语言。 并且没有万无一失的方法来做到这一点。

对于任何方法,你只是做一个受过教育的猜测。 有一些可用的数学相关的文章在那里



Answer 2:

我已经使用了Text_LanguageDetect梨包装用一些合理的结果。 它死了简单易用,而且它有一个适度的52种语言数据库。 不足之处是没有检测的东亚语言。

require_once 'Text/LanguageDetect.php';
$l = new Text_LanguageDetect();
$result = $l->detect($text, 4);
if (PEAR::isError($result)) {
    echo $result->getMessage();
} else {
    print_r($result);
}

结果是:

Array
(
    [german] => 0.407037037037
    [dutch] => 0.288065843621
    [english] => 0.283333333333
    [danish] => 0.234526748971
)


Answer 3:

我知道这是旧的文章,但这里是我没有找到任何可行的解决方案后开发的。

  • 其他的建议都太沉重,我的情况太麻烦
  • 我支持的语言数量有限在我的网站(目前 :“恩”和“德” -但解决方案推广到更多)。
  • 我需要对用户生成的字符串的语言一个似是而非的猜测,我有一个备用的(用户的语言设置)。
  • 所以我想用最少的误报的解决方案-但不要那么在乎假阴性

该解决方案使用的语言20个最常用的词,统计那些在草堆的发生。 然后,它只是比较第一和第二计大部分语言的计数。 如果亚军数是赢家的不到10%,成王败寇这一切。

代码 - 为提高速度的任何建议都无任欢迎!

    function getTextLanguage($text, $default) {
      $supported_languages = array(
          'en',
          'de',
      );
      // German word list
      // from http://wortschatz.uni-leipzig.de/Papers/top100de.txt
      $wordList['de'] = array ('der', 'die', 'und', 'in', 'den', 'von', 
          'zu', 'das', 'mit', 'sich', 'des', 'auf', 'für', 'ist', 'im', 
          'dem', 'nicht', 'ein', 'Die', 'eine');
      // English word list
      // from http://en.wikipedia.org/wiki/Most_common_words_in_English
      $wordList['en'] = array ('the', 'be', 'to', 'of', 'and', 'a', 'in', 
          'that', 'have', 'I', 'it', 'for', 'not', 'on', 'with', 'he', 
          'as', 'you', 'do', 'at');
      // clean out the input string - note we don't have any non-ASCII 
      // characters in the word lists... change this if it is not the 
      // case in your language wordlists!
      $text = preg_replace("/[^A-Za-z]/", ' ', $text);
      // count the occurrences of the most frequent words
      foreach ($supported_languages as $language) {
        $counter[$language]=0;
      }
      for ($i = 0; $i < 20; $i++) {
        foreach ($supported_languages as $language) {
          $counter[$language] = $counter[$language] + 
            // I believe this is way faster than fancy RegEx solutions
            substr_count($text, ' ' .$wordList[$language][$i] . ' ');;
        }
      }
      // get max counter value
      // from http://stackoverflow.com/a/1461363
      $max = max($counter);
      $maxs = array_keys($counter, $max);
      // if there are two winners - fall back to default!
      if (count($maxs) == 1) {
        $winner = $maxs[0];
        $second = 0;
        // get runner-up (second place)
        foreach ($supported_languages as $language) {
          if ($language <> $winner) {
            if ($counter[$language]>$second) {
              $second = $counter[$language];
            }
          }
        }
        // apply arbitrary threshold of 10%
        if (($second / $max) < 0.1) {
          return $winner;
        } 
      }
      return $default;
    }


Answer 4:

你可以这样做完全是客户端与谷歌的AJAX Language API服务 (现已解散)。

随着AJAX Language API服务,您可以翻译和使用只有JavaScript检测网页中的文本块的语言。 此外,您可以启用在网页中任何文本框或textarea的音译。 例如,如果你要音译印地文,这个API将允许用户使用英语按照发音拼写出单词印地文,并让它们出现在印地文脚本。

您可以自动检测字符串的语言

var text = "¿Dónde está el baño?";
google.language.detect(text, function(result) {
  if (!result.error) {
    var language = 'unknown';
    for (l in google.language.Languages) {
      if (google.language.Languages[l] == result.language) {
        language = l;
        break;
      }
    }
    var container = document.getElementById("detection");
    container.innerHTML = text + " is: " + language + "";
  }
});

和翻译写在一个任何字符串支持的语言 (也解散)

google.language.translate("Hello world", "en", "es", function(result) {
  if (!result.error) {
    var container = document.getElementById("translation");
    container.innerHTML = result.translation;
  }
});


Answer 5:

作为谷歌翻译API即将倒闭的免费服务,你可以试试这个免费的替代产品,这是一种替代谷歌翻译API:

http://detectlanguage.com



Answer 6:

我试过Text_LanguageDetect库,我得到的结果不太好(例如,文本“测试”被认定为爱沙尼亚语和英语不是)。

我可以推荐你试试Yandex的翻译API是免费 1万个字24小时,高达每月10万个字。 它支持(根据文档)超过60种语言。

<?php
function identifyLanguage($text)
{
    $baseUrl = "https://translate.yandex.net/api/v1.5/tr.json/detect?key=YOUR_API_KEY";
    $url = $baseUrl . "&text=" . urlencode($text);

    $ch = curl_init($url);

    curl_setopt($ch, CURLOPT_CAINFO, YOUR_CERT_PEM_FILE_LOCATION);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, TRUE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);

    $output = curl_exec($ch);
    if ($output)
    {
        $outputJson = json_decode($output);
        if ($outputJson->code == 200)
        {
            if (strlen($outputJson->lang) > 0)
            {
                return $outputJson->lang;
            }
        }
    }

    return "unknown";
}

function translateText($text, $targetLang)
{
    $baseUrl = "https://translate.yandex.net/api/v1.5/tr.json/translate?key=YOUR_API_KEY";
    $url = $baseUrl . "&text=" . urlencode($text) . "&lang=" . urlencode($targetLang);

    $ch = curl_init($url);

    curl_setopt($ch, CURLOPT_CAINFO, YOUR_CERT_PEM_FILE_LOCATION);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, TRUE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);

    $output = curl_exec($ch);
    if ($output)
    {
        $outputJson = json_decode($output);
        if ($outputJson->code == 200)
        {
            if (count($outputJson->text) > 0 && strlen($outputJson->text[0]) > 0)
            {
                return $outputJson->text[0];
            }
        }
    }

    return $text;
}

header("content-type: text/html; charset=UTF-8");

echo identifyLanguage("エクスペリエンス");
echo "<br>";
echo translateText("エクスペリエンス", "en");
echo "<br>";
echo translateText("エクスペリエンス", "es");
echo "<br>";
echo translateText("エクスペリエンス", "zh");
echo "<br>";
echo translateText("エクスペリエンス", "he");
echo "<br>";
echo translateText("エクスペリエンス", "ja");
echo "<br>";
?>


Answer 7:

你或许可以使用谷歌翻译API来检测语言如有必要将其翻译。



Answer 8:

你可以看到如何检测语言PHP中的字符串使用Text_LanguageDetect PEAR包或下载单独使用它像一个普通的PHP库。



Answer 9:

Text_LanguageDetect梨包产生可怕的后果:“豪华公寓闹”被检测为葡萄牙...

谷歌API仍然是最好的解决办法,他们给300 $免费的信用和充电您任何事情之前发出警告

下面是使用的file_get_contents下载由API检测到的郎一个超级简单的功能,所以无需下载或安装库等。

function guess_lang($str) {

    $str = str_replace(" ", "%20", $str);

    $content = file_get_contents("https://translation.googleapis.com/language/translate/v2/detect?key=YOUR_API_KEY&q=".$str);

    $lang = (json_decode($content, true));

    if(isset($lang))
        return $lang["data"]["detections"][0][0]["language"];
 }

执行:

echo guess_lang("luxury apartments downtown montreal"); // returns "en"

你可以让你的谷歌翻译在这里API密钥: https://console.cloud.google.com/apis/library/translate.googleapis.com/

这是一个短语让你去一个简单的例子。 对于更复杂的应用程序,你会想限制你的API密钥,显然使用的库。



Answer 10:

一种做法是把输入字符串转换成词,然后查找这些词在英语字典,看看有多少人存在。 这种方法有一些限制:

  • 专有名词可能无法很好地处理
  • 拼写错误可以破坏你的查找
  • 类似缩写“笑”或“B4”不一定会在字典


Answer 11:

或许提交字符串这种语言猜测者:

http://www.xrce.xerox.com/competencies/content-analysis/tools/guesser



Answer 12:

我会采取各种语言中的文件和参考他们对Unicode的。 然后,您可以使用一些贝叶斯推理来确定它是由所使用的仅仅是Unicode字符的语言。 这会从英文或俄文独立法语。

我不知道到底上还有什么可以除了语言字典查找单词确定语言(使用类似概率方法)来完成。



Answer 13:

尝试使用ASCII编码。 我使用该代码来确定る\ EN语言在我的社会BOT项目

function language($string) {
        $ru = array("208","209","208176","208177","208178","208179","208180","208181","209145","208182","208183","208184","208185","208186","208187","208188","208189","208190","208191","209128","209129","209130","209131","209132","209133","209134","209135","209136","209137","209138","209139","209140","209141","209142","209143");
        $en = array("97","98","99","100","101","102","103","104","105","106","107","108","109","110","111","112","113","114","115","116","117","118","119","120","121","122");
        $htmlcharacters = array("<", ">", "&amp;", "&lt;", "&gt;", "&");
        $string = str_replace($htmlcharacters, "", $string);
        //Strip out the slashes
        $string = stripslashes($string);
        $badthings = array("=", "#", "~", "!", "?", ".", ",", "<", ">", "/", ";", ":", '"', "'", "[", "]", "{", "}", "@", "$", "%", "^", "&", "*", "(", ")", "-", "_", "+", "|", "`");
        $string = str_replace($badthings, "", $string);
        $string = mb_strtolower($string);
        $msgarray = explode(" ", $string);
        $words = count($msgarray);
        $letters = str_split($msgarray[0]);
        $letters = ToAscii($letters[0]);
        $brackets = array("[",",","]");
        $letters = str_replace($brackets,  "", $letters);
        if (in_array($letters, $ru)) {
            $result = 'Русский' ; //russian
        } elseif (in_array($letters, $en)) {
            $result = 'Английский'; //english
        } else {
            $result = 'ошибка' . $letters; //error
        }} return $result;  


Answer 14:

我曾与良好的效果https://github.com/patrickschur/language-detection并在生产中使用它是:

  • 它使用的n-gram在语言来检测最有可能的语言(越长你的字符串/越的话,这将是更准确),这似乎像一个坚实的行之有效的方法。
  • 110种语言的支持,但你也可以限制语言的数量,只有那些你感兴趣的内容。
  • 教练和语言检测器可以很容易地改善/定制。 它采用世界人权宣言中的每种语言,以检测语言的基础上的,但如果你知道你遇到什么类型的句子,你可以很容易地扩展或替换在每种语言的使用文本和取得更好的成绩快。 “培训”这个图书馆成为更好的是容易的。
  • 我会建议增加setMaxNgrams(我将其设置为9000)在训练和一次运行它,然后也用在语言类探测器设置。 更改的n-gram数量有点不直观的(我不得不寻找通过代码来看看它是如何工作),这是一个缺点,默认(310)总是在我看来太低。 更多的n-gram使得猜测好了很多。
  • 因为图书馆是非常小的,这是比较容易理解发生了什么,以及如何调整它。

我的用法:我分析电子邮件的CRM系统知道电子邮件写于什么语言,所以发送文本给第三方服务是不是一种选择。 尽管世界人权宣言可能不是分类电子邮件的语言(如电子邮件经常有公式化的部件,如问候,这是不是人权宣言的一部分)的最佳基础是确定正确的语言像的99%情况下,如果有至少5个字在里面。

更新 :我设法提高电子邮件语言识别使用以下方法语言检测库时基本上100%:

  • 添加其他常用短语的(相关)语言样本,如“问候”,“问候”,“真诚”。 这些类型的表达式都没有人权宣言中使用。 常用词组帮助语言识别很多,尤其是经常用我的人和那些公式化(“你好”,“有一个愉快的一天”),如果你正在分析的人际交往。
  • 设置最大的ngram长度为4(而不是默认的3)。
  • 保持maxNgrams在9000前。

这些做使图书馆有点慢,所以我建议在一个异步的方式,如果可以使用它们,衡量性能。 在我的情况下,它比速度不够快和更准确的多。



Answer 15:

您可以实现的Apache提卡与Java的模块,结果插入到一个txt文件,数据库等,然后从文件中读取,DB,无论用PHP。 如果你没有那么多的内容,你可以使用谷歌的API,不过请注意,您的通话将被限制,您只能发送字符的个数有限制的API。 在写这篇文章的时候,我讲完测试版1(原来是不那么准确)和实验室版本2(我抛弃后,我读了有每天10万个字符上限)的API。



文章来源: Detect language from string in PHP