从PHP中的字符串检测语言

从PHP中的字符串检测语言,php,language-detection,Php,Language Detection,在PHP中,有没有一种方法可以检测字符串的语言?假设字符串为UTF-8格式。无法从字符类型中检测语言。没有万无一失的方法可以做到这一点 不管用什么方法,你只是在做一个有根据的猜测。有一些与数学相关的可用方法一种方法可能是将输入字符串分解成单词,然后在英语词典中查找这些单词,看看有多少单词。这种方法有一些局限性: 专有名词可能处理得不好 拼写错误会中断您的查找 像“lol”或“b4”这样的缩写词不一定会出现在字典里 您可能可以使用来检测语言,并在必要时进行翻译。您可以使用(现已失效)完全在客户端

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

无法从字符类型中检测语言。没有万无一失的方法可以做到这一点


不管用什么方法,你只是在做一个有根据的猜测。有一些与数学相关的可用方法

一种方法可能是将输入字符串分解成单词,然后在英语词典中查找这些单词,看看有多少单词。这种方法有一些局限性:

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

您可能可以使用来检测语言,并在必要时进行翻译。

您可以使用(现已失效)完全在客户端完成此操作

使用AJAX语言API,您可以仅使用Javascript翻译和检测网页中文本块的语言。此外,您可以在网页中的任何文本字段或文本区域上启用音译。例如,如果您是音译为印地语,此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 + "";
  }
});
并翻译其中一个中写入的任何字符串(也已失效)


可能会将字符串提交到此语言猜测器:


我会从各种语言获取文档,并对照Unicode进行引用。然后,您可以使用一些贝叶斯推理,仅通过使用的unicode字符来确定它是哪种语言。这将把法语与英语或俄语分开

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

我已经使用了一些合理的结果。它的使用非常简单,并且有一个普通的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);
}
<?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>";
?>
结果:

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

您可以用Java实现ApacheTika模块,将结果插入txt文件、DB等,然后用php读取文件DB等。
如果你没有那么多的内容,你可以使用谷歌的API,但要记住你的调用是有限的,你只能向API发送有限数量的字符。在撰写本文时,我已经完成了API的第1版(结果不太准确)和第2版(在我读到每天有100000个字符的上限后,我放弃了)的测试。

随着Google Translate API作为一项免费服务即将关闭,你可以尝试这个免费的替代方案,这是Google Translate API的替代品:


你可以看到使用Pear软件包或下载,像普通的php库一样单独使用它。

我知道这是一篇老文章,但下面是我在没有找到任何可行的解决方案后开发的内容

  • 其他的建议对我的处境来说都太重太麻烦了
  • 我在我的网站上支持有限数量的语言(目前有两种:'en'和'de'-但解决方案更通用)
  • 我需要一个关于用户生成字符串的语言的似是而非的猜测,并且我有一个回退(用户的语言设置)
  • 所以我想要一个误报率最低的解决方案,但不要太在意误报率
该解决方案使用了一种语言中最常见的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');
      // French word list
      // from https://1000mostcommonwords.com/1000-most-common-french-words/
      $wordList['fr'] = array ('comme', 'que',  'tait',  'pour',  'sur',  'sont',  'avec',
                         'tre',  'un',  'ce',  'par',  'mais',  'que',  'est',
                         'il',  'eu',  'la', 'et', 'dans');

      // Spanish word list
      // from https://spanishforyourjob.com/commonwords/
      $wordList['es'] = array ('que', 'no', 'a', 'la', 'el', 'es', 'y',
                         'en', 'lo', 'un', 'por', 'qu', 'si', 'una',
                         'los', 'con', 'para', 'est', 'eso', 'las');
      // 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;
    }
函数getTextLanguage($text$default){ $supported\u languages=数组( "嗯",, “德”, ); //德语词表 //从http://wortschatz.uni-leipzig.de/Papers/top100de.txt $wordList['de']=数组('der'、'die'、'und'、'in'、'den'、'von', ‘zu’、‘das’、‘mit’、‘sich’、‘des’、‘auf’、‘für’、‘ist’、‘im’, ‘dem’、‘nicht’、‘ein’、‘Die’、‘eine’; //英文词表 //从http://en.wikipedia.org/wiki/Most_common_words_in_English $wordList['en']=数组('the','be','to','of','a','in',', “that”、“have”、“I”、“it”、“for”、“not”、“on”、“with”、“he”, ‘as’、‘you’、‘do’、‘at’; //法语词表 //从https://1000mostcommonwords.com/1000-most-common-french-words/ $wordList['fr']=数组('comme','que','tait','pour','sur','sont','avec', ‘tre’、‘un’、‘ce’、‘par’、‘mais’、‘que’、‘est’, “il”、“eu”、“la”、“et”、“dans”); //西班牙语词表 //从https://spanishforyourjob.com/commonwords/ $wordList['es']=数组('que','no','a','la','el','es','y', ‘en’、‘lo’、‘un’、‘por’、‘qu’、‘si’、‘una’, ‘服务水平’、‘服务水平’、‘服务水平’、‘服务水平’、‘服务水平’、‘服务水平’、‘服务水平’、‘服务水平’、‘服务水平’、‘服务水平’、‘服务水平’、‘服务水平’、‘服务水平’、‘服务; //清除输入字符串-注意,我们没有任何非ASCII //单词列表中的字符…如果不是 //在你的语言单词列表中使用大小写! $text=preg_replace(“/[^A-Za-z]/”,“”,$text); //计算最常出现的单词 foreach($language支持的语言){ $counter[$language]=0; } 对于($i=0;$i<20;$i++){ foreach($language支持的语言){ $counter[$language]=$counter[$language]+ //我相信这比华丽的正则表达式解决方案要快得多 substr_count($text,'.$wordList[$language][$i].');; } } //获取最大计数器值 //从http://stackoverflow.com/a/1461363 $max=max
<?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>";
?>
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;  
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"
    // Franch word list
    // from https://1000mostcommonwords.com/1000-most-common-french-words/
    $wordList['fr'] = array ('comme', 'que',  'était',  'pour',  'sur',  'sont',  'avec',
                             'être',  'à',  'un',  'ce',  'par',  'mais',  'que',  'est',
                             'il',  'eu',  'la', 'et', 'dans');

    // Spanish word list
    // from https://spanishforyourjob.com/commonwords/
    $wordList['es'] = array ('que', 'no', 'a', 'la', 'el', 'es', 'y',
                             'en', 'lo', 'un', 'por', 'qué', 'si', 'una',
                             'los', 'con', 'para', 'está', 'eso', 'las');