PythonTip >> 博文 >> 基础与入门

Python中文分词与搜索

zihua 2013-10-10 16:10:28 点击: 1277 | 收藏


一直没时间写,先写个简单的中文搜索的例子吧。
中文分词我们可以用mmseg。安装的话:easy_install mmseg即可。
注意mmseg的分词函数是mmseg.seg_txt,它接受的utf8编码的string。
xapian也是接受unicode或者utf8.所以统一用utf8处理更方便。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# -*- coding: utf-8 -*-
from utils import *
#上面是我的封装的一些工具包
import xapian
import mmseg
 
def buildindex():
    #建立索引函数
    database = xapian.WritableDatabase('indexes/',xapian.DB_CREATE_OR_OVERWRITE)
    #这里用的是覆盖模式,便于测试,你们可以一般用DB_CREATE_OR_OPEN模式即可。
    ms = mysql()
    #这是对MySQLdb的简单封装
    sqlstr = '''select * from zufang.info limit 0,10'''
    #sql语句,取出10条
    for row in ms.query(sqlstr):
        #mysql的封装,就是从数据库里面取出数据转为字典的功能
        doc = xapian.Document()
        #建立文件对象
        title = row['Title']
        #获得mysql中信息的标题
        doc.set_data(title)
        #以标题为文件对象的data
        print title
        for term in mmseg.seg_txt(title.encode('utf8')):
            #中文分词,以每个词作为可索引的term
            print term
            doc.add_term(term)
        database.add_document(doc)
        #加入索引
    database.flush()
    #写入磁盘
def search(query_string):
    #查询函数
    database = xapian.Database('indexes/')
    #指定索引库
    qp = xapian.QueryParser()
    qp.set_database(database)
    query = qp.parse_query(query_string)
 
    #开启一个enquire session.
    enquire = xapian.Enquire(database)
    enquire.set_query(query)
 
    #偏移和数量设置,这里可以在翻页的时候用到,我们就从第三条开始取,取出2条信息即可
    offset = 2
    limit = 2
 
    matches = enquire.get_mset(offset, limit)
    for match in matches:
        print '==================='
        print 'rank=%s, documentID=%s' % (match.rank, match.docid)
        print '-------------------'
        print match.document.get_data()
    print '==================='
    print 'Number of documents matching query: %s' % matches.get_matches_estimated()
    print 'Number of documents returned: %s' % matches.size()
 
if __name__ == '__main__':
    buildindex()
    search('出租')

执行后打印的输出是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
[baigr@AY1108110917129 fenlei]$ python buildindex.py
北京青年公寓出租床位200元-300元/月
北京
青年公寓
出租
床位
200
300
地铁十号五号线换乘站 富仁名苑3室2厅2卫长期出租
地铁
十号
五号线
换乘
名苑
3
2
2
长期
出租
安贞桥东胜古家园精装地下室单间套间出租
安贞桥
东胜
家园
精装
地下室
单间
套间
出租
出租永定门百荣后身 西革新里 正规一居室
出租
永定门
后身
西
革新
正规
一居室
门头沟区军庄镇香峪村有整院出租
门头沟区
庄镇
出租
出租房屋  地铁五号线附近
出租房屋
地铁
五号线
附近
西三旗硅谷先锋小区半地下室出租,便宜可合租硅谷
西三旗
硅谷
先锋
小区
半地下室
出租
便宜
硅谷
大方居 精装2居  出租
大方
精装
2
出租
火星园丰和园新装两居室全新第一次出租
火星
丰和
新装
两居室
全新
第一次
出租
90平米整套转租
90
平米
整套
转租
===================
rank=2, documentID=3
-------------------
安贞桥东胜古家园精装地下室单间套间出租
===================
rank=3, documentID=9
-------------------
火星园丰和园新装两居室全新第一次出租
===================
Number of documents matching query: 8
Number of documents returned: 2

简单介绍到这,还有value的过滤用法,各种查询条件的整合等,后面再做介绍。



原文链接:http://pythoner.org/wiki/66/

作者:zihua | 分类: 基础与入门 | 标签: 基础与入门 | 阅读: 1277 | 发布于: 2013-10-10 16时 |