日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

基于知识图谱的问答系统实践

發布時間:2023/12/10 windows 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于知识图谱的问答系统实践 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 1 項目目標
    • 1.1 數據情況
    • 1.2 問題分類
  • 2 技術方案
    • 2.1 數據準備
    • 2.2 數據入庫
    • 2.3 查詢部分
  • 3 模型
    • 3.1 問題分類
      • 3.1.1 數據準備
      • 3.1.2 分類模型TextCNN
    • 3.2 不同類型的問題處理邏輯
  • 4 總結與優化

1 項目目標

1.1 數據情況

基于知識圖譜的問答系統,簡稱為KBQA,是知識圖譜的一種應用方式。在本項目中的知識圖譜數據是關于公司的。數據中包含公司的主鍵、名稱、分紅方式、所處行業、債券類型等,也包含公司主要職位的人物名稱,還有公司與公司之間的關系。

經過分析之后,我們建立的圖譜中的實體有:公司、人物、行業、分紅方式、違規類型、債券類型。公司的屬性有:名稱、收益。人物的屬性有:名稱、年齡。其他實體的屬性只有:名稱。
公司與公司之間的關系有:供應商、客戶、公擔保。人物與公司之間的關系有:監事、董事。公司與行業的關系:屬于。公司與分紅方式的關系:屬于。其他類似。將屬性公司的所處行業屬性按照關系來處理,便于之后進行查詢。

1.2 問題分類

KBQA問題可以分為事實類問題、是非類問題、對比類問題、原因方法類問題等。我們這里只回答事實類問題。
事實類問題又分為:查詢實體、查詢屬性、查詢關系。
查詢實體:收益大于1000的公司有哪些
查詢屬性:秦皇島興龍房地產集團有限公司的收益是多少
查詢關系:秦皇島興龍房地產集團有限公司的董事是誰 秦皇島興龍房地產集團有限公司的供應商的收益是多少
其中查詢關系又分為一跳和多跳。

項目目標1:能夠識別這三類問題,給出正確答案。
項目目標2:能夠識別公司名稱縮寫,在輸入縮寫名稱的時候也能查詢到正確答案。例如 輸入 興隆地產,也能連接到秦皇島興龍房地產集團有限公司。

2 技術方案

2.1 數據準備

原始數據存在excel中,是以屬性的方式存儲的。將其拆分為公司、人物、行業等excel。

2.2 數據入庫

使用py2neo4j庫,將數據存入neo4j數據庫。形成6類實體,9類關系。
部分代碼。

def import_company():df = pd.read_csv('company_data/公司.csv')eid = df['eid'].valuesname = df['companyname'].valuesnodes = []data = list(zip(eid, name))for eid, name in tqdm(data):profit = np.random.randint(10000, 1000000, 1)[0]node = Node('company', name=name, profit=int(profit), eid=eid)nodes.append(node)graph.create(Subgraph(nodes))

2.3 查詢部分

我們的實現邏輯是:先對問題分類,每一類問題有對應的,符合cypher語法的模板。
查詢實體、查詢屬性、查詢關系。
查詢實體:收益大于1000的公司有哪些
查詢屬性:秦皇島興龍房地產集團有限公司的收益是多少
查詢關系:秦皇島興龍房地產集團有限公司的董事是誰 秦皇島興龍房地產集團有限公司的供應商的收益是多少
其中查詢關系又分為一跳和多跳。

例如對于查詢實體類的問題:收益大于1000的公司有哪些。當分到”查詢實體類“這個類別之后,提取出關系【收益】,提取出object 1000,提取操作符 大于,使用語句:match (n:company) where n.profit > 1000 return n.name,對應的查詢模板是:match (n:{subject_type}) where n.{attribute}{op}{num} return n.name

整個的處理過程是:問題分類->提取值,填充模板->查詢。
問題分類使用TextCNN模型。
提取值,填充模板:不同類型的問題有不同的處理邏輯
查詢:使用py2neo4j查詢

3 模型

3.1 問題分類

我們已知問題分為查詢實體、查詢屬性、查詢關系3個類別。

3.1.1 數據準備

我們按照需求調研階段發現的用戶可能問問題的方式自動生成一些分類數據,用來訓練分類模型。

例如查詢實體,我們可能根據名稱、收益、年齡三個屬性查詢實體。提出的問題可能有:
收益大于1000的公司
收益等于1000的公司
收益是1000的公司
哪些公司收益大于1000
哪些公司收益等于1000
哪些公司收益是1000
秦皇島興龍房地產集團有限公司
劉放心

