Sprache aus String in PHP erkennen

Lesezeit: 9 Minuten

Sprache aus String in PHP erkennen
Beier

Gibt es in PHP eine Möglichkeit, die Sprache eines Strings zu erkennen? Angenommen, die Zeichenfolge ist im UTF-8-Format.

  • Sie möchten testen, ob ein String nicht-englische Zeichen enthält? Können Sie definieren, was „Englisch“ ist?

    – Nachzügler

    17. September 2009 um 22:08 Uhr

  • “Das Problem mit den Franzosen ist, dass sie kein Wort für Unternehmer haben”

    – Peter Kirkham

    17. September 2009 um 22:17 Uhr

  • Was ich im Grunde tun möchte, ist, dass ich eine Reihe von eingehenden Benutzerkommentaren habe, wobei jeder Kommentar in einer anderen Sprache sein könnte. Auf dem PHP-Backend möchte ich ein Flag setzen, wenn der Kommentar nicht Englisch ist (wie auf Französisch oder Japanisch), und das Frontend zeigt eine Schaltfläche zum Übersetzen an, wenn das Flag gesetzt ist

    – Beier

    17. September 2009 um 22:19 Uhr

  • Was Sie tun möchten, ist mit Javascript und Google vollständig möglich. Sie müssen nichts weiter tun als ein Include.

    – Esteban Küber

    17. September 2009 um 22:29 Uhr

  • Vielleicht möchten Sie Googles cld2 ausprobieren!

    – Stahlgehirn

    25. August 2014 um 17:57 Uhr

Ich habe die verwendet Text_LanguageDetect Birnenpaket mit einigen vernünftigen Ergebnissen. Es ist absolut einfach zu bedienen und verfügt über eine bescheidene Datenbank mit 52 Sprachen. Der Nachteil ist, dass keine ostasiatischen Sprachen erkannt werden.

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

ergibt:

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

  • Können Sie erklären, wie ich dieses Paket auf einem gemeinsam genutzten Host installieren kann? Es bereitet mir viele Probleme … Ich denke, das ist viel nützlicher für mich als die Übersetzungs-API von Google, da Google die Anzahl der Aufrufe so stark begrenzt ….

    – Roozbeh15

    11. März 2011 um 12:02 Uhr


  • @ Roozbeh15: Siehe das Verknüpfung für Installationsanweisungen auf einem gemeinsam genutzten Host

    – Denis

    8. April 2015 um 16:24 Uhr

  • Das Birnenpaket Text_LanguageDetect lieferte für mich schreckliche Ergebnisse “Luxuswohnungen in der Innenstadt” wird als Portugiesisch erkannt … Ich schlage stattdessen meine Google-API-Antwort vor.

    – Robert Sinclair

    7. November 2017 um 21:13 Uhr

Sprache aus String in PHP erkennen
Schweizer Herr

Ich weiß, dass dies ein alter Beitrag ist, aber hier ist, was ich entwickelt habe, nachdem ich keine brauchbare Lösung gefunden hatte.

  • andere Vorschläge sind alle zu schwerfällig und zu umständlich für meine Situation
  • Ich unterstütze A endlich viele Sprachen auf meiner Website (derzeit zwei: ‘en’ und ‘de’ – aber die Lösung wird für mehr verallgemeinert).
  • Ich brauche eine plausible Vermutung über die Sprache einer benutzergenerierten Zeichenfolge, und ich habe einen Fallback (die Spracheinstellung des Benutzers).
  • Also möchte ich eine Lösung mit minimale Fehlalarme – aber egal falsche Negative.

Die Lösung verwendet die 20 häufigsten Wörter einer Sprache, zählt die Vorkommen dieser im Heuhaufen. Dann vergleicht es einfach die Anzahl der am ersten und am zweithäufigsten gezählten Sprachen. Wenn die Nummer des Zweitplatzierten weniger als 10 % des Gewinners beträgt, nimmt der Gewinner alles.

