首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何检查关键字集是否存在于句子中?

如何检查关键字集是否存在于句子中?
EN

Stack Overflow用户
提问于 2015-02-16 01:26:43
回答 2查看 123关注 0票数 0

我试着检查关键字是否存在于某个句子中。如果关键字仅为一个,则很容易确定是否匹配。但是,如果给出了大关键字集,则需要花费太多时间才能找到答案。所以我搜索了Aho-Corasick算法,这个算法需要线性时间才能找到。但是算法没有帮助。因为它比使用strpos函数花费更多的时间。我认为关键字集太大了。

这是使用navite php函数。

代码语言:javascript
复制
$sentence = "The big brown fox jumps over the lazy dog";
$keywords = array(...); // $keywords count is about 1,000,000
$keywordsCount = count($keywords);
$isMatched = false;
for ($i = 0; $i < $keywordsCount; $i++) {
    if (strpos($sentence, $keywords[$i])) {
        $isMatched = true;
    }
}

这是使用aho-corasick算法。(https://github.com/MartyIX/AhoCorasickPHP/)

代码语言:javascript
复制
$sentence = "The big brown fox jumps over the lazy dog";
$keywords = array(...); // $keywords count is about 1,000,000
$keywordsCount = count($keywords);
$isMatched = false;

$ac = new AhoCorasick();
$tree = $ac->buildTree($keywords);
$result = $ac->FindAll($sentence);
var_dump($result);

使用aho-corasick算法的比使用strpos php函数慢3倍.如何更快、更有效地检查上下文中匹配的关键字?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-16 01:31:24

从所有的帐户,包括正式的PHP手册来看,strpos()是到目前为止找到另一个字符串最快的方法。

直接从手册:

如果您只想确定某个针是否发生在干草堆中,请使用更快、内存较少的函数strpos()。

它比pregmatch()快得多,后者在内存方面已经非常高效,甚至比strstr()还要快。

我的观点是,我非常怀疑,通过任何方法,您都会比本地strpos()更快地找到一个函数或创建一个算法。

票数 2
EN

Stack Overflow用户

发布于 2015-02-16 01:55:07

假设$keywords是一个简单的数组..。

代码语言:javascript
复制
$sentence = "The big brown fox jumps over the lazy dog";
$words = explode(' ', strtolower($sentence));

$keywords = array(...); // $keywords count is about 1,000,000
$keywords_map = array_flip($keywords); // assuming all keywords are already lowercase

$isMatched = false;

foreach ($words as $word) {
    if (array_key_exists($word, $keywords_map)) {
        $isMatched = true;
        break;
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28533294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档