有关中文分词技术和搜索结果按相似度排序

2010 七月 22
by Luin

做小网站的站内搜索时要考虑到用户的查询关键字未必和数据库中相应数据准确对应,所以搜索时就要用到模糊查询。但是很多情况下Like语句也未必管用,比如用户搜索“打篮球”,可是数据库里只有“篮球”,这时做查询“LIKE ‘%打篮球%’”肯定不会找到结果。这时就需要对关键字进行分词。对于英文来说可以简单的根据空格来划分单词,而对于中文就有些麻烦。

好在现在有些开源的中文分词引擎分词的准确度已经相当高了,如PHP的SCWS可以把“打篮球”分成“打”和“篮球”,这样再分别查找就可以把“篮球”条目找到。然后由于SCWS是基于词频词典的,所以如果有些新词就分不出来了,比如“我爱美女”可以分解成“我爱”和“美女”,可是“我爱凤姐”就只能分成“我爱”“凤”和“姐”了。

在无法根据词库分词的情况下,我们可以采用二元分词法,即全部分成两个字组成的词,如“我爱凤姐”分成“我爱”“爱凤”“凤姐”。代码也很简单:

function Fenci($word)
{
	$len = mb_strlen($word, 'GBK');
	for($i = 0; $i < $len - 1; ++$i)
		$result[] = mb_substr($word, $i, 2, 'GBK');
	return $result;
}

然而由于词语的错分也产生了一些无关的结果,如搜索“全国计算机等级考试”,SCWS会把它分成“全国”“计算机”“等级”“考试”,而数据库里有“计算机等级考试”和“大学英语水平考试”,这时这两条结果全部命中,可是后者显然不是我们想要的结果,这就需要多结果进行相似的排序。
PHP提供了一个函数可以轻易实现这个功能。它的名字就是…similar_text,如similar_text(‘全国计算机等级考试’, ‘大学英语水平考试’, $percent), $percent返回两个字符串的相似度(百分比),测试后可知“计算机等级考试”更接近搜索词,所以把它排前面。

随机日志

4 Responses leave one →

Leave a Reply

Note: You can use basic XHTML in your comments. Your email address will never be published.

Subscribe to this comment feed via RSS