资讯专栏INFORMATION COLUMN

python实现在线分词

Simon_Zhou / 2172人阅读

摘要:写在前面最近在优化网站的搜索部分,网站是用实现的,主要业务是在线视频教育网站,之前搜索只是一段模型中的模糊匹配,所以只能搜索关键字,但是突然又想在网站做个类似于百度问答的功能。筛选出大于概率的词至此实现简单分词就写完了。

写在前面

最近在优化网站的搜索部分,网站是用Django实现的,主要业务是在线视频教育网站,之前搜索只是一段Django ORM模型中的icontains模糊匹配,所以只能搜索关键字,但是CEO(SB)突然又想在网站做个类似于百度问答的功能。但是搜索问题就成了一个棘手的事情,原有搜索不能满足需求,但是调研相关的elasticsearch之类的全文检索又有点重(除了有点重,主要是CEO不给时间啊!),所以就把精力放在了分词上,能短平快的实现该功能,而且比较轻。

因为关注的梁博,自然而然想到了他博士期间写的在线分词pullword(写这篇文章时他个人网站又挂掉了,哈哈哈,这里贴出了他的微博供大家膜拜),在此对梁博表示感谢!!

下面是我写的分词的utils,不过梁博的分词现在只能支持中文,输入英文跟数字会返回error,之前是想调用梁博的原有的pullword,他的API地址,但是我测了一下需要6-7秒,对于网站搜索功能显然没办法使用,后来又找到他挂在百度的免费API,测试了一下数据返回在0.1秒左右,还不错,就使用了百度api。

要注意,他原生的api中有个param1的参数,表示选词概率,param1=0.8表示只出概率在0.8以上的词,但是我调用传参的时候不好用,所以就通过返回的数据自己写了筛选。
get_pullword需要两个参数,第一个是一段需要分词的话,第二个是筛选分词后选词概率,[0,1]区间,等同于他的param1的参数。

# coding: utf-8
__author__ = "flyingpang"
import requests
import datetime


def get_pullword(s, probability):
    """
    :param s: 一段需要分词的中文.
    :param probability: 选词概率.
    :return: 按照概率从大到小排序返回一个list.
    """
    headers = {"apikey": "你自己的百度apikey"}
    url = "http://apis.baidu.com/apistore/pullword/words"
    params = {"source": s, "param1": "0", "param2": "1"}
    r = requests.get(url=url, headers=headers, params=params)

    if r.status_code != 200 or r.content.strip().split("
")[0].startswith("error"):
        result = list()
        result.append(s)
        return result
    else:
        data = r.content.strip().split("
")
        return split_word(data, probability)


def split_word(words, probability=0):
    """
    :param words: 分词结果的字典, 其中key为分词,value为概率.
    :param probability: 最小分词概率
    :return: 概率从大到小的分词列表.
    """
    # 分词跟相关概率保存到字典中.
    d = dict()

    for i in words:
        m = i.split(":")
        d[m[0].decode("utf-8")] = float(m[1])

    m = sorted(d.iteritems(), key=lambda k: k[1], reverse=True)
    words_list = []
    for i in range(len(m)):
        if m[i][1] >= probability:
            words_list.append(m[i][0])
    return words_list

if __name__ == "__main__":
    source = u"清华大学是好学校"
    t1 = datetime.datetime.now()
    test = get_pullword(source, 0.8)
    t2 = datetime.datetime.now()
    print "total time", t2 - t1
    print test

因为我后端使用Diango的icontains来匹配,所以返回一个list的话没办法匹配,所以这里给出一个Django处理的方法。

query = self.request.GET.get("q", None)
pull_words = get_pullword(query, 0.8)  # 筛选出大于0.8概率的词
query_list = reduce(operator.or_, (Q(title__icontains=item) for item in pull_words))
question_list = Question.objects.filter(query_list).order_by("-id")

至此python实现简单分词就写完了。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44290.html

相关文章

  • Python 提取《釜山行》人物关系

    摘要:项目代码下载地址基于共现提取釜山行人物关系更多经典项目全部项目 项目简介:本项目将带大家使用 Python 提取《釜山行》人物关系,对于给定的剧本文本,通过分析文本中人物的共现关系,提取整个文本表示的人物关系,并将人物关系可视化表示。本项目教程由Forec发布在实验楼。 一、项目介绍 1. 内容简介 《釜山行》是一部丧尸灾难片,其人物少、关系简单,非常适合我们学习文本处理。这个项目将介...

    hoohack 评论0 收藏0
  • python 实现中文分词统计

    摘要:利用我们集成的目前世界上规模最大的人工分词和词性标注中文语料库约含万字训练而成,模型标注能力强大。据说是最好的中文分词组件,支持等多种语言。 总是看到别人用Python搞各种统计,前端菜鸟的我也来尝试了一把。有各种语义分析库在,一切好像并不是很复杂。不过Python刚开始看,估计代码有点丑。 一、两种中文分词开发包 thulac (http://thulac.thunlp.org/)...

    Honwhy 评论0 收藏0
  • 分词,难在哪里?科普+解决方案!

    摘要:分词的算法中文分词有难度,不过也有成熟的解决方案。例如通过人民日报训练的分词系统,在网络玄幻小说上,分词的效果就不会好。三的优点是开源的,号称是中,最好的中文分词组件。 showImg(https://segmentfault.com/img/remote/1460000016359704?w=1350&h=900); 题图:by Lucas Davies 一、前言 分词,我想是大多数...

    Steven 评论0 收藏0
  • 一个JAVA码农的Node之旅

    摘要:的重连机制会尝试重连至其他伺服器并重新建立起对应关系。使用进行中文分词曹操在操场操美女对分词后的名词和动词转换为简体中文并查询命中则替换。返回替换后的字符串得到曹操在操场美女打包部署本身是单线程的虽然本身提供模块但需要修改代码。 本篇是一个Node新手做完实际项目后的心得总结。Node高手完全可以略过本文。 摘要 如果BOSS要求你在短期内快速实现一套聊天云服务平台, 你的第一反应是什...

    rollback 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<