一個(gè) Python 的輕量級搜索工具 -- Whose
??我的小冊 40章+教程:(小白零基礎(chǔ)用Python量化股票分析小冊) ,目前已經(jīng)300多人訂閱
來源丨網(wǎng)絡(luò)
本文將簡單介紹 Python 中的一個(gè)輕量級搜索工具 Whoosh,并給出相應(yīng)的使用示例代碼。
# Whoosh 簡介
Whoosh 由 Matt Chaput 創(chuàng)建,它一開始是一個(gè)為 Houdini 3D 動畫軟件包的在線文檔提供簡單、快速的搜索服務(wù)工具,之后便慢慢成為一個(gè)成熟的搜索解決工具并已開源。
Whoosh 純由 Python 編寫而成,是一個(gè)靈活的,方便的,輕量級的搜索引擎工具,現(xiàn)在同時(shí)支持 Python2、3,其優(yōu)點(diǎn)如下:
Whoosh 純由 Python 編寫而成,但很快,只需要 Python 環(huán)境即可,不需要編譯器;
默認(rèn)使用 Okapi BM25F 排序算法,也支持其他排序算法;
相比于其他搜索引擎,Whoosh 會創(chuàng)建更小的 index 文件;
Whoosh 中的 index 文件編碼必須是 unicode;
Whoosh 可以儲存任意的 Python 對象。
Whoosh 的官方介紹網(wǎng)站為:https://whoosh.readthedocs.io/en/latest/intro.html 。相比于 ElasticSearch 或者 Solr 等成熟的搜索引擎工具,Whoosh 顯得更輕便,操作更簡單,可以考慮在小型的搜索項(xiàng)目中使用。
# Index & query
對于熟悉 ES 的人來說,搜索的兩個(gè)重要的方面為 mapping 和 query,也就是索引的構(gòu)建以及查詢,背后是復(fù)雜的索引儲存、query 解析以及排序算法等。如果你有 ES 方面的經(jīng)驗(yàn),那么,對于 Whoosh 是十分容易上手的。
按照筆者的理解以及 Whoosh 的官方文檔,Whoosh 的入門使用主要是 index 以及 query。搜索引擎的強(qiáng)大功能之一在于它能夠提供全文檢索,這依賴于排序算法,比如 BM25,也依賴于我們怎樣儲存字段。因此,index 作為名詞時(shí),是指字段的索引,index 作為動詞時(shí),是指建立字段的索引。而 query 會將我們需要查詢的語句,通過排序算法,給出合理的搜索結(jié)果。
關(guān)于 Whoosh 的使用,在官文文檔中已經(jīng)給出了詳細(xì)的說明,筆者在這里只給出一個(gè)簡單的例子,來說明 Whoosh 如何能方便地提升我們的搜索體驗(yàn)。
# 示例代碼
數(shù)據(jù)
??本項(xiàng)目的示例數(shù)據(jù)為 poem.csv,下圖為該數(shù)據(jù)集的前十行:
字段
根據(jù)數(shù)據(jù)集的特征,我們創(chuàng)建四個(gè)字段(fields):title, dynasty, poet, content。創(chuàng)建的代碼如下:
# -*- coding: utf-8 -*-
import os
from whoosh.index import create_in
from whoosh.fields import *
from jieba.analyse import ChineseAnalyzer
import json
# 創(chuàng)建schema, stored為True表示能夠被檢索
schema = Schema(title=TEXT(stored=True, analyzer=ChineseAnalyzer()),
dynasty=ID(stored=True),
poet=ID(stored=True),
content=TEXT(stored=True, analyzer=ChineseAnalyzer())
)
其中,ID 只能為一個(gè)單元值,不能分割為若干個(gè)詞,常用于文件路徑、URL、日期、分類;
TEXT 文件的文本內(nèi)容,建立文本的索引并存儲,支持詞匯搜索;Analyzer 選擇結(jié)巴中文分詞器。
創(chuàng)建索引文件
??接著,我們需要創(chuàng)建索引文件。我們利用程序先解析 poem.csv 文件,并將它轉(zhuǎn)化為 index,寫入到 indexdir 目錄下。Python 代碼如下:
# 解析poem.csv文件
with open('poem.csv', 'r', encoding='utf-8') as f:
texts = [_.strip().split(',') for _ in f.readlines() if len(_.strip().split(',')) == 4]
# 存儲schema信息至indexdir目錄
indexdir = 'indexdir/'
if not os.path.exists(indexdir):
os.mkdir(indexdir)
ix = create_in(indexdir, schema)
# 按照schema定義信息,增加需要建立索引的文檔
writer = ix.writer()
for i in range(1, len(texts)):
title, dynasty, poet, content = texts[i]
writer.add_document(title=title, dynasty=dynasty, poet=poet, content=content)
writer.commit()
index 創(chuàng)建成功后,會生成 indexdir 目錄,里面含有上述 poem.csv 數(shù)據(jù)的各個(gè)字段的索引文件。
查詢
index 創(chuàng)建成功后,我們就利用進(jìn)行查詢。
比如我們想要查詢 content 中含有明月的詩句,可以輸入以下代碼:
# 創(chuàng)建一個(gè)檢索器
searcher = ix.searcher()
# 檢索content中出現(xiàn)'明月'的文檔
results = searcher.find("content", "明月")
print('一共發(fā)現(xiàn)%d份文檔。' % len(results))
for i in range(min(10, len(results))):
print(json.dumps(results[i].fields(), ensure_ascii=False))
輸出結(jié)果如下:
一共發(fā)現(xiàn)44份文檔。
前10份文檔如下:
{"content": "床前明月光,疑是地上霜。舉頭望明月,低頭思故鄉(xiāng)。", "dynasty": "唐代", "poet": "李白 ", "title": "靜夜思"}
{"content": "邊草,邊草,邊草盡來兵老。山南山北雪晴,千里萬里月明。明月,明月,胡笳一聲愁絕。", "dynasty": "唐代", "poet": "戴叔倫 ", "title": "調(diào)笑令·邊草"}
{"content": "獨(dú)坐幽篁里,彈琴復(fù)長嘯。深林人不知,明月來相照。", "dynasty": "唐代", "poet": "王維 ", "title": "竹里館"}
{"content": "漢江明月照歸人,萬里秋風(fēng)一葉身。休把客衣輕浣濯,此中猶有帝京塵。", "dynasty": "明代", "poet": "邊貢 ", "title": "重贈吳國賓"}
{"content": "秦時(shí)明月漢時(shí)關(guān),萬里長征人未還。但使龍城飛將在,不教胡馬度陰山。", "dynasty": "唐代", "poet": "王昌齡 ", "title": "出塞二首·其一"}
{"content": "京口瓜洲一水間,鐘山只隔數(shù)重山。春風(fēng)又綠江南岸,明月何時(shí)照我還?", "dynasty": "宋代", "poet": "王安石 ", "title": "泊船瓜洲"}
{"content": "四顧山光接水光,憑欄十里芰荷香。清風(fēng)明月無人管,并作南樓一味涼。", "dynasty": "宋代", "poet": "黃庭堅(jiān) ", "title": "鄂州南樓書事"}
{"content": "青山隱隱水迢迢,秋盡江南草未凋。二十四橋明月夜,玉人何處教吹簫?", "dynasty": "唐代", "poet": "杜牧 ", "title": "寄揚(yáng)州韓綽判官"}
{"content": "露氣寒光集,微陽下楚丘。猿啼洞庭樹,人在木蘭舟。廣澤生明月,蒼山夾亂流。云中君不見,竟夕自悲秋。", "dynasty": "唐代", "poet": "馬戴 ", "title": "楚江懷古三首·其一"}
{"content": "海上生明月,天涯共此時(shí)。情人怨遙夜,竟夕起相思。滅燭憐光滿,披衣覺露滋。不堪盈手贈,
最后推薦一下我們團(tuán)隊(duì)寫的量化小冊的內(nèi)容,45篇內(nèi)容!從Python安裝,入門,數(shù)據(jù)分析,爬取股票基金的歷史+實(shí)時(shí)數(shù)據(jù),以及如何寫一個(gè)簡單量化策略,策略回測,如何看資金曲線統(tǒng)統(tǒng)都有介紹!非常超值!
歡迎訂閱:原價(jià)199 早鳥價(jià)2杯咖啡錢,即可永久閱讀。滿400人又要漲價(jià)了,現(xiàn)在的價(jià)格非常非常低,只要2杯奶茶,就可以終身訂閱+課程源碼,還有永久陪伴群。48小時(shí)無理由退款,放心食用!
推薦閱讀:
量化: 如何用Python爬取創(chuàng)業(yè)板歷史+實(shí)時(shí)股票數(shù)據(jù)!|實(shí)戰(zhàn)股票分析篇利用Pandas 9招挖掘五糧液股價(jià)!|實(shí)戰(zhàn)股票數(shù)據(jù)分析篇 Pandas滾動操作 |量化股票第一步,用Python畫股票K線,雙均線圖,可視化你的股票數(shù)據(jù)!|如何用Python爬取全部800多只ETF基金數(shù)據(jù)!|如何用Python寫一個(gè)雙均線策略 |如何用Python開發(fā)一個(gè)多策略機(jī)器人!上篇!|Python量化系列-用布林策略買五糧液能賺多少錢?|只要4秒鐘!用Python 獲取上證指數(shù)34年的歷史日線數(shù)據(jù)!
入門: 最全的零基礎(chǔ)學(xué)Python的問題 | 零基礎(chǔ)學(xué)了8個(gè)月的Python | 實(shí)戰(zhàn)項(xiàng)目 |學(xué)Python就是這條捷徑
干貨:爬取豆瓣短評,電影《后來的我們》 | 38年NBA最佳球員分析 | 從萬眾期待到口碑撲街!唐探3令人失望 | 笑看新倚天屠龍記 | 燈謎答題王 |用Python做個(gè)海量小姐姐素描圖 |碟中諜這么火,我用機(jī)器學(xué)習(xí)做個(gè)迷你推薦系統(tǒng)電影
趣味:彈球游戲 | 九宮格 | 漂亮的花 | 兩百行Python《天天酷跑》游戲!
AI: 會做詩的機(jī)器人 | 給圖片上色 | 預(yù)測收入 | 碟中諜這么火,我用機(jī)器學(xué)習(xí)做個(gè)迷你推薦系統(tǒng)電影
小工具: Pdf轉(zhuǎn)Word,輕松搞定表格和水?。?/a> | 一鍵把html網(wǎng)頁保存為pdf!| 再見PDF提取收費(fèi)! | 用90行代碼打造最強(qiáng)PDF轉(zhuǎn)換器,word、PPT、excel、markdown、html一鍵轉(zhuǎn)換 | 制作一款釘釘?shù)蛢r(jià)機(jī)票提示器! |60行代碼做了一個(gè)語音壁紙切換器天天看小姐姐!|
