2017-08-07 10 views
2

ウェブページから使用されている言語を探したい。ここでは、キーワードリストにある単語のいくつかに基づいて推測しています。2つの単語のリストから出現を数えて、使用中の言語を判断するにはどうすればよいですか?

私はこのコードのしくみhttp://www.kangsigit.com/2017/08/php.deteksi-bahasa.html

から入手このスクリプトは単なる"INDONESIAN and ENGLISH"キーワードリストに単語を一致しています。キーワードの1つが入力された場合、その言語が検出されます。

コード: -

$tulisan = "Hari ini saya dapat senyum oleh suatu hal"; 
function Bahasa($tulisan, $terjemahkan) { 
     $bahasa_pilihan = array('INDONESIAN','ENGLISH'); 
     $katakunci['INDONESIAN'] = array ('cinta', 'marah', 'sayang', 'benci', 'senyum', 'peluk'); 
     $katakunci['ENGLISH'] = array ('the', 'and', 'have', 'for', 'with', 'you'); 
     $tulisan = preg_replace("/[^A-Za-z]/", ' ', $tulisan); 
     foreach ($bahasa_pilihan as $bahasa) { 
     $kalkulasi[$bahasa]=0; 
     } 
     for ($i = 0; $i < 6; $i++) { 
     foreach ($bahasa_pilihan as $bahasa) { 
      $kalkulasi[$bahasa] = $kalkulasi[$bahasa] + 

      substr_count($tulisan, ' ' .$katakunci[$bahasa][$i] . ' ');; 
     } 
     } 
     $max = max($kalkulasi); 
     $maxs = array_keys($kalkulasi, $max); 
     if (count($maxs) == 1) { 
     $pemenang = $maxs[0]; 
     $pertamax = 0; 
     foreach ($bahasa_pilihan as $bahasa) { 
      if ($bahasa <> $pemenang) { 
      if ($kalkulasi[$bahasa]>$pertamax) { 
       $pertamax = $kalkulasi[$bahasa]; 
      } 
      } 
     } 
     if (($pertamax/$max) < 0.1) { 
      return $pemenang; 
     } 
     } 
     return $terjemahkan; 
    } 
echo Bahasa($tulisan, $terjemahkan); 

しかし、ここで問題があります。 キーワード"INDONESIAN and ENGLISH"がすべて入力された場合、スクリプトはエラーになります。

例は次のように変更されます。

$tulisan = "Hari ini saya dapat senyum oleh suatu hal, you know?"; 

二つの言葉"senyum"、および"you"は異なるキーワードから来ます。エラーを生成します。

修正する方法はありますか?

UPDATE:

はインドネシアで2つのワードがある場合、英語は、1つの単語だけで、その後、インドネシア語が勝者です。しかし、上記のコードは私が期待したように動作しません。例えば

$tulisan = "Hari ini saya cinta dan dapat senyum oleh suatu hal, you know?"; 

すなわちインドネシア語、(cinta及びsenyum)から二つの単語があります。

英語からは1語、つまり(you)です。

検出される言語はINDONESIAである必要があります。

+0

私は個人的に**それぞれの単語を対応する値にマッピングすることをおすすめします。 2つの独立した配列を使用したり、さまざまなオフセットを計算しようとするのではなく、 –

+0

こんにちはALL ..私は自分の質問を更新しました。お読みください。ありがとう – GeeJhon

+0

@mickmackusa私は私の答えのメモセクションにもその解決策を追加しました。あなたは –

答えて

1

私はあなたが以下のようにそれを行う必要があると思う: -

<?php 

$tulisan = "Hari ini saya dapat senyum oleh suatu hal"; 

function Bahasa($tulisan) { 
    $bahasa_pilihan = array('INDONESIAN','ENGLISH'); 
    $katakunci['INDONESIAN'] = array ('cinta', 'marah', 'sayang', 'benci', 'senyum', 'peluk'); 
    $katakunci['ENGLISH'] = array ('the', 'and', 'have', 'for', 'with', 'you'); 

    $exploded_string = explode(' ',$tulisan); 
    $indonasian_counter = 0; 
    $english_counter = 0; 

    foreach($exploded_string as $string){ 
    if(in_array($string, $katakunci['INDONESIAN'])){ 
     $indonasian_counter +=1; 
    } 
     if(in_array($string, $katakunci['ENGLISH'])){ 
     $english_counter +=1; 
    } 
    } 
    if($indonasian_counter >$english_counter){ 
    echo "given string have more Indonesian words";echo PHP_EOL; 
    } 
    if($english_counter > $indonasian_counter){ 
    echo "given string have more English words";echo PHP_EOL; 
    } 
    if($english_counter == $indonasian_counter){ 
    echo "given string have a tie between Languages";echo PHP_EOL; 
    }  

} 

