實踐篇(五) KBQA Demo

2021-08-15 03:09:04 字數 1961 閱讀 4151

作為實踐篇的最後一篇,我們將介紹如何用python完成乙個簡易的問答程式。下圖是demo的展示效果:

查詢結果為空,回答「i don』t know.」;不能理解問句,回答「i can』t understand.」。本實現參考了王昊奮老師發布在openkg上的demo「基於refo的kbqa實現及示例」,讀者也可以參考此示例,來完成本demo。下面談談本demo的流程。

此demo是利用正規表示式來做語**析。我們需要第三方庫來完成初步的自然語言處理(分詞、實體識別),然後利用支援詞級別正則匹配的庫來完成後續的語義匹配。

分詞和實體識別(人名和電影名)我們用jieba來完成。jieba是乙個輕量級的中文分詞工具,有多種語言的實現版本。對於分詞,在實驗環境中,jieba還是勉強能用。在我們這個demo當中,有些經常會被使用的詞語並不能被正確切分。比如:「喜劇電影」、「恐怖電影」、「科幻電影」、「喜劇演員」、「出生日期」等,在分詞的時候,jieba把它們當作乙個詞來處理,我們需要手動調整詞語的頻率使得「喜劇電影」能被切分為「喜劇」和「電影」。至於實體識別,jieba對於人名的識別精度尚可接受,但是電影名稱的識別精度太低以至於完全不可用。因此,我們直接把資料庫中的人名和電影名匯出,作為外部詞典;使用jieba的時候載入外部詞典,這樣就能解決實體識別的問題。

將自然語言轉為以詞為基礎的基本單位後,我們使用refo(regular expressions for objects)來完成語義匹配。具體實現請參考openkg的demo或者本demo的**。

匹配成功後,得到其對應的我們預先編寫的sparql模板,再向fuseki伺服器傳送查詢,最後將結果列印出來。

**已放到github中,本專案的目錄結構如下:

kg_demo_movie/

crawler/

movie_crawler.py

__init__.py

tradition2******/

langconv.py

traditional2******.py

zh_wiki.py

__init__.py

kb_query/

jena_sparql_endpoint.py

query_main.py

question2sparql.py

question_temp.py

word_tagging.py

external_dict/

csv2txt.py

movie_title.csv

movie_title.txt

person_name.csv

person_name.txt

__init__.py

我們通過使用正規表示式的方式來解析自然語言,並將解析的結果和我們預定義的模板進行匹配,最後實現乙個簡易的kbqa。方法沒有大家想象的那麼「高大上」,沒有統計方法、沒有機器學習也沒有深度學習。正則的好處是,易學,從事相關行業的人基本都了解這個東西;其次,可控性強或者說可解釋性強,如果某個問題解析錯誤,我們只要找到對應的匹配規則進行除錯即可;最後,正則冷啟動比較容易,在沒有資料或者資料極少的情況下,我們可以利用正則規則馬上上線乙個類似上述demo的初級的問答系統。在現實情況中,由於上述優點,工業界也比較青睞用正則來做語**析。正則方法的缺陷也是顯而易見的,它並不能理解語義資訊,而是基於符號的匹配。換個角度說,用正則的方法,就需要規則的設計者能夠盡可能考慮到所有情況,然而這是不可能的。暫且不考慮同義詞、句子結構等問題,光是羅列所有可能的問題就需要花費很大的功夫。儘管如此,在某些垂直領域,比如「**」,「電影」,由於問題集合的規模在一定程度上是可控的(我們基本能將使用者的問題劃定在某個範圍內),正規表示式還是有很大的用武之地的。在冷啟動一段時間,獲得了一定使用者使用資料之後,我們可以考慮引入其他的方法來改善系統的效能,然後逐漸減少正則規則在整個系統中的比重。其他kbqa的方法,可以參考專欄「揭開知識庫問答kb-qa的面紗」,作者詳細介紹了做kbqa的方法和相關研究。

這個系列的實踐也到乙個段落了。希望通過實踐,讀者能夠進一步理解知識圖譜的相關概念。

線性回歸 實踐篇

總結了線性回歸的理論部分,下面我們以浦東塘橋的二手房資料來實踐線性回歸。1,資料獲取 2,資料過濾 爬到資料後,過濾了房間面積小於30平公尺,大於150平公尺的資料,總 大於800w的也過濾了。這些資料太小或者太大 3,一元線性回歸 x表示房子面積,y表示房價,使用正規方程組的方法計算。拿到 後執行...

軟體架構 實踐篇

我們在軟體系統的開發和運維過程中,會遇到和其他系統的對接。主要的就是資料傳輸,打通各個系統,實現業務的高效化和自動化。但是在對接其他系統時,往往會出現各種問題。比如,乙個在開發中的系統a對接已經上線的系統b,b在設計之初,並沒考慮到系統a,導致a需要的資料,b沒有或者很零散,如果雙方開發人員不能達成...

Nginx 場景實踐篇

客戶端請求的頁面如果是靜態網頁,那麼伺服器會直接把靜態網頁的內容響應給客戶端。如果客戶端請求的是動態網頁,伺服器需要先把動態網頁換成靜態網頁,然後再把轉換後的靜態網頁響應給客戶端 靜態資源的幾種型別 其基本思路是盡可能避開網際網路上有可能影響資料傳輸速度和穩定性的瓶頸和環節,使內容傳輸的更快 更穩定...