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

2010 七月 22
作者: 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返回两个字符串的相似度(百分比),测试后可知“计算机等级考试”更接近搜索词,所以把它排前面。

140个字符能干啥,能写个程序你信不信?

2010 六月 7
Tags:
作者: Luin

前几天在网上看到一个网站征集140字写成的小说,觉得挺有意思。获得第一名的Ron Gould(墙外)大牛写的小说着实“惊艳”(尽管我英语很烂,但为了显示我坚决备战四级的决心,还是决定把它译成中文):

“时间旅行成功了!”一张纸条上写着,“不过你只能回到过去并且不能再回来了。” 当我发觉这是我自己的笔迹时,不禁打了个寒颤。
“Time travel works!” the note read. “However you can only travel to the past and one-way.” I recognized my own handwriting and felt a chill.

其它作品访问:The Winners of the Twitter Writing Contest Are…

不过有没有想过用140个字符写一个程序?

“啊!这是不可能的!”在我看到某墙外网站的一篇文章前如果有人那样问我我一定会这样回答。
可惜,事实是:

第一个程序,但不是最好的:
MINI TWITTER(啊不,是迷你饭否!啊不,是迷你叽歪…啊!管它呢…) 136 chars

<form><input name=a><input type=submit></form>
<?if(strlen($_GET[a])<140)
{$h=fopen(a,“a”);fwrite($h,$_GET[a].<hr>);}
echo@readfile(a)?>

它可以实现微博最简单的功能:发表消息,显示消息以及做些必要验证。

第二个程序,已经开始出人意料了:
RSS/RDF parser with formatted output in 135 chars of PHP

<?php foreach(file($_GET[p])as$l)
if(preg_match(/<(title|link)>([^<]+)/,$l,$m))
echo$m[1]==link’?” <a>link</a><hr>:$m[2]?>

RSS解析器,怎么样?看看Demo:
http://test.neziric.org/140/feed-parser.php?u=http://feeds.delicious.com/v2/rss/?count=15

第三个程序:
JPG压缩器,可以对半压缩,不过它用了186个字符。

<?header(‘Content-type:);list($w,$h)=getimagesize($_GET[a]);
$b=imagecreatetruecolor($w/2,$h/2);
imagecopyresized($b,imagecreatefromjpeg($_GET[a]),0,0,0,0,$w/2,$h/2,$w,$h);imagejpeg($b)?>

最后一个,我最喜欢的:
A PHP web framework in 131 chars!!!!!

require __DIR__./c.php’;
if (!is_callable($c = @$_GET[‘c’] ?: function() { echo ‘Woah!; }))
  throw new Exception(‘Error’);
$c();

靠,它有一个默认控制器,访问不可用的控制器时会抛异常。不仅用了PHP5.3的新特性,而且效率相当高,这就是国外的PHP程序员(劝别真的在你的网站上用它…)。

P.S. 提到了国外,又想起了昨天的经历:三个寂寞男生(好吧,我不是很寂寞…)走在和谐的长安街上,迎面走来了一个可爱的武警叔叔,和蔼的盘问了我们好久,又问我们要了身份证登记。哦,明明都过去两天了!

淫淫状态二则,有亮点

2010 五月 27
作者: Luin

话说某天宿舍5人早上没起来,大鑫哥自己去上线代,回来后他发了条精彩的状态,亮点在倒数第二条回复:

回想到前不久一个人的状态:

这个亮点太明显了,不解释。

Pages 1 of 141234510...末页 »