Bahasa($tulisan); 

出力: - https://eval.in/842143ORhttps://eval.in/842145(大文字と小文字を区別しない)

注: -大文字と小文字を区別しない検索は、その後の操作を行います。 - :

if(in_array(strtolower($string), array_map("strtolower",$katakunci['ENGLISH']))){ 
+0

を確認することができますありがとうございます。これは私のために働く。ああ、私のテストは '$ tulisan = preg_replace("/[^ A-Za-z]/"、$ tulisan);'クールにも追加します。 – GeeJhon

+0

なぜアップフォートを求めましたか?私たちはそれをするつもりはありません、そうですか? – mickmackusa

0

これは配列として各言語から、検索ワードを維持し、最適化する方法である - Englishに同じ

if(in_array(strtolower($string), array_map("strtolower",$katakunci['INDONESIAN']))){ 

アンス。

これは、ワード境界、選択肢、および大文字小文字を区別しないフラグを含むパターンを使用して、preg_match_all()の威力を使用します。

preg_replace()またはstrtolower()を使用して文字列を準備する必要がないため、この方法はあなたのケースに非常に適しています。

英語の一致検索の結果が0の場合、インドネシア語の一致の検索は決して呼び出されないという条件文が作成されます。言い換えれば、英語の単語がない場合、戻り前に2つの関数呼び出し(具体的にはpreg_match_all()implode()が1回だけ)があります。 $tulisanに1つ以上の英語の単語がある場合、同じ2つの関数がそれぞれもう一度呼び出されます。

preg_match_all()は、それがどのループの必要性を除去するので、大文字と小文字を区別しないように設定することができ、このタスクのための完全な機能あり、そしてそれが見つけたマッチの数を返します。

function Bahasa($tulisan){ 
    $katakunci['INDONESIAN'] = array ('cinta', 'marah', 'sayang', 'benci', 'senyum', 'peluk'); 
    $katakunci['ENGLISH'] = array ('the', 'and', 'have', 'for', 'with', 'you'); 
    if(($eng=preg_match_all('/\b(?:'.implode('|',$katakunci['ENGLISH']).')\b/i',$tulisan)) && $eng>preg_match_all('/\b(?:'.implode('|',$katakunci['INDONESIAN']).')\b/i',$tulisan)){ 
     return 'English'; // if English > 0 AND English is greater than Indonesian 
    }else{ 
     return "Indonesian"; // if English == 0 OR Indonesian >= English 
    } 
} 

これらは、いくつかのコールと出力です:あなたはパターン式を直接扱う快適/満足している場合さて、あなたはこのような効率性と簡潔さを向上させることができます(Demo

$tulisan = "Hari ini saya dapat senyum oleh suatu hal, you know?"; 
echo Bahasa($tulisan); // Indonesian (because senyum x1, you x1 

$tulisan = "Hari ini saya dapat senyum oleh suatu hal?"; 
echo Bahasa($tulisan); // Indonesian (because no English) 

$tulisan = "You know, hari ini saya dapat senyum oleh suatu hal, you know?"; 
echo Bahasa($tulisan); // English (because senyum x1, you x2) 

function Bahasa($tulisan){ 
    if(($eng=preg_match_all('/\b(?:the|and|have|for|with|you)\b/i',$tulisan)) && $eng>preg_match_all('/\b(?:cinta|marah|sayang|benci|senyum|peluk)\b/i',$tulisan)){ 
     return 'English'; // if English > 0 AND English is greater than Indonesian 
    }else{ 
     return "Indonesian"; // if English == 0 OR Indonesian >= English 
    } 
} 
+0

@GeeJhon私の答えをもう一度見てください。私は自分の答えを最適化し、私の方法を説明する時間をとった。 – mickmackusa

関連する問題