Python 的 ctypes 模块实在太方便了!

Posted by Elias on 三 24, 2010 in 混乱的IT世界 |

最近用到中文分词库 Bamboo ,开始时有点头疼居然没有 Python 封装。。后来发现用 ctypes 模块来封装实在是太简单、太方便了~几乎被感动到内流满面~有了庞大 C 库和 ctypes 模块的 Python ,真是可比当年的数理化——走遍天下都不怕~下面给出通过 ctypes 模块调用 Bamboo 分词的示例代码:

?Download seg.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
from ctypes import *
 
# 通过 C 接口载入 libbamboo ,“.dylib”是 Mac OSX 下的动态库后缀, Linux 下应该是“libbamboo.so”:
libbamboo = CDLL('libbamboo.dylib')
# 调用 bamboo_init() 函数得到一个分词器实例:
bamboo_init = libbamboo.bamboo_init
bamboo_init.restype = c_void_p
bamboo_handler = bamboo_init(c_char_p('crf_seg'), None)
# 如果返回的实例是 None (也即 C 中的 Null ),表示实例生成失败,那我们打印出错原因:
if bamboo_handler is None:
    bamboo_strerror = libbamboo.bamboo_strerror
    bamboo_strerror.restype = c_char_p
    print bamboo_strerror()
else:
    # 把文本传给分词器准备分词:
    # 待分词的文本必须是 utf-8 编码的 bytes string ,所以我们要把 unicode string encode 一下:
    libbamboo.bamboo_setopt(bamboo_handler, c_long(0), c_char_p(u'我爱北京天安门'.encode('utf-8')))
    # 真正开始分词:
    bamboo_parse = libbamboo.bamboo_parse
    bamboo_parse.restype = c_char_p
    # 下一行得到分词结果(空格分隔),格式还是 utf-8 编码的 bytes string ,我们把它 decode 成 unicode :
    segged = bamboo_parse(bamboo_handler).decode('utf-8')
    print type(segged), len(segged), segged
# 调用 bamboo_clean() 函数释放分词器实例:
libbamboo.bamboo_clean(bamboo_handler)

感谢国家,感谢什么什么TV,另外感谢沈仙人,当年正是他的博文用 Python 写自己的 C Module让 ctypes 在我脑海里留下了不可磨灭的印象^_^

相关日志

标签:,



3 Comments

billjeff
六 4, 2010 at 下午 10:45

不错,比用Python原生接口手动封装和SWIG封装要来的简单


 
zhaiduo
八 11, 2010 at 下午 2:37

呵呵,长见识啊


 

[...] 对于中文分词,简单的中文分词Solr(lucene)本来就支持的,另外中文分词库Bamboo,libmmseg(基于复合最大匹配算法的中文分词法 libmmseg用于sphinx)。 [...]


 

评论

Elias的邪异门 is proudly powered by WordPress.(京ICP备10013669号 瑞豪开源提供VPS)Theme design by Laptop Geek.
Copyright © 2018 All rights reserved. Entries (RSS) and Comments (RSS).