Code – Alle Vorschläge zur Geschwindigkeitsverbesserung sind mehr als willkommen!

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

  • Ich mag Ihren Ansatz und denke, dass es eine gute fundierte Vermutung gibt. Es gibt einige (kleine) Probleme mit Ihrem Code, z. B. werden Wörter vor einem Punkt (.) oder Komma (,) usw. nicht gezählt

    – Nin

    27. Oktober 2014 um 12:54 Uhr

  • @Nin: Ja, es wird diese Wörter zählen (. und , werden durch Leerzeichen ersetzt und werden somit zu “Wortbegrenzern”). Aber Sie müssen tatsächlich einige Anpassungen vornehmen, wenn die Zeichenfolgen in Ihren Wortlisten Nicht-ASCII-Zeichen enthalten.

    – Schweizer Herr

    27. Oktober 2014 um 16:15 Uhr

  • Du hast Recht. Ich habe nicht aufgepasst. Ich habe es bereits geändert, um array_count_values(str_word_count($text,1)) zu verwenden. Das scheint ein bisschen schneller (Mikro) für kleine Saiten zu sein, wo ich es benutze.

    – Nin

    28. Oktober 2014 um 6:56 Uhr

  • Zusatzwörter für Französisch und Spanisch: $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

    17. Dezember 2019 um 7:12 Uhr


  • @Szekelygobe: Bitte korrigieren Sie Ihren Kommentar und ich kann Ihre Einträge hinzufügen. Sie scheinen die ‘es’-Zeile beim Kopieren und Einfügen übersehen zu haben … Außerdem: Bitte fügen Sie die Quellen Ihrer Listen hinzu.

    – Schweizer Herr

    18. Dezember 2019 um 9:36 Uhr


Sie können die Sprache nicht anhand des Zeichentyps erkennen. Und es gibt keine narrensicheren Methoden, dies zu tun.

Bei jeder Methode machen Sie nur eine fundierte Vermutung. Es sind einige mathematische Themen verfügbar Artikel dort draußen

1646646849 830 Sprache aus String in PHP erkennen
Esteban Küber

Sie könnten dies vollständig clientseitig tun Googles AJAX Language API (jetzt verstorben).

Mit der AJAX Language API können Sie die Sprache von Textblöcken auf einer Webseite nur mit Javascript übersetzen und erkennen. Darüber hinaus können Sie die Transliteration für jedes Textfeld oder jeden Textbereich auf Ihrer Webseite aktivieren. Wenn Sie beispielsweise in Hindi transliterieren, ermöglicht diese API Benutzern, Hindi-Wörter phonetisch mit Englisch zu buchstabieren und sie in der Hindi-Schrift erscheinen zu lassen.

Sie können die Sprache einer Zeichenfolge automatisch erkennen

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

Und übersetzen Sie jede Zeichenfolge, die in einer der geschrieben ist unterstützte Sprachen (auch verstorben)

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

Da Google Translate API als kostenloser Dienst eingestellt wird, können Sie diese kostenlose Alternative ausprobieren, die ein Ersatz für Google Translate API ist:

http://detectlanguage.com

  • Ich mag es, aber wenn ich mir ihre Bedingungen ansehe, macht es mich traurig, sie zu benutzen.

    – Shawn Solomon

    22. März 2012 um 13:11 Uhr

Ich habe die Text_LanguageDetect-Bibliothek ausprobiert und die Ergebnisse waren nicht sehr gut (zum Beispiel wurde der Text „test“ als Estnisch und nicht als Englisch identifiziert).

Ich kann dir empfehlen, das auszuprobieren Yandex Translate-API welches ist KOSTENLOS für 1 Million Zeichen für 24 Stunden und bis zu 10 Millionen Zeichen pro Monat. Es unterstützt (laut Dokumentation) über 60 Sprachen.

<?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>";
?>

  • Ich mag es, aber wenn ich mir ihre Bedingungen ansehe, macht es mich traurig, sie zu benutzen.

    – Shawn Solomon

    22. März 2012 um 13:11 Uhr

Text_LanguageDetect-Birnenpaket lieferte schreckliche Ergebnisse: „Luxuswohnungen in der Innenstadt“ wird als Portugiesisch erkannt …

Google API ist immer noch die beste Lösung, sie geben 300 $ kostenloses Guthaben und warnen, bevor sie Ihnen etwas in Rechnung stellen

Unten ist eine supereinfache Funktion, die file_get_contents verwendet, um die von der API erkannte Sprache herunterzuladen, sodass keine Bibliotheken usw. heruntergeladen oder installiert werden müssen.

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

Ausführen:

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

Sie können Ihren Google Translate API-Schlüssel hier erhalten: https://console.cloud.google.com/apis/library/translate.googleapis.com/

Dies ist ein einfaches Beispiel für kurze Sätze, um Sie in Schwung zu bringen. Für komplexere Anwendungen sollten Sie Ihren API-Schlüssel einschränken und offensichtlich die Bibliothek verwenden.

964960cookie-checkSprache aus String in PHP erkennen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy