摘要:寫在前面最近在優化網站的搜索部分,網站是用實現的,主要業務是在線視頻教育網站,之前搜索只是一段模型中的模糊匹配,所以只能搜索關鍵字,但是突然又想在網站做個類似于百度問答的功能。篩選出大于概率的詞至此實現簡單分詞就寫完了。
寫在前面
最近在優化網站的搜索部分,網站是用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實現簡單分詞就寫完了。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/44290.html
摘要:項目代碼下載地址基于共現提取釜山行人物關系更多經典項目全部項目 項目簡介:本項目將帶大家使用 Python 提取《釜山行》人物關系,對于給定的劇本文本,通過分析文本中人物的共現關系,提取整個文本表示的人物關系,并將人物關系可視化表示。本項目教程由Forec發布在實驗樓。 一、項目介紹 1. 內容簡介 《釜山行》是一部喪尸災難片,其人物少、關系簡單,非常適合我們學習文本處理。這個項目將介...
摘要:利用我們集成的目前世界上規模最大的人工分詞和詞性標注中文語料庫約含萬字訓練而成,模型標注能力強大。據說是最好的中文分詞組件,支持等多種語言。 總是看到別人用Python搞各種統計,前端菜鳥的我也來嘗試了一把。有各種語義分析庫在,一切好像并不是很復雜。不過Python剛開始看,估計代碼有點丑。 一、兩種中文分詞開發包 thulac (http://thulac.thunlp.org/)...
摘要:分詞的算法中文分詞有難度,不過也有成熟的解決方案。例如通過人民日報訓練的分詞系統,在網絡玄幻小說上,分詞的效果就不會好。三的優點是開源的,號稱是中,最好的中文分詞組件。 showImg(https://segmentfault.com/img/remote/1460000016359704?w=1350&h=900); 題圖:by Lucas Davies 一、前言 分詞,我想是大多數...
摘要:的重連機制會嘗試重連至其他伺服器并重新建立起對應關系。使用進行中文分詞曹操在操場操美女對分詞后的名詞和動詞轉換為簡體中文并查詢命中則替換。返回替換后的字符串得到曹操在操場美女打包部署本身是單線程的雖然本身提供模塊但需要修改代碼。 本篇是一個Node新手做完實際項目后的心得總結。Node高手完全可以略過本文。 摘要 如果BOSS要求你在短期內快速實現一套聊天云服務平臺, 你的第一反應是什...
閱讀 2511·2021-11-18 10:02
閱讀 1976·2021-11-09 09:45
閱讀 2401·2021-09-26 09:47
閱讀 1010·2021-07-23 10:26
閱讀 1063·2019-08-30 15:47
閱讀 3356·2019-08-30 15:44
閱讀 957·2019-08-30 15:43
閱讀 881·2019-08-29 13:50