英文词组识别提取
想法来源于在做关键词提取时遇到的一个问题
英文分词时通常是通过空格进行分割,如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
)
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
评论已关闭