想法来源于在做关键词提取时遇到的一个问题
英文分词时通常是通过空格进行分割,如Hello World会被拆分hello和world,但实际上我需要提取hello world 整个词
google时找到一个RAKE算法,是针对关键词提取算法的,网上评论还是不错,但由于这边实际情况存在中英混合和大量的专业词汇,而且大多数情况下并不是一个句子,所以效果不是那么好,如果是全英文文档应该会好得多,所以先用中文分词,然后再提取英文单词作组合,重新组合成词组。
传入英文单词词组,这个类会自动根据上下词尝试组合所有的词组并且将其合并

<?php

class EnglishPhraseExtract
{

    private $dict = []; //简单定义一个词典数组
    private $result = []; //结果集

    // 是否为词表中的词
    private function  inDict($str)
    {
        $flag = false;
        for ($i = 0; $i < count($this->dict); $i++) {
            if (strtolower($str) == strtolower($this->dict[$i])) {
                $flag = true;
                break;
            }
        }
        return $flag;
    }

    public function loadDict(array $array)
    {
        $this->dict = $array;
    }

    public function extract(array $keywrods)
    {
        $this->result = []; //重置结果集
        $sentenceLength = count($keywrods); //计算句子长度
        $matchWordLength = 5;
        for ($i = 0; $i < $sentenceLength;) {
            //计算截取数组的长度
            if ($sentenceLength - $i < $matchWordLength) {
                $matchWordLength = $sentenceLength - $i;
            }
            //计算截取数组的偏移量
            $dealstrbegin = $sentenceLength - $i - $matchWordLength;
            $dealstrlen =  $matchWordLength;
            // 截取的要数组
            $dealArr = array_slice($keywrods, $dealstrbegin, $dealstrlen);
            for ($j = 0; $j < $matchWordLength; $j++) {
                $fl = $matchWordLength - $j;
                $tmp = array_slice($dealArr, $j, $fl);
                $tmpStr = implode(" ", $tmp);
                if ($this->inDict($tmpStr) || $j == $matchWordLength - 1) {
                    $this->result[] = $tmpStr;
                    $i = $i + $fl; //修改偏移量
                    break;
                }
            }
        }
        krsort($this->result);
    }

    public function getResult()
    {
        return $this->result;
    }
}

使用

$keywords = ['Say', 'Hello', 'World', 'With', 'Python', 'HackerRank'];
$class = new EnglishPhraseExtract();
$class->loadDict(['hello world']);
$class->extract($keywords);
print_r($class->getResult());

效果

Array
(
    [4] => Say
    [3] => Hello World
    [2] => With
    [1] => Python
    [0] => HackerRank
)