在PHP中,是否有一种方法可以检测字符串的语言?假设该字符串是以UTF-8格式编码的。
在PHP中,是否有一种方法可以检测字符串的语言?假设该字符串是以UTF-8格式编码的。
我已经使用了Text_LanguageDetect pear包,结果还可以。它非常简单易用,并且有一个包含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
)
我知道这是一篇旧帖子,但在找不到任何可行解决方案后,我开发出了以下方案。
该解决方案使用一种语言中前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', 'mot');
// 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 https://dev59.com/qHM_5IYBdhLWcg3wPAnU#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;
}
.
和,
将被替换为空格,因此成为“单词分隔符”)。但是,如果您的单词列表中包含非ASCII字符,则确实需要进行一些调整。 - Swiss Mister`$wordList['en'] = array ('the', 'be', 'to', 'of', 'and', 'a', 'in',
'that', 'have', 'I', 'it', 'for', 'not', 'on', 'with', 'he',
'as', 'you', 'do', 'at');`
`$wordList['fr'] = array ('comme', 'que', 'était', 'pour', 'sur', 'sont', 'avec',
'être', 'à', 'un', 'ce', 'par', 'mais', 'que', 'est',
'il', 'eu', 'la', 'de', 'et', 'dans');`
- Szekelygobe您可以使用 Google的AJAX语言API (现已废弃)在客户端完成此操作。
使用AJAX语言API,您可以仅使用Javascript在网页内对文本块进行翻译和语言检测。此外,您还可以在Web页面上的任何文本字段或文本区域启用转写。例如,如果您要将转写为印地语,则此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;
}
});
由于Google翻译API将停止提供免费服务,您可以尝试这个免费替代方案,它是Google翻译API的替代品:
Text_LanguageDetect这个pear包的检测结果很糟糕:“luxury apartments downtown”被检测为葡萄牙语...
Google 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"
我试用了Text_LanguageDetect库,但是得到的结果并不是很好(比如,文本“test”被识别为爱沙尼亚语而非英语)。
我建议你尝试使用Yandex翻译API,该API可以免费使用1百万字符24小时,每月高达1千万个字符。根据文档,它支持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>";
?>
我的使用:我正在分析CRM系统的电子邮件,以了解电子邮件是用哪种语言编写的,因此将文本发送到第三方服务不是一个选项。即使《世界人权宣言》可能不是将电子邮件语言分类的最佳基础(因为电子邮件通常具有公式化部分,例如问候语,这些不是《人权宣言》的一部分),但如果其中至少有5个单词,则它可以在99%的情况下确定正确的语言。
更新:当使用language-detection库时,我成功将电子邮件中的语言识别率提高到了近乎100%,方法如下:
这些会使库变慢一些,因此如果可能的话,建议以异步方式使用它们并测量性能。在我的情况下,速度已经足够快,而且更加准确。