关键词检测是如今几乎全部网站系统都必需要有的东西。往复杂了作会牵扯到NLP之类的“高级技术”,这个就不在本篇里瞎扯了。这里教你们一个简单的算法:DFA。php
DFA:Deterministic Finite Automaton,也就是肯定有穷自动机。其特征为:有一个有限状态集合和一些从一个状态通向另外一个状态的边,每条边上标记有一个符号,其中一个状态是初态,某些状态是终态。git
这个描述有点难懂,我用一段白话来讲明一下:你有一个集合,集合内的每个元素都标明了本身的状态,经过你已知的某些事件,你能够从当前元素的状态获得下一个状态,从而知道下一个元素是啥,即event + state = next state。并且毕竟集合是有限的,必定能从一个节点找到最终的节点。github
上图比较清楚的展现了这种集合间元素的关系,状态S经过事件a能够找到U,能够经过事件b找到V。那么怎么把这个有穷自动机用到关键词检测里呢,下面举个例子。算法
如今有几个关键词:妙蛙种子,妙蛙草,妙蛙花,皮卡丘,皮丘。咱们如今对这些关键词进行一些操做,构造出一个有穷自动机出来。bash
若是咱们将这些词整理成这样一个树状结构,咱们就能够根据第一个字,去对他所属的树去进行检索,这将大大提升搜索的效率。学习
以妙蛙花为例:网站
下面给出这个自动机的HashSet实例:ui
妙 = {
isEnd = 0
蛙 = {
isEnd = 0
种 = {
isEnd = 0
子 = {
isEnd = 1
}
}
草 = {
isEnd = 1
}
花 = {
isEnd = 1
}
}
}
皮 = {
isEnd = 0
卡 = {
isEnd = 0
丘 = {
isEnd = 1
}
}
丘 = {
isEnd = 1
}
}
复制代码
class DFA
{
private $tree = [];
public function build($strWord)
{
$len = mb_strlen($strWord, 'UTF-8');
$tree = &$this->tree;
for ($i = 0; $i < $len; $i++) {
$word = mb_substr($strWord, $i, 1, 'UTF-8');
if (isset($tree[$word])) {
if ($i == ($len - 1)) {
$tree[$word]['end'] = 1;
}
} else {
if ($i == ($len - 1)) {
$tree[$word] = [];
$tree[$word]['end'] = 1;
} else {
$tree[$word] = [];
$tree[$word]['end'] = 0;
}
}
$tree = &$tree[$word];
}
}
public function search($strWord)
{
$len = mb_strlen($strWord, 'UTF-8');
$arrHashMap = $this->tree;
for ($i = 0; $i < $len; $i++) {
$word = mb_substr($strWord, $i, 1, 'UTF-8');
if (!isset($arrHashMap[$word])) {
$arrHashMap = $this->tree;
continue;
}
if ($arrHashMap[$word]['end']) {
return true;
}
$arrHashMap = $arrHashMap[$word];
}
return false;
}
}
$obj = new DFA();
$obj->build('妙蛙种子');
$obj->build('妙蛙草');
$obj->build('皮卡丘');
$obj->build('皮丘');
var_dump($obj->search('迷唇姐'));
var_dump($obj->search('妙蛙种子'));
复制代码
以上就是使用DFA进行关键词检测的一个简单应用,在一些简单的应用场景里面仍是挺实用的。固然,真正的关键词检测还须要用到深度学习和天然语言分析等相关技术,这些等之后有机会了再研究吧。this
附上仓库spa