5

我正在使用我的代码中的停用词我有一个充满了我想检查的单词的数组,以及我想要检查的一组单词。

目前,我一次遍历一个数组,如果它的 in_array 与停用词列表相比,则删除该词,但我想知道是否有更好的方法,我已经查看了 array_diff 等但是如果我在第一个数组中有多个停用词,array_diff 似乎只删除了第一个出现。

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

编辑 -

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

谢谢

4

4 回答 4

8

使用 str_replace...

一种简单的方法是使用str_replacestr_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_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);
于 2010-05-02T08:57:19.267 回答
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/

于 2013-10-25T21:42:16.610 回答
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 ) ,因为它避免在 B 中为每个 O( n2 ) 的值查找 B 中的每个值。

于 2010-05-02T09:22:06.147 回答
-1

使用 in_array 怎么样

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

该函数接受一个指针,它是一个数组。

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

或者,您可以逐个遍历停用词,并找到所有匹配项

于 2010-05-02T09:17:06.070 回答