我們可以改變數值、公司名稱、人物名稱生成更多的分類數據。同時,將收益替換成年齡,生成分類數據。

查詢屬性,我們可能查詢公司的收益,查詢人物的年齡。提出的問題可能有:
劉放心多大
劉放心幾歲
劉放心的年齡
秦皇島興龍房地產集團有限公司的收益
秦皇島興龍房地產集團有限公司的收入

查詢關系,我們可能查詢公司的分紅方式、合作伙伴、供應商等。提出的問題可能有:
秦皇島興龍房地產集團有限公司的董事
秦皇島興龍房地產集團有限公司的董事是誰
秦皇島興龍房地產集團有限公司的違規類型
秦皇島興龍房地產集團有限公司的違規類型是什么
秦皇島興龍房地產集團有限公司的違規類型是啥
秦皇島興龍房地產集團有限公司的供應商
秦皇島興龍房地產集團有限公司的供應商的分紅方式

改變公司名稱、關系類型,一跳兩跳關系,產生更多的數據。

3.1.2 分類模型TextCNN

讀取分類數據,并且分詞,將得到的詞保存到vocab.txt,作為詞庫。按照單詞所處的行作為單詞的index。

TextCNN詳細過程:

  • Embedding:將每個單詞用256維的向量表示。
  • Convolution:模型中設計了3個Convolution。kernel_size 分別為:[3,256],[4,256],[5,256]。每個卷積的輸出是100維。這個可以看做分別對句子做了3-gram,4-gram,5-gram語言模型。捕捉了不同長度語言模型的特征。
  • MaxPolling:第三層是一個1-max pooling層,這樣不同長度句子經過pooling層之后都能變成定長的表示。
  • 拼接:將三個卷積經過max-pooling之后的結果拼接起來作為一個結果。輸送到下一層。
  • dropout:經過dropout層,防止過擬合。
  • FullConnection:最后接一層全連接,輸出每個類別的概率。
class TextCNN(nn.Module):def __init__(self, vocab_len, embedding_size, n_class):super().__init__()self.embedding = nn.Embedding(vocab_len, embedding_size)self.cnn1 = nn.Conv2d(in_channels=1, out_channels=100, kernel_size=[3, embedding_size])self.cnn2 = nn.Conv2d(in_channels=1, out_channels=100, kernel_size=[4, embedding_size])self.cnn3 = nn.Conv2d(in_channels=1, out_channels=100, kernel_size=[5, embedding_size])self.max_pool1 = nn.MaxPool1d(kernel_size=8)self.max_pool2 = nn.MaxPool1d(kernel_size=7)self.max_pool3 = nn.MaxPool1d(kernel_size=6)self.dropout = nn.Dropout(0.2)self.full_connect = nn.Linear(300, n_class)def forward(self, x):embedding = self.embedding(x)embedding = embedding.unsqueeze(1)cnn1_out = self.cnn1(embedding)cnn1_out = cnn1_out.squeeze(-1)cnn2_out = self.cnn2(embedding)cnn2_out = cnn2_out.squeeze(-1)cnn3_out = self.cnn3(embedding)cnn3_out = cnn3_out.squeeze(-1)out1 = self.max_pool1(cnn1_out)out2 = self.max_pool2(cnn2_out)out3 = self.max_pool3(cnn3_out)out = torch.cat([out1, out2, out3], dim=1).squeeze(-1)out = self.dropout(out)out = self.full_connect(out)return out

3.2 不同類型的問題處理邏輯

1 查詢實體:根據屬性以及屬性值查詢實體。本項目中的實體有公司和人物兩類。我們再次看一下問題:

收益大于1000的公司
收益等于1000的公司
收益是1000的公司
哪些公司收益大于1000
哪些公司收益等于1000
哪些公司收益是1000
秦皇島興龍房地產集團有限公司
劉放心

第一種是輸入名稱查詢實體,名稱可能是公司名稱或者是人物名稱。我們可以使用AC自動機提取出人名、公司名。換句話說:如果輸入的詞只有公司名稱,那就按照:match (n:company) where n.name = ‘{公司名稱}’ return n 返回實體。如果輸入的詞只有人名,那就按照:match (n:person) where n.name = ‘{人名}’ return n 返回實體。

