如何计算两个单词列表中的出现次数以确定使用的语言?
How to count occurrences from two lists of words to determine language in use?
我想找出网页使用的语言。这里我根据关键字列表中的一些词进行猜测。
我从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"
输入all,则脚本出错。
一个例子改成这样:
$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 OR 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
,则永远不会调用搜索印度尼西亚语匹配项。换句话说,当没有英文单词时,在return之前只有两次函数调用(具体是:preg_match_all()
一次和implode()
一次)。当 $tulisan
中有 1 个或多个英文单词时,相同的两个函数各调用一次。
preg_match_all()
是这个任务的完美函数 因为它不需要任何循环,它可以设置为不区分大小写,而且它 returns 它找到的匹配项数。
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)
Now if you are happy/comfortable dealing directly with the pattern expression, you can improve efficiency and brevity like this:
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
}
}
我想找出网页使用的语言。这里我根据关键字列表中的一些词进行猜测。
我从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"
输入all,则脚本出错。
一个例子改成这样:
$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 OR 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
,则永远不会调用搜索印度尼西亚语匹配项。换句话说,当没有英文单词时,在return之前只有两次函数调用(具体是:preg_match_all()
一次和implode()
一次)。当 $tulisan
中有 1 个或多个英文单词时,相同的两个函数各调用一次。
preg_match_all()
是这个任务的完美函数 因为它不需要任何循环,它可以设置为不区分大小写,而且它 returns 它找到的匹配项数。
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)
Now if you are happy/comfortable dealing directly with the pattern expression, you can improve efficiency and brevity like this:
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 } }