Я хочу узнать язык, используемый на веб-странице. Здесь я думаю, основываясь на некоторых словах, которые входят в список ключевых слов.
Этот скрипт я получаю от 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
,
Я думаю, что вам нужно сделать это, как показано ниже:
<?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']))){
Это оптимизированный метод, который поддерживает ваши поисковые слова из каждого языка в виде массива.
Он использует силу 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 } }