在PHP中检测string中的语言

在PHP中,有没有一种方法来检测string的语言? 假设string是UTF-8格式。

您无法从字符types中检测到该语言。 并没有万无一失的方法来做到这一点。

用任何方法,你只是在做一个有教养的猜测。 那里有一些math相关的文章

我已经使用了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 ) 

你可以用Google的AJAX Language API (现在已经不存在)完全做到这一点。

使用AJAX Language API,您只需使用Javascript即可在网页内翻译和检测文本块的语言。 另外,您可以在网页上的任何文本字段或textarea上启用音译。 例如,如果您将音译转换为印地语,则此API将允许用户使用英语拼写出印地文单词,并将其显示在印地语脚本中。

您可以自动检测string的语言

 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 + ""; } }); 

并翻译任何支持的语言编写的string(也已经失效)

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

我知道这是一个旧的post,但这是我没有find任何可行的解决scheme后,我开发的。

  • 其他的build议对我来说太重了,太麻烦了
  • 我在我的网站上支持有限数量的语言 (现在是两个 :'en'和'de' – 但是解决scheme是通用的)。
  • 我需要一个用户生成的string的语言似是而非的猜测,我有一个后备(用户的语言设置)。
  • 所以我想要一个只有极less误报的解决scheme – 但是不要太在乎假的否定

该解决scheme使用了一种语言中最常用的20个单词,计算了大海捞针中的出现次数。 然后它只比较第一和第二大计数语言的计数。 如果亚军的数量less于赢家的10%,胜利者将全部拿下。

代码 – 任何提高速度的build议都比欢迎!

  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; } 

由于谷歌翻译API将作为免费服务closures,您可以尝试这个免费的替代品,这是谷歌翻译API的替代品:

http://detectlanguage.com

您可以使用服务标签ID http://langid.net/identify-language-from-api.html的; API

您可以使用Google Translate API来检测语言在必要时进行翻译。

我尝试了Text_LanguageDetect库,结果我不是很好(例如,文本“testing”被确定为爱沙尼亚语而不是英语)。

我可以推荐你尝试Yandex翻译API ,这是免费的24小时100万字,每月高达1000万字。 它支持(根据文档)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>"; ?> 

一种方法可能是将inputstring分解为单词,然后在英文字典中查找这些单词,以查看其中有多less单词出现。 这种方法有一些局限性:

  • 专有名词可能处理不好
  • 拼写错误可能会中断查找
  • 像“lol”或“b4”这样的缩写不一定在字典中

也许提交string到这个语言guesser:

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

我会采取各种语言的文件,并参考Unicode。 然后,您可以使用一些贝叶斯推理来确定使用unicode字符的是哪种语言。 这将从英文或俄文分离法语。

除了在语言词典中查找词语以确定语言(使用类似的概率方法)外,我不确定还有什么可以做的。

你可以看到如何使用Text_LanguageDetect Pear Package 来检测php中的string语言,或者像正常的php库那样单独使用它。

你可以用Java实现一个Apache Tika模块,将结果插入一个txt文件,一个数据库等等,然后从文件db中读取,不pipe用php。 如果您没有太多的内容,可以使用Google的API,但请记住,您的通话将受到限制,并且只能将有限数量的字符发送到API。 在写这篇文章的时候,我已经完成了testing版本1(其结果并不那么准确),并且实验室版本2(我读完之后发现每天有10万个字符的帽子)API。

尝试使用ascii编码。 我使用该代码来确定我的社交机器人项目中的ru \ en语言

 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; 

Text_LanguageDetect梨包产生了可怕的结果:“豪华公寓市中心”被检测为葡萄牙语…

谷歌API仍然是最好的解决scheme,他们提供300美元的免费信用,并在收取任何东西之前发出警告

下面是一个超级简单的函数,它使用file_get_contents来下载API检测到的lang,所以不需要下载或安装库等。

 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" 

您可以在这里获取您的Google翻译API密钥: https : //console.cloud.google.com/apis/library/translate.googleapis.com/

这是简短的短语让你走的一个简单的例子。 对于更复杂的应用程序,您将要限制您的API密钥,并显然使用该库。