PHP停止单词列表

时间:2010-05-02 08:50:04

标签: php arrays performance words

我正在玩我的代码中的一个停用词我有一个我想要检查的数组的数组,以及我要检查的一系列单词。

目前我正在逐个循环数组,如果它的in_array与停止词列表中删除了单词,但我想知道是否有更好的方法,我看了一下array_diff等等但是,如果我在第一个数组中有多个停用词,则只显示array_diff以删除第一个匹配项。

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

编辑 -

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

由于

4 个答案:

答案 0 :(得分:8)

使用str_replace ...

一个简单的方法是使用str_replacestr_ireplace,它可以采用一系列'针'(要搜索的东西),相应的替换,以及一系列'haystacks'(经营)。

$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_replace

使用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);

答案 1 :(得分:2)

array_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/

答案 2 :(得分:1)

如果您已经有两个已排序的数组,则可以使用此算法从阵列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++;
    }
}

这只需要O( 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中为A中的每个值查找B中的每个值( n 2 < / SUP>)。

答案 3 :(得分:-1)

使用in_array

怎么样?

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

该函数接受一个数组的针。

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

或者你可以逐个循环你的停用词,找到所有的匹配