Количество вхождений слов в тексте (вместе с похожим словом) - PullRequest
0 голосов
/ 08 сентября 2018

Я пытаюсь создать функцию, которая будет определять, сколько раз в тексте встречались разные слова. Дело в том, что я хотел бы связать воедино похожие слова (и псевдонимы).

У меня есть этот массив интересных слов (которые я определил вручную):

$interesting_words = [
  'test' => [
    'number_of_occurances' => 0,
    'connected_words' => [
        'TEST',
        'TESTER',
        'TESTING'
      ]
    ],
  'foobar' => [
    'number_of_occurances' => 0,
    'connected_words' => [
        'FOO',
        'FOOBAR',
        'BAR'
      ]
    ]
]

Пример текста.

Lorem ipsum TEST sit amet, преподаватель TESTER elit. Сед в турпи дуй. Maecenas venenatis FOOBAR facilisis. Quisque dictum, diam remaquat Mollis TESTING, Orci Tellus Aliquet NISL, БАР Molestie FOO Есть. В ТЕСТИРОВАНИИ автомобильной лектус. Curabitur ac varius ligula. Pellentesque orci urdna.

Желаемый выход.

Number of occurances for 'test': 4
Number of occurances for 'foobar': 3

Есть ли умный способ сделать это, не имея 1.000.000 for-loop?

Я делаю функцию в Laravel, если это поможет.

Ответы [ 3 ]

0 голосов
/ 08 сентября 2018
<?php


$interesting_words = [
  'test' => [
    'number_of_occurances' => 0,
    'connected_words' => [
        'TEST',
        'TESTER',
        'TESTING'
      ]
    ],
  'foobar' => [
    'number_of_occurances' => 0,
    'connected_words' => [
        'FOO',
        'FOOBAR',
        'BAR'
      ]
    ]
];

$testCount=$interesting_words['test']['number_of_occurances'];
$foobarCount=$interesting_words['foobar']['number_of_occurances'];

$text="Lorem ipsum TEST sit amet, consectetur TESTER elit. Sed in turpis dui. Maecenas venenatis 
FOOBAR facilisis. Quisque dictum, diam consequat mollis TESTING, orci tellus aliquet nisl, BAR 
molestie FOO augue at est. In TESTING vehicula lectus. Curabitur ac varius ligula. 
Pellentesque orci urdna.";

$arr= explode(" ", $text);
$numberOfWords=count($arr);
for($i=0;$i<$numberOfWords;$i++)
{
    echo "<br/>";

    if(strpos($arr[$i],'TEST') !== false){
        $testCount=$testCount+1;
    }

    elseif(strpos($arr[$i],'TESTER') !== false){          

    $testCount=$testCount+1;
    }
    elseif(strpos($arr[$i],'TESTING') !== false){

    $testCount=$testCount+1;
    } 

   elseif(strpos($arr[$i],'FOO') !== false){

    $foobarCount=$foobarCount+1;
    }  

   elseif(strpos($arr[$i],'FOOBAR') !== false){

    $foobarCount=$foobarCount+1;
    } 

   elseif(strpos($arr[$i],'BAR') !== false){ 

    $foobarCount=$foobarCount+1;
    }   
}
echo "Number of occurances for 'test':".$testCount;
echo "</br>";
echo "Number of occurances for 'foobar':".$foobarCount;
0 голосов
/ 08 сентября 2018

Вы можете использовать str_word_count && array_count_values,, чтобы получить все вхождения слов, и strtolower, чтобы сделать регистр нечувствительным к регистру, когда учитывается только производительность и число вхождений:

$words=array_count_values(str_word_count(strtolower($str),1));
foreach($interesting_words as $index=>&$details){
    foreach($details['connected_words'] as $key=>$similar){
        $details['number_of_occurances'] += $words[strtolower($similar)];
    }
}           
print_r($interesting_words );

вывод:

Array
(
    [test] => Array
        (
            [number_of_occurances] => 4
            [connected_words] => Array
                (
                    [0] => TEST
                    [1] => TESTER
                    [2] => TESTING
                )

        )

    [foobar] => Array
        (
            [number_of_occurances] => 3
            [connected_words] => Array
                (
                    [0] => FOO
                    [1] => FOOBAR
                    [2] => BAR
                )

        )

)
0 голосов
/ 08 сентября 2018

Я думаю, что это можно сделать с помощью explode и array_count_values и заставить его работать. В приведенном ниже примере я удалил . и ,

<?php
$interesting_words = [
  'test' => [
    'number_of_occurances' => 0,
    'connected_words' => [
        'TEST',
        'TESTER',
        'TESTING'
      ]
    ],
  'foobar' => [
    'number_of_occurances' => 0,
    'connected_words' => [
        'FOO',
        'FOOBAR',
        'BAR'
      ]
    ]
];
$str = 'Lorem ipsum TEST sit amet, consectetur TESTER elit. Sed in turpis dui. Maecenas venenatis FOOBAR facilisis. Quisque dictum, diam consequat mollis TESTING, orci tellus aliquet nisl, BAR molestie FOO augue at est. In TESTING vehicula lectus. Curabitur ac varius ligula. Pellentesque orci urdna.';
$str = preg_replace('/[\.\,]/i','',$str);
$str = strtolower($str);
$str_arr = explode(" ",$str);
$str_occurance_counts = array_count_values($str_arr);
foreach($interesting_words as $k=>&$v){
  foreach($v['connected_words'] as $c=>$cVal){
    $v['number_of_occurances'] += $str_occurance_counts[strtolower($cVal)];
  }
}
print_r($interesting_words );
?>

Демо-сервер Live1

Демо-сервер Live2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...