如何计算两个单词列表中的出现次数来确定使用的语言?

时间:2017-08-07 04:31:30

标签: php search substring find-occurrences

我想找出网页中使用的语言。在这里,我猜基于关键字列表中的一些单词。

我从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"来自不同的关键字。生成错误。

有没有办法解决它?

更新

如果在印尼语中有2个单词,而英语只有一个单词,那么印尼语就是胜利者。但是上面的代码不能像我预期的那样工作。

例如:

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

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

英语中有一个词,即(you)。

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

2 个答案:

答案 0 :(得分: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/842143 https://eval.in/842145 (不区分大小写)

注意: - 如果您想要 不区分大小写搜索 ,请执行以下操作: -

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

English的答案相同: -

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

答案 1 :(得分:0)

这是一种优化的方法,可以将每种语言的搜索词维护为数组。

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

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

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

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