结巴分词

Postgres2015全国用户大会将于11月20至21日在北京丽亭华苑酒店召开。本次大会嘉宾阵容强大,国内顶级PostgreSQL数据库专家将悉数到场,并特邀欧洲、俄罗斯、日本、美国等国家和地区的数据库方面专家助阵:

  • Postgres-XC项目的发起人铃木市一(SUZUKI Koichi)
  • Postgres-XL的项目发起人Mason Sharp
  • pgpool的作者石井达夫(Tatsuo Ishii)
  • PG-Strom的作者海外浩平(Kaigai Kohei)
  • Greenplum研发总监姚延栋
  • 周正中(德哥), PostgreSQL中国用户会创始人之一
  • 汪洋,平安科技数据库技术部经理
  • ……
 
2015年度PG大象会报名地址:http://postgres2015.eventdove.com/PostgreSQL中国社区: http://postgres.cn/PostgreSQL专业1群: 3336901(已满)PostgreSQL专业2群: 100910388PostgreSQL专业3群: 150657323



结合PostgreSQL plpython和language transform可以很方便的实现中文分词。
https://github.com/fxsjy/jieba

http://www.postgresql.org/docs/9.5/static/sql-createtransform.html
http://www.postgresql.org/docs/9.5/static/plpython.html

例子 : 
postgres=# create language plpythonu;
CREATE LANGUAGE
postgres=# select * from pg_language ;
  lanname  | lanowner | lanispl | lanpltrusted | lanplcallfoid | laninline | lanvalidator | lanacl 
-----------+----------+---------+--------------+---------------+-----------+--------------+--------
 internal  |       10 | f       | f            |             0 |         0 |         2246 | 
 c         |       10 | f       | f            |             0 |         0 |         2247 | 
 sql       |       10 | f       | t            |             0 |         0 |         2248 | 
 plpgsql   |       10 | t       | t            |         12724 |     12725 |        12726 | 
 plpythonu |       10 | t       | f            |         24177 |     24178 |        24179 | 
(5 rows)
postgres=# create or replace function fenci(i_text text) returns tsvector as $$
import jieba
seg_list = jieba.cut(i_text, cut_all=False)
return(" ".join(seg_list))
$$ language plpythonu;
CREATE FUNCTION
postgres=# select fenci('小明硕士毕业于中国科学院计算所,后在日本京都大学深造');
                                        fenci                                         
--------------------------------------------------------------------------------------
 '中国科学院' '于' '后' '在' '小明' '日本京都大学' '毕业' '深造' '硕士' '计算所' ','
(1 row)
postgres=# select fenci('结婚的和尚未结婚的');
          fenci          
-------------------------
 '和' '尚未' '的' '结婚'
(1 row)
postgres=# \timing
Timing is on.
postgres=# do language plpgsql $$ declare begin for i in 1..100000  loop perform fenci('结婚的和尚未结婚的'); end loop; end $$;
DO
Time: 9848.447 ms
postgres=# select 9848.0/100000;
        ?column?        
------------------------
 0.09848000000000000000
(1 row)
Time: 1.972 ms
虚拟机,单核,每秒约处理一万次请求。

缺点是动态加载,第一次使用时需要1秒左右。每个新建的连接都需要动态加载它。对于短连接的用户如果每次都要使用这个函数是会崩溃的。
postgres=# \timing
Timing is on.
postgres=# select fenci('周正中');
    fenci    
-------------
 '周' '正中'
(1 row)
Time: 1585.619 ms
postgres=# select fenci('周正中');
    fenci    
-------------
 '周' '正中'
(1 row)
Time: 1.008 ms

支持动态添加WORD,重新连接后,需要重新添加。
postgres=# select fenci('阿里巴巴阿里妈妈');
          fenci           
--------------------------
 '妈妈' '阿里' '阿里巴巴'
(1 row)
postgres=# do language plpythonu $$
import jieba
jieba.add_word('阿里妈妈')
$$;
DO
postgres=# select fenci('阿里巴巴阿里妈妈');
         fenci         
-----------------------
 '阿里妈妈' '阿里巴巴'
(1 row)

postgres=# \q
postgres@digoal-> psql
psql (9.4.4)
Type "help" for help.
postgres=# select fenci('阿里巴巴阿里妈妈');
          fenci           
--------------------------
 '妈妈' '阿里' '阿里巴巴'
(1 row)

discard all不影响已经载入的字典,可以放心在连接池使用。
postgres=# discard all;
DISCARD ALL
postgres=# select fenci1('阿里巴巴,阿里妈妈');
             fenci1             
--------------------------------
 阿里 巴巴 阿里巴巴 , 阿里 妈妈
(1 row)
Time: 1.237 ms

相比PostgreSQL 提供的full text search功能,这种用法比较入门。
这种用法建议在应用端实施。

你可能感兴趣的:(转载,数据库应用开发)