第二種是按照 年齡、收入查詢實體。將屬性放入一個集合中,按照字符串匹配識別出屬性。接著識別出操作符:大于、小于、等于/是。最后識別出屬性值,這里屬性值都是數值類型,并且是整數,可以按照正則識別。查詢模板:match (n:{subject_type}) where n.{attribute}{op}{num} return n.name,替換具體的值之后查詢符合要求的實體。subject_type是查詢實體類型:公司、人物。

2 查詢屬性:我們可能查詢公司的收益,查詢人物的年齡。我們再看一次問題:

劉放心多大
劉放心的幾歲
劉放心的年齡
秦皇島興龍房地產集團有限公司的收益
秦皇島興龍房地產集團有限公司的收入

發現問題中肯定會有公司名稱或者人物名稱。多大/幾歲/年齡都可以映射到關系age。收入/收益可以映射到關系profit。
這里我們可以使用AC自動機提取出人名、公司名。這里與上一個分類中要做的步驟是一樣的。接著,按照字符串匹配的方式找到關系。按照查詢模板:match (n:{subject_type}) where n.name = “{subject}” return n.{predicate} ,替換具體的值之后查詢實體的屬性值。subject_type是查詢實體類型:公司、人物。

3 查詢關系。我們再看一次問題:

秦皇島興龍房地產集團有限公司的董事
秦皇島興龍房地產集團有限公司的董事是誰
秦皇島興龍房地產集團有限公司的違規類型
秦皇島興龍房地產集團有限公司的違規類型是什么
秦皇島興龍房地產集團有限公司的違規類型是啥
秦皇島興龍房地產集團有限公司的供應商
秦皇島興龍房地產集團有限公司的供應商的分紅方式

我們已知關系有:董事、理事、違規類型、供應商、客戶等9種。

對于一跳關系查詢:秦皇島興龍房地產集團有限公司的董事,這個處理和查詢屬性類似:使用AC自動機提取人名/公司名稱,字符串匹配得到關系,使用模板:match (s:company)-[p:{p}]->(o) where s.name=’{subject}’ return o.name 查詢。

對于多跳關系查詢:秦皇島興龍房地產集團有限公司的供應商的分紅方式。這就要求先找到 ”秦皇島興龍房地產集團有限公司的供應商“查詢得到答案: 重慶廣建裝飾股份有限公司。然后將問題替換為”重慶廣建裝飾股份有限公司的分紅方式“。對于該問題要先分類,然后再按照不同類型問題的模板去查詢。當前對于這個問題應該屬于第三類查詢關系,并且是一跳關系。按照模板處理。

這里補充一段代碼。

4 總結與優化

本項目完成了基本的KBQA的功能。在知識圖譜結構簡單的情況下,基本理解了用戶的自然語言。

text:劉放心
question type: 0
[[Node(‘person’, age=24, name=‘劉放心’, pid=‘20599583’)]]


text:秦皇島興龍房地產集團有限公司
question type: 0
[[Node(‘company’, eid=‘ac386ac1-ec6d-4fdb-b1a7-83ecd383e1ad’, name=‘秦皇島興龍房地產集團有限公司’, profit=658095)]]


text:劉放心多大
question type: 1
[[24]]


text:秦皇島興龍房地產集團有限公司的收益
question type: 1
[[658095]]


text:龍口市福爾生化科技有限公司的客戶的收益
question type: 2
new question: 重慶廣建裝飾股份有限公司的收益
question type: 1
[[667278]]


text:龍口市福爾生化科技有限公司的客戶的董事
question type: 2
new question: 重慶廣建裝飾股份有限公司的董事
question type: 2
[[‘舒宜民’]
[‘葉東’]
[‘雷吉波’]
[‘葉志常’]
[‘李新來’]
[‘羅武良’]
[‘張志明’]
[‘葉紅潔’]
[‘郭賦斌’]
[‘王敬龍’]]

當圖譜關系很多,復雜的時候,上述使用邏輯的方式來處理,就不太可能,代碼復雜度會變更。這時候可以嘗試使用分類算法,將一個問題分類到某種關系查詢意圖。

這里對于實體識別使用AC自動機的方式,可以考慮替換為分詞方式。可以擴展出更多的實體種類。

當前項目只回答了事實類問題,對于是非類問題(例如:劉放心35歲嗎?)沒有涉及。可以采用適當的方式回答這類問題。

總結

以上是生活随笔為你收集整理的基于知识图谱的问答系统实践的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。