基于知识图谱的问答系统实践
文章目錄
- 1 項目目標(biāo)
- 1.1 數(shù)據(jù)情況
- 1.2 問題分類
- 2 技術(shù)方案
- 2.1 數(shù)據(jù)準(zhǔn)備
- 2.2 數(shù)據(jù)入庫
- 2.3 查詢部分
- 3 模型
- 3.1 問題分類
- 3.1.1 數(shù)據(jù)準(zhǔn)備
- 3.1.2 分類模型TextCNN
- 3.2 不同類型的問題處理邏輯
- 4 總結(jié)與優(yōu)化
1 項目目標(biāo)
1.1 數(shù)據(jù)情況
基于知識圖譜的問答系統(tǒng),簡稱為KBQA,是知識圖譜的一種應(yīng)用方式。在本項目中的知識圖譜數(shù)據(jù)是關(guān)于公司的。數(shù)據(jù)中包含公司的主鍵、名稱、分紅方式、所處行業(yè)、債券類型等,也包含公司主要職位的人物名稱,還有公司與公司之間的關(guān)系。
經(jīng)過分析之后,我們建立的圖譜中的實體有:公司、人物、行業(yè)、分紅方式、違規(guī)類型、債券類型。公司的屬性有:名稱、收益。人物的屬性有:名稱、年齡。其他實體的屬性只有:名稱。
公司與公司之間的關(guān)系有:供應(yīng)商、客戶、公擔(dān)保。人物與公司之間的關(guān)系有:監(jiān)事、董事。公司與行業(yè)的關(guān)系:屬于。公司與分紅方式的關(guān)系:屬于。其他類似。將屬性公司的所處行業(yè)屬性按照關(guān)系來處理,便于之后進(jìn)行查詢。
1.2 問題分類
KBQA問題可以分為事實類問題、是非類問題、對比類問題、原因方法類問題等。我們這里只回答事實類問題。
事實類問題又分為:查詢實體、查詢屬性、查詢關(guān)系。
查詢實體:收益大于1000的公司有哪些
查詢屬性:秦皇島興龍房地產(chǎn)集團(tuán)有限公司的收益是多少
查詢關(guān)系:秦皇島興龍房地產(chǎn)集團(tuán)有限公司的董事是誰 秦皇島興龍房地產(chǎn)集團(tuán)有限公司的供應(yīng)商的收益是多少
其中查詢關(guān)系又分為一跳和多跳。
項目目標(biāo)1:能夠識別這三類問題,給出正確答案。
項目目標(biāo)2:能夠識別公司名稱縮寫,在輸入縮寫名稱的時候也能查詢到正確答案。例如 輸入 興隆地產(chǎn),也能連接到秦皇島興龍房地產(chǎn)集團(tuán)有限公司。
2 技術(shù)方案
2.1 數(shù)據(jù)準(zhǔn)備
原始數(shù)據(jù)存在excel中,是以屬性的方式存儲的。將其拆分為公司、人物、行業(yè)等excel。
2.2 數(shù)據(jù)入庫
使用py2neo4j庫,將數(shù)據(jù)存入neo4j數(shù)據(jù)庫。形成6類實體,9類關(guān)系。
部分代碼。
2.3 查詢部分
我們的實現(xiàn)邏輯是:先對問題分類,每一類問題有對應(yīng)的,符合cypher語法的模板。
查詢實體、查詢屬性、查詢關(guān)系。
查詢實體:收益大于1000的公司有哪些
查詢屬性:秦皇島興龍房地產(chǎn)集團(tuán)有限公司的收益是多少
查詢關(guān)系:秦皇島興龍房地產(chǎn)集團(tuán)有限公司的董事是誰 秦皇島興龍房地產(chǎn)集團(tuán)有限公司的供應(yīng)商的收益是多少
其中查詢關(guān)系又分為一跳和多跳。
例如對于查詢實體類的問題:收益大于1000的公司有哪些。當(dāng)分到”查詢實體類“這個類別之后,提取出關(guān)系【收益】,提取出object 1000,提取操作符 大于,使用語句:match (n:company) where n.profit > 1000 return n.name,對應(yīng)的查詢模板是:match (n:{subject_type}) where n.{attribute}{op}{num} return n.name
整個的處理過程是:問題分類->提取值,填充模板->查詢。
問題分類使用TextCNN模型。
提取值,填充模板:不同類型的問題有不同的處理邏輯
查詢:使用py2neo4j查詢
3 模型
3.1 問題分類
我們已知問題分為查詢實體、查詢屬性、查詢關(guān)系3個類別。
3.1.1 數(shù)據(jù)準(zhǔn)備
我們按照需求調(diào)研階段發(fā)現(xiàn)的用戶可能問問題的方式自動生成一些分類數(shù)據(jù),用來訓(xùn)練分類模型。
例如查詢實體,我們可能根據(jù)名稱、收益、年齡三個屬性查詢實體。提出的問題可能有:
收益大于1000的公司
收益等于1000的公司
收益是1000的公司
哪些公司收益大于1000
哪些公司收益等于1000
哪些公司收益是1000
秦皇島興龍房地產(chǎn)集團(tuán)有限公司
劉放心
我們可以改變數(shù)值、公司名稱、人物名稱生成更多的分類數(shù)據(jù)。同時,將收益替換成年齡,生成分類數(shù)據(jù)。
查詢屬性,我們可能查詢公司的收益,查詢?nèi)宋锏哪挲g。提出的問題可能有:
劉放心多大
劉放心幾歲
劉放心的年齡
秦皇島興龍房地產(chǎn)集團(tuán)有限公司的收益
秦皇島興龍房地產(chǎn)集團(tuán)有限公司的收入
查詢關(guān)系,我們可能查詢公司的分紅方式、合作伙伴、供應(yīng)商等。提出的問題可能有:
秦皇島興龍房地產(chǎn)集團(tuán)有限公司的董事
秦皇島興龍房地產(chǎn)集團(tuán)有限公司的董事是誰
秦皇島興龍房地產(chǎn)集團(tuán)有限公司的違規(guī)類型
秦皇島興龍房地產(chǎn)集團(tuán)有限公司的違規(guī)類型是什么
秦皇島興龍房地產(chǎn)集團(tuán)有限公司的違規(guī)類型是啥
秦皇島興龍房地產(chǎn)集團(tuán)有限公司的供應(yīng)商
秦皇島興龍房地產(chǎn)集團(tuán)有限公司的供應(yīng)商的分紅方式
改變公司名稱、關(guān)系類型,一跳兩跳關(guān)系,產(chǎn)生更多的數(shù)據(jù)。
3.1.2 分類模型TextCNN
讀取分類數(shù)據(jù),并且分詞,將得到的詞保存到vocab.txt,作為詞庫。按照單詞所處的行作為單詞的index。
TextCNN詳細(xì)過程:
- Embedding:將每個單詞用256維的向量表示。
- Convolution:模型中設(shè)計了3個Convolution。kernel_size 分別為:[3,256],[4,256],[5,256]。每個卷積的輸出是100維。這個可以看做分別對句子做了3-gram,4-gram,5-gram語言模型。捕捉了不同長度語言模型的特征。
- MaxPolling:第三層是一個1-max pooling層,這樣不同長度句子經(jīng)過pooling層之后都能變成定長的表示。
- 拼接:將三個卷積經(jīng)過max-pooling之后的結(jié)果拼接起來作為一個結(jié)果。輸送到下一層。
- dropout:經(jīng)過dropout層,防止過擬合。
- FullConnection:最后接一層全連接,輸出每個類別的概率。
3.2 不同類型的問題處理邏輯
1 查詢實體:根據(jù)屬性以及屬性值查詢實體。本項目中的實體有公司和人物兩類。我們再次看一下問題:
收益大于1000的公司
收益等于1000的公司
收益是1000的公司
哪些公司收益大于1000
哪些公司收益等于1000
哪些公司收益是1000
秦皇島興龍房地產(chǎn)集團(tuán)有限公司
劉放心
第一種是輸入名稱查詢實體,名稱可能是公司名稱或者是人物名稱。我們可以使用AC自動機(jī)提取出人名、公司名。換句話說:如果輸入的詞只有公司名稱,那就按照:match (n:company) where n.name = ‘{公司名稱}’ return n 返回實體。如果輸入的詞只有人名,那就按照:match (n:person) where n.name = ‘{人名}’ return n 返回實體。
第二種是按照 年齡、收入查詢實體。將屬性放入一個集合中,按照字符串匹配識別出屬性。接著識別出操作符:大于、小于、等于/是。最后識別出屬性值,這里屬性值都是數(shù)值類型,并且是整數(shù),可以按照正則識別。查詢模板:match (n:{subject_type}) where n.{attribute}{op}{num} return n.name,替換具體的值之后查詢符合要求的實體。subject_type是查詢實體類型:公司、人物。
2 查詢屬性:我們可能查詢公司的收益,查詢?nèi)宋锏哪挲g。我們再看一次問題:
劉放心多大
劉放心的幾歲
劉放心的年齡
秦皇島興龍房地產(chǎn)集團(tuán)有限公司的收益
秦皇島興龍房地產(chǎn)集團(tuán)有限公司的收入
發(fā)現(xiàn)問題中肯定會有公司名稱或者人物名稱。多大/幾歲/年齡都可以映射到關(guān)系age。收入/收益可以映射到關(guān)系profit。
這里我們可以使用AC自動機(jī)提取出人名、公司名。這里與上一個分類中要做的步驟是一樣的。接著,按照字符串匹配的方式找到關(guān)系。按照查詢模板:match (n:{subject_type}) where n.name = “{subject}” return n.{predicate} ,替換具體的值之后查詢實體的屬性值。subject_type是查詢實體類型:公司、人物。
3 查詢關(guān)系。我們再看一次問題:
秦皇島興龍房地產(chǎn)集團(tuán)有限公司的董事
秦皇島興龍房地產(chǎn)集團(tuán)有限公司的董事是誰
秦皇島興龍房地產(chǎn)集團(tuán)有限公司的違規(guī)類型
秦皇島興龍房地產(chǎn)集團(tuán)有限公司的違規(guī)類型是什么
秦皇島興龍房地產(chǎn)集團(tuán)有限公司的違規(guī)類型是啥
秦皇島興龍房地產(chǎn)集團(tuán)有限公司的供應(yīng)商
秦皇島興龍房地產(chǎn)集團(tuán)有限公司的供應(yīng)商的分紅方式
我們已知關(guān)系有:董事、理事、違規(guī)類型、供應(yīng)商、客戶等9種。
對于一跳關(guān)系查詢:秦皇島興龍房地產(chǎn)集團(tuán)有限公司的董事,這個處理和查詢屬性類似:使用AC自動機(jī)提取人名/公司名稱,字符串匹配得到關(guān)系,使用模板:match (s:company)-[p:{p}]->(o) where s.name=’{subject}’ return o.name 查詢。
對于多跳關(guān)系查詢:秦皇島興龍房地產(chǎn)集團(tuán)有限公司的供應(yīng)商的分紅方式。這就要求先找到 ”秦皇島興龍房地產(chǎn)集團(tuán)有限公司的供應(yīng)商“查詢得到答案: 重慶廣建裝飾股份有限公司。然后將問題替換為”重慶廣建裝飾股份有限公司的分紅方式“。對于該問題要先分類,然后再按照不同類型問題的模板去查詢。當(dāng)前對于這個問題應(yīng)該屬于第三類查詢關(guān)系,并且是一跳關(guān)系。按照模板處理。
這里補(bǔ)充一段代碼。
4 總結(jié)與優(yōu)化
本項目完成了基本的KBQA的功能。在知識圖譜結(jié)構(gòu)簡單的情況下,基本理解了用戶的自然語言。
text:劉放心
question type: 0
[[Node(‘person’, age=24, name=‘劉放心’, pid=‘20599583’)]]
text:秦皇島興龍房地產(chǎn)集團(tuán)有限公司
question type: 0
[[Node(‘company’, eid=‘a(chǎn)c386ac1-ec6d-4fdb-b1a7-83ecd383e1ad’, name=‘秦皇島興龍房地產(chǎn)集團(tuán)有限公司’, profit=658095)]]
text:劉放心多大
question type: 1
[[24]]
text:秦皇島興龍房地產(chǎn)集團(tuán)有限公司的收益
question type: 1
[[658095]]
text:龍口市福爾生化科技有限公司的客戶的收益
question type: 2
new question: 重慶廣建裝飾股份有限公司的收益
question type: 1
[[667278]]
text:龍口市福爾生化科技有限公司的客戶的董事
question type: 2
new question: 重慶廣建裝飾股份有限公司的董事
question type: 2
[[‘舒宜民’]
[‘葉東’]
[‘雷吉波’]
[‘葉志常’]
[‘李新來’]
[‘羅武良’]
[‘張志明’]
[‘葉紅潔’]
[‘郭賦斌’]
[‘王敬龍’]]
當(dāng)圖譜關(guān)系很多,復(fù)雜的時候,上述使用邏輯的方式來處理,就不太可能,代碼復(fù)雜度會變更。這時候可以嘗試使用分類算法,將一個問題分類到某種關(guān)系查詢意圖。
這里對于實體識別使用AC自動機(jī)的方式,可以考慮替換為分詞方式。可以擴(kuò)展出更多的實體種類。
當(dāng)前項目只回答了事實類問題,對于是非類問題(例如:劉放心35歲嗎?)沒有涉及。可以采用適當(dāng)?shù)姆绞交卮疬@類問題。
總結(jié)
以上是生活随笔為你收集整理的基于知识图谱的问答系统实践的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java。接口和抽象类区别
- 下一篇: Python|LeetCode习题答案汇