这是网上已有的分词函数,先转过来了解了解。
基础的分字程序
下面是 Carrie (感谢 Carrie!:D )写的一个基础的分字程序,在很大程度上可以满足相当多应用的需要:
--
-- a basic Chinese word segment function
-- author: Carrie
--
create or replace function CarrieCharSeg( input text ) returns text as $$
declare
retVal text;
i int;
j int;
begin
i:= char_length(input);
j:= 0;
retVal:= '';
LOOP
retVal:= retVal || substring(input from j for 1) || ' ';
j:= j+1;
EXIT WHEN j=i+1;
END LOOP;
return retVal;
end;
$$language plpgsql;
下面是一个重载的分词程序,区分了单词和汉字,对单词单独进行分词:
--
-- a basic Chinese word segment function
-- author: Carrie
--
create or replace function CarrieCharSeg(input text,int) returns text as $Q$
declare
query text:= '';
retVal text:= '';
thisVal text:= '';
lastVal text:= '';
i integer:= 0;
j integer:= 0;
begin
query:= lower(regexp_replace(input,'[[:punct:]]',' ','g'));
--raise notice '123: %',query;
i:= char_length(query);
LOOP
thisVal:= substring(query from j for 1);
IF ((thisVal <> ' ')AND(thisVal <> ' ')) THEN
IF (((lastVal >= 'a') AND (lastVal <= 'z'))
OR((lastVal >= 'A')AND(lastVal <= 'Z'))) AND
(((thisVal >= 'a') AND (thisVal <= 'z')) OR
((thisVal >= 'A')AND(thisVal <= 'Z'))) THEN
retVal:= retVal || thisVal;
ELSE
retVal:= retVal || ' ' || thisVal;
END IF;
END IF;
lastVal:= thisVal;
j:= j+1;
EXIT WHEN j > i;
END LOOP;
RETURN trim(retVal);
end
$Q$language plpgsql;
使用感受:
最近用过了这两个自定义的分词函数,简单的说就是将汉字分割开来,例如:
“我来自地球",通过上面的分词函数后就变成“我 来 自 地 球”,会在每个字之间加入空格,这种方式比较适合标题式的检索,因为标题本身的内容不多,这样输入一个字,也是能查找出来相关的标题信息的。
如果应用的场景需要很精确的查询,那么可以使用这种方式,在调用之前做一次转换。