PHP dizesinden dili algıla

11 Cevap php

PHP, bir dize dilini algılamak için bir yolu var mı? Dize UTF-8 biçiminde olduğunu varsayalım.

11 Cevap

Sen karakter türünden dili algılayamaz. Ve bunu yapmak için hiçbir kusursuz yolu vardır.

Herhangi bir yöntemle, sadece eğitimli bir tahmin yapıyoruz. Ilgili bazı matematik orada articles mevcut bulunmaktadır

Ben bazı makul sonuçları ile Text_LanguageDetect pear package kullandım. Bu ölü kullanımı basit ve mütevazı bir 52 dil veritabanına sahiptir. Dezavantajı Doğu Asya dillerinden bir algılama olduğunu.

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

in sonuçları:

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

Sen Google's AJAX Language API ile tamamen istemci tarafında yapabilirdi.

AJAX Language API ile, çevirebilir ve sadece JavaScript kullanarak bir web sayfası içinde metin blokları dilini algılar. Buna ek olarak, web sayfasında herhangi bir metin alanına veya textarea üzerinde çevirisini etkinleştirebilirsiniz. Eğer Hintçe transliterating olsaydı Örneğin, bu API kullanıcıların fonetik İngilizce kullanarak Hintçe kelimeleri heceleyerek ve onları Hintçe komut görünmesini sağlayacaktır.

Otomatik olarak bir dize dilini algılayabilir

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

Ve supported languages birinde yazılmış herhangi bir dize çevirmek

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

Google API ücretsiz bir hizmet olarak kapatıyor gidiyor tercüme gibi, Google Translate API için bir yedek olan bu ücretsiz alternatif deneyebilirsiniz:

http://detectlanguage.com

Servis Lnag kimliği API http://langid.net/identify-language-from-api.html kullanabilirsiniz

Muhtemelen dili gerekirse and çevirmek algılamak için Google Translate API kullanabilirsiniz.

Ben bu eski bir yazı olduğunu biliyorum, ama burada herhangi bir geçerli çözüm bulduktan sonra geliştirilen budur.

  • Diğer öneriler benim durum için tüm çok ağır ve çok hantal
  • Ben (two şu anda: 'tr' ve 'de' - ama çözümü daha fazla genelleştirilmiş) web sitemde bir finite number of languages destekler.
  • Ben bir kullanıcı tarafından oluşturulan dize dili hakkında makul bir tahmin gerekiyor ve ben bir geri dönüş (kullanıcı dil ayarı) var.
  • Yani ben minimal false positives bir çözüm istiyorum - ama false negatives hakkında çok fazla umurumda değil.

Çözelti bir dilde 20 en sık kullanılan sözcükleri kullanır, samanlıkta olanların oluşumları sayar. Daha sonra, sadece, birinci ve ikinci dillerin en sayılır sayılarını karşılaştırır. Runner-up numarası kazanan az% 10 olması durumunda, kazanan hepsini alır.

Kod - hızlı iyileştirme için herhangi bir öneriniz karşılama daha vardır!

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

Bir yaklaşım kelimeleri içine girdi dizesi kırmak ve daha sonra mevcut onlardan kaç görmek için bir İngilizce Sözlük bu kelimeleri aramak için olabilir. Bu yaklaşım birkaç sınırlamaları vardır:

  • Uygun isimler de ele olmayabilir
  • yazım hataları aramaları bozabilir
  • "lol" veya "b4" gibi kısaltmalar mutlaka sözlükte olmayacak

Belki de bu dil tahminci için dize gönderin:

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

Çeşitli dillerden belgeleri almak ve Unicode karşı başvurur. Eğer o zaman kullanılan sadece unicode karakterler tarafından hangi dil belirlemek için bazı bayesian akıl kullanabilirsiniz. Bu İngilizce veya Rusça Fransızca'yı ayırmak olacaktır.

Ben tam olarak (benzer bir olasılıklı yaklaşım kullanarak) dilini belirlemek için dil sözlüklerde kelime arama dışında yapılabileceğini başka ne emin değilim.

Sen how to detect language for a string in php Text_LanguageDetect Armut Paketi kullanarak veya düzenli bir php kütüphane gibi ayrı ayrı kullanmak indirmeden görebilirsiniz.