我在我的代码中玩停用词我有一个充满我想要检查的单词的数组,以及一个我想要检查的单词数组。
目前,我一次一个地遍历数组,如果它的 in_array 与停用词列表比较,我会删除这个词,但我想知道是否有更好的方法,我查看了 array_diff 等但是,如果我在第一个数组中有多个停用词,array_diff 似乎只会删除第一个出现的词。
重点是速度和内存使用,但速度更重要。
编辑-
第一个数组是单数词,基于博客评论(这些通常很长)第二个数组是停用词的单数词。抱歉没说清楚
谢谢
最佳答案
使用 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_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);
关于PHP 停用词表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2752896/