2017-08-07 50 views
2

我想找出网页中使用的语言。在这里,我猜根据关键字列表中的一些词语。如何计算两个单词列表中的出现次数以确定正在使用的语言?

这剧本我从http://www.kangsigit.com/2017/08/php.deteksi-bahasa.html

这段代码是如何工作的只是匹配的词到"INDONESIAN and ENGLISH"关键字列表获取。如果您的关键字之一进入,那么这就是检测到的语言。

代码: -

$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个字,英文只有一个字,那么印度尼西亚语是赢家。但是上面的代码并不像我预期的那样工作。

例如:

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

有从印度尼西亚语,即(cintasenyum)两个单词。

有一个词来自英语,那就是(you)。

所以应该是,检测到的语言是INDONESIA

+0

我个人建议**映射**每个单词到它的等价值在一个n关联数组,而不是使用两个独立数组并尝试计算各种偏移量。 –

+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['INDONESIAN']))){ 

答同为English: -

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

谢谢。这对我有用。哦,是的,我的测试增加了'$ tulisan = preg_replace(“/ [^ A-Za-z] /”,'',$ tulisan);'也很酷.. – GeeJhon

+0

你为什么要求upvote?我们不打算这么做,对吧? – mickmackusa

0

这是从每种语言作为一个数组维护您的搜索词的优化方法。

它使用preg_match_all()的功能,其模式包括字边界,替代方法和不区分大小写的标志。

此方法非常适合您的情况,因为您不需要使用preg_replace()strtolower()准备字符串。

条件语句是为速度而构建的,如果搜索英语匹配结果为0,则不会调用搜索印尼语匹配项。换句话说,当没有英文单词时,返回前只有两个函数调用(具体来说:preg_match_all()一次,implode()一次)。当在$tulisan中有1个或更多英文单词时,相同的两个函数每次仅被调用一次。

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

相关问题