PHP实现DFA算法,查找关键词

# 添加关键词 到全局字典dict里面
protected function addWord($strWord)
{
        $len = mb_strlen($strWord,'UTF-8');
        $curNode = &$this->dict;
        for ($index = 0; $index < $len; $index++) {
            $word = mb_substr($strWord, $index, 1, 'UTF-8');
            if (!isset($curNode[$word])) {
                $curNode[$word] = [];
            }
            $curNode =& $curNode[$word];
        }
        $curNode['end'] = 1;
}
# 根据字典dict搜索关键词

public function searchMatchWords($strWords)
{
        $len = mb_strlen($strWords, 'UTF-8');
        $result = [];
        for ($index = 0; $index < $len; $index++) {
            $wordLength = $this->searchWord($strWords, $index);
            if ($wordLength > 0) {
                $words = mb_substr($strWords, $index, $wordLength, 'UTF-8');
                if (!isset($result[$words])) {
                    $result[$words] = 1;
                } else {
                    $result[$words] = $result[$words]++;
                }
                $index += $wordLength - 1;
            }
        }
        return $result;
}

protected function searchWord($strWords, $beginIndex)
{
       $len = mb_strlen($strWords, 'UTF-8');
        $curNode = $this->dict;
        $isEnd = false;
        $wordLength = 0;
        for ($index = $beginIndex; $index < $len; $index++) {
            $word = mb_substr($strWords, $index, 1, 'UTF-8');
            if (!isset($curNode[$word])) {
                break;
            }
            $wordLength++;
            $curNode = $curNode[$word];
            if (isset($curNode['end'])) {
                $isEnd = true;
            }
        }
        if (!$isEnd) {
            $wordLength = 0;
        }
        return $wordLength;
}

参考文档

DFA算法匹配关键词 - 简书

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值