[原]使用结巴分词提供分词服务

    在之前的文章《关于“啊哦”这个图片分享的小站》有提到过,那里面实现了一个提取用户输入关键词的服务,用来作为分享的tag。

    之前没有这个功能的时候,tag必须要手动输入。我觉得这样没意思,不好玩。就在github上找到了结巴分词这样一个工具,原作者是用python实现的,现在也有许多其他版本的实现,比如java,C++。

    最开始我想选用C++版本的,因为这个版本提供了http服务,可以直接用PHP调用,但是后来读他的说明和联系作者,发现只提供了分词的服务,而没有提取关键词的服务。(虽然作者后来帮忙加上了提取关键词的http服务)。所以只能自己动手丰衣足食了。

    结巴分词的关键词提取功能相对简陋,不过感谢作者。提取关键词的时候会先分词,然后 使用 TF/IDF排序方式 来计算这些词的排名。最近有在考虑用完成以下结巴分词PHP版,先不论PHP性能对比其他的怎么样。至少自己能学到很多。

    最原始python实现的代码没有对外提供服务,所以对于这种我自己玩的小应用随便实现一个常驻进程提供服务就可以啦。应该是很容易的。于是我找到了能让python提供http服务的框架 tornado。只要几行代码,就可以成功启动服务,简直酷炫。    


 # encoding: utf-8
 import sys
 import tornado.ioloop
 import tornado.web
 sys.path.append('../jieba')   //这里引入你的jieba分词的目录
 import jieba
 import jieba.analyse
 import json
 
 class MainHandler(tornado.web.RequestHandler):
     def get(self):
         content = self.get_argument('content')
         n = int(self.get_argument('n',3))  //这里我设置 会返回三个关键词
         token = self.get_argument('token')
         if token != "2e545da7b9cdc1259aa4ad7852f13455":   //你可以加一个简单的token来防止其他人访问
                 self.write("Token Invalid")
                 return
         tags = jieba.analyse.extract_tags(content, topK=n)
         self.write(json.dumps(tags))
 
 application = tornado.web.Application([
     (r"/", MainHandler),
 ])
 
 if __name__ == "__main__":
     application.listen(9228) //监听的端口
     tornado.ioloop.IOLoop.instance().start()

 

启动上面的服务,就可以得到json格式的数据了。

同理,其实你也可以对外提供更多的服务,比如分词服务等。

这里还有个小插曲,我在阿里云的服务器最先买的是最低配乞丐版,剩余内存本来就二三十M,当启用服务的那一瞬间,我的ssh就掉了。。。简直一玩个草泥马奔腾而过。

只能去控制面板重启服务器。。乖乖的给阿里送了点钱,升级成1G内存。

关于词典的大小和所占用的内存,默认字典4-5M 启动后内存占用120M+ ,big字典 8-10M 启动后内存占用 280M 左右。。果断启用了小字典。

现在来看分词服务运转正常,啊哦也可以自己总结关键词,标记tag了。