代码之家  ›  专栏  ›  技术社区  ›  Dom Hodgson

PHP停止字列表

  •  5
  • Dom Hodgson  · 技术社区  · 15 年前

    我在代码中处理一个停止词,我有一个数组,其中包含了我想要检查的单词,以及一个数组,其中包含了我想要检查的单词。

    目前,我正在一个一个地循环遍历数组,并删除单词,如果它在数组中还是在停止词列表中,但我想知道是否有更好的方法可以做到这一点,我看过数组diff,但是如果我在第一个数组中有多个停止词,则数组diff似乎只删除第一个出现的词。

    重点是速度和内存使用,但速度更高。

    编辑-

    第一个数组是单数词,基于博客评论(这些评论通常很长),第二个数组是停止词的单数词。很抱歉没有说清楚

    谢谢

    4 回复  |  直到 11 年前
        1
  •  8
  •   Paul Dixon    15 年前

    使用str_replace…

    一个简单的方法是 str_replace str_ireplace 它可以使用一组“针”(要搜索的东西)、相应的替代品和一组“干草堆”(要操作的东西)。

    $haystacks=array(
      "The quick brown fox",
      "jumps over the ",
      "lazy dog"
    );
    
    $needles=array(
      "the", "lazy", "quick"
    );
    
    $result=str_ireplace($needles, "", $haystacks);
    
    var_dump($result);
    

    这产生

    array(3) {
      [0]=>
      string(11) "  brown fox"
      [1]=>
      string(12) "jumps over  "
      [2]=>
      string(4) " dog"
    }
    

    顺便说一下,清理这片叶子后面的空格的一个快速方法是 array_map 打电话 trim 对于每个元素

    $result=array_map("trim", $result);
    

    使用str_replace的缺点是它将替换找到的匹配项 在内部 单词,而不仅仅是整个单词。为了解决这个问题,我们可以使用正则表达式…

    使用Preg_替换

    一种使用 preg_replace 看起来与上面非常相似,但是指针是正则表达式,我们在匹配的开始和结束处使用\b检查“单词边界”

    $haystacks=array(
    "For we shall use fortran to",
    "fortify the general theme",
    "of this torrent of nonsense"
    );
    
    $needles=array(
      '/\bfor\b/i', 
      '/\bthe\b/i', 
      '/\bto\b/i', 
      '/\bof\b/i'
    );
    
    $result=preg_replace($needles, "", $haystacks);
    
        2
  •  2
  •   anubina    11 年前

    数组diff()应该可以工作。

    $sentence = "the quick brown fox jumps the fence and runs";
    $array = explode(" ", $sentence);
    $stopwords = array("the","and","an","of");
    
    print_r(array_diff($array,$stopwords));
    

    结果

    Array
    (
        [1] => quick
        [2] => brown
        [3] => fox
        [4] => jumps
        [6] => fence
        [8] => runs
    )
    

    我在这个网站上测试过: http://sandbox.onlinephpfunctions.com/

        3
  •  1
  •   Gumbo    15 年前

    如果已经有两个已排序的数组,则可以使用此算法从数组A中删除数组B中的每个元素(数学术语:a\b):

    for ($i=0, $n=count($a), $j=0, $m=count($b); $i<$n && $j<$m; ) {
        $diff = strcmp($a[$i], $b[$j]);
        if ($diff == 0) {
            unset($a[$i]);
            $i++;
        }
        if ($diff < 0) {
            $i++;
        }
        if ($diff > 0) {
            $j++;
        }
    }
    

    这只需要( n )步骤。

    另一种方法是使用数组b的字作为索引的键(使用 array_flip )重复a的值,并使用 array_key_exists :

    $index = array_flip($b);
    foreach ($a as $key => $val) {
        if (array_key_exists($val, $b)) {
            unset($a[$key]);
        }
    }
    

    再说一遍,这是O( n )因为它避免了为a中的每个值查找b中的每个值,而a中的每个值将是o( n )

        4
  •  -1
  •   Bingy    15 年前

    在数组中使用怎么样

    http://au.php.net/manual/en/function.in-array.php

    函数接受一个数组指针。

    bool in_数组(混合$needle,数组$haystack[,bool$strict])

    或者,你可以一个接一个地循环你的停止词,找到所有匹配项。