Как посчитать вхождения из двух списков слов, чтобы определить используемый язык?

Я хочу узнать язык, используемый на веб-странице. Здесь я думаю, основываясь на некоторых словах, которые входят в список ключевых слов.

Этот скрипт я получаю от 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?";

Есть два слова из индонезийского языка, а именно (cinta а также senyum).

Есть одно слово из английского, то есть (you).

Так и должно быть, обнаруженный язык INDONESIA,

2

Решение

Я думаю, что вам нужно сделать это, как показано ниже:

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

Другие решения

Это оптимизированный метод, который поддерживает ваши поисковые слова из каждого языка в виде массива.

Он использует силу preg_match_all() с шаблоном, включающим границы слов, альтернативы и флаг без учета регистра.

Этот метод очень хорошо подходит для вашего случая, потому что вам не нужно будет подготовить вашу строку, используя preg_replace() или же strtolower(),

Оператор условия построен для скорости в том случае, если поиск на английском языке соответствует результату 0, то поиск индонезийских совпадений никогда не вызывается. Другими словами, когда нет английских слов, перед возвратом есть только два вызова функции (а именно: preg_match_all() один раз и implode() один раз). Когда есть 1 или более английских слов в $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
}
}

Вот некоторые звонки и выводы 🙁демонстрация)

$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

По вопросам рекламы [email protected]