知识图谱实践篇(五):KBQA Demo
作為實踐篇的最后一篇,我們將介紹如何用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__.pytradition2simple/langconv.pytraditional2simple.pyzh_wiki.py__init__.pyKB_query/jena_sparql_endpoint.pyquery_main.pyquestion2sparql.pyquestion_temp.pyword_tagging.pyexternal_dict/csv2txt.pymovie_title.csvmovie_title.txtperson_name.csvperson_name.txt__init__.py?
- "crawler"文件夾包含的是我們從"The Movie DB"獲取數據的腳本。
- "KB_query"文件夾包含的是完成整個問答demo流程所需要的腳本。
- "external_dict"包含的是人名和電影名兩個外部詞典。csv文件是從mysql-workbench導出的,按照jieba外部詞典的格式,我們將csv轉為對應的txt。
- "word_tagging",定義Word類的結構(即我們在REfO中使用的對象);定義"Tagger"類來初始化詞典,并實現自然語言到Word對象的方法。
- "jena_sparql_endpoint",用于完成與Fuseki的交互。
- "question2sparql",將自然語言轉為對應的SPARQL查詢。
- "question_temp",定義SPARQL模板和匹配規則。
- "query_main",main函數。
在運行"query_main"之前,讀者需要啟動Fuseki服務,具體方法請參考上一篇文章。
?
三、總結
我們通過使用正則表達式的方式來解析自然語言,并將解析的結果和我們預定義的模板進行匹配,最后實現一個簡易的KBQA。方法沒有大家想象的那么“高大上”,沒有統計方法、沒有機器學習也沒有深度學習。正則的好處是,易學,從事相關行業的人基本都了解這個東西;其次,可控性強或者說可解釋性強,如果某個問題解析錯誤,我們只要找到對應的匹配規則進行調試即可;最后,正則冷啟動比較容易,在沒有數據或者數據極少的情況下,我們可以利用正則規則馬上上線一個類似上述demo的初級的問答系統。在現實情況中,由于上述優點,工業界也比較青睞用正則來做語義解析。正則方法的缺陷也是顯而易見的,它并不能理解語義信息,而是基于符號的匹配。換個角度說,用正則的方法,就需要規則的設計者能夠盡可能考慮到所有情況,然而這是不可能的。暫且不考慮同義詞、句子結構等問題,光是羅列所有可能的問題就需要花費很大的功夫。盡管如此,在某些垂直領域,比如“音樂”,“電影”,由于問題集合的規模在一定程度上是可控的(我們基本能將用戶的問題劃定在某個范圍內),正則表達式還是有很大的用武之地的。在冷啟動一段時間,獲得了一定用戶使用數據之后,我們可以考慮引入其他的方法來改善系統的性能,然后逐漸減少正則規則在整個系統中的比重。如果讀者想深入研究KBQA,可以參考專欄“揭開知識庫問答KB-QA的面紗”,該專欄的作者詳細介紹了做KBQA的方法和相關研究。
這個系列的實踐也告一段落了。希望通過實踐,讀者能夠進一步理解知識圖譜的相關概念。
https://zhuanlan.zhihu.com/p/33363861
總結
以上是生活随笔為你收集整理的知识图谱实践篇(五):KBQA Demo的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 嵌入式linux写文件内存增加,嵌入式L
- 下一篇: 计算机基础知识二进制转换,计算机基础知识