【问题标题】:Number of occurances of words in a text (along with similar word)文本中单词的出现次数(以及相似的单词)
【发布时间】:2018-09-08 09:24:04
【问题描述】:

我正在尝试创建一个函数,它可以发现文本中出现了多少次不同的单词。问题是,我想将相似的词(和昵称)捆绑在一起。

我有这个有趣的单词数组(我手动定义的):

$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 sat amet,consectetur TESTER elit。 sed 在 turpis dui。 Maecenas venenatis FOOBAR facilisis。 Quisque dictum, diam consequat mollis 测试,orci tellus aliquet nisl,BAR molestie FOO augue 在 est. 在 TESTING vehicula lectus 中。 Curabitur ac varius ligula。 Pellentesque orci urdna。

所需的输出。

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

在没有 1.000.000 个 for 循环的情况下,有没有一种聪明的方法可以做到这一点?

如果有帮助的话,我正在 Laravel 中制作这个函数。

【问题讨论】:

  • 分解字符串并使用 in_array() 简单,只需要一个循环。并使用 array_count_values()
  • 嗯.. 我必须分解示例文本并遍历它们,这是一个 for 循环。然后我必须, - 对于每个单词,遍历 $interesting_words-array 并使用 in_array() (除非我弄错了), - 这是两个 for 循环。这是很长的文本, - 所以如果我必须多次阅读 10000 个单词:count( $interesting_words ), - 那就是相当的计算。这真的是最好的方法吗?
  • 可能要通过words数组

标签: php laravel


【解决方案1】:

您可以使用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
                )

        )

)

【讨论】:

    【解决方案2】:

    我认为它可以由explodearray_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 );
    ?>
    

    Live Demo Server1

    Live Demo Server2

    【讨论】:

      【解决方案3】:
      <?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;
      

      【讨论】:

        猜你喜欢
        • 2014-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-25
        • 2012-07-07
        • 1970-01-01
        • 2012-12-08
        相关资源
        最近更新 更多