1. 程式人生 > 實用技巧 >Task1:知識圖譜介紹(1天)

Task1:知識圖譜介紹(1天)

一、知識圖譜簡介

“知識圖譜本質上是語義網路(Semantic Network)的知識庫”。但這有點抽象,所以換個角度,從實際應用的角度出發其實可以簡單地把知識圖譜理解成多關係圖(Multi-relational Graph)。

二、怎麼構建知識圖譜呢?

2.1 知識圖譜的資料來源

  • 第一種:業務本身的資料。這部分資料通常包含在公司內的資料庫表並以結構化的方式儲存,一般只需要簡單預處理即可以作為後續AI系統的輸入;
  • 第二種:網路上公開、抓取的資料。這些資料通常是以網頁的形式存在所以是非結構化的資料,一般需要藉助於自然語言處理等技術來提取出結構化資訊。

2.2 資訊抽取的難點

資訊抽取的難點在於處理非結構化資料。(如圖)

2.3 構建知識圖譜所涉及的技術

在構建類似的圖譜過程當中,主要涉及以下幾個方面的自然語言處理技術:

  1. 實體命名識別(Name Entity Recognition,NER):就是從文本里提取出實體並對每個實體做分類/打標籤。
  2. 關係抽取(Relation Extraction,RE):通過關係抽取技術,把實體間的關係從文字中提取出來。
  3. 實體統一(Entity Resolution,ER):不同詞彙其實是指向同一個實體。
  4. 指代消解(Coreference Resolution):文字中出現的“it”, “he”, “she”這些詞到底指向哪個實體

三、知識圖譜的儲存

知識圖譜主要有兩種儲存方式:

  • 一種是基於RDF的儲存;
  • 另一種是基於圖資料庫的儲存。

其中Neo4j系統目前仍是使用率最高的圖資料庫,它擁有活躍的社群,而且系統本身的查詢效率高,但唯一的不足就是不支援準分散式。

四、Neo4J 介紹與安裝

安裝與環境配置參考部落格

 安裝完成後win下輸入程式碼:
  neo4j.bat console

4.1 Neo4J Web 介面 介紹

http://127.0.0.1:7474/browser/

4.2 Cypher查詢語言

Cypher:

  • 介紹:是Neo4J的宣告式圖形查詢語言,允許使用者不必編寫圖形結構的遍歷程式碼,就可以對圖形資料進行高效的查詢。
  • 設計目的:類似SQL,適合於開發者以及在資料庫上做點對點模式(ad-hoc)查詢的專業操作人員。

五、Neo4J 實戰

參考知乎@異塵手把手教你快速入門知識圖譜 - Neo4J教程

六、通過 Python 操作 Neo4j

6.1 neo4j模組:執行CQL ( cypher ) 語句

 # step 1:匯入 Neo4j 驅動包
  from neo4j import GraphDatabase
  # step 2:連線 Neo4j 圖資料庫
  driver = GraphDatabase.driver("bolt://localhost:7687", auth=("neo4j", "password"))
  # 新增 關係 函式
  def add_friend(tx, name, friend_name):
      tx.run("MERGE (a:Person {name: $name}) "
            "MERGE (a)-[:KNOWS]->(friend:Person {name: $friend_name})",
            name=name, friend_name=friend_name)
  # 定義 關係函式
  def print_friends(tx, name):
      for record in tx.run("MATCH (a:Person)-[:KNOWS]->(friend) WHERE a.name = $name "
                          "RETURN friend.name ORDER BY friend.name", name=name):
          print(record["friend.name"])
  # step 3:執行
  with driver.session() as session:
      session.write_transaction(add_friend, "Arthur", "Guinevere")
      session.write_transaction(add_friend, "Arthur", "Lancelot")
      session.write_transaction(add_friend, "Arthur", "Merlin")
      session.read_transaction(print_friends, "Arthur")

上述程式的核心部分,抽象一下就是:

  neo4j.GraphDatabase.driver(xxxx).session().write_transaction(函式(含tx.run(CQL語句)))

或者

  neo4j.GraphDatabase.driver(xxxx).session().begin_transaction.run(CQL語句)

6.2 py2neo模組:通過操作python變數,達到操作neo4j的目的(需要pip3 install py2neo)

  # step 1:導包
  from py2neo import Graph, Node, Relationship 
  # step 2:構建圖
  g = Graph()
  # step 3:建立節點
  tx = g.begin()
  a = Node("Person", name="Alice")
  tx.create(a)
  b = Node("Person", name="Bob")
  # step 4:建立邊
  ab = Relationship(a, "KNOWS", b)
  # step 5:執行
  tx.create(ab)
  tx.commit()

py2neo模組符合python的習慣,寫著感覺順暢,其實可以完全不會CQL也能寫
其中可能會出現ClientError: [Security.Unauthorized] The client is unauthorized due to authentication failure.問題參考部落格

七、通過csv檔案批量匯入圖資料

這裡我們介紹使用neo4j-admin import命令匯入,適合部署在docker環境下的neo4j。 其他匯入方法也可以參考Neo4j之匯入資料

csv分為兩個nodes.csv和relations.csv,注意關係裡的起始節點必須是在nodes.csv裡能找到的:
  # nodes.csv需要指定唯一ID和nam,
  headers = [
  'unique_id:ID', # 圖資料庫中節點儲存的唯一標識
  'name', # 節點展示的名稱
  'node_type:LABEL', # 節點的型別,比如Person和Location
  'property' # 節點的其他屬性
  ]
  # relations.csv
  headers = [
  'unique_id', # 圖資料庫中關係儲存的唯一標識
  'begin_node_id:START_ID', # begin_node和end_node的值來自於nodes.csv中節點
  'end_node_id:END_ID',
  'begin_node_name',
  'end_node_name',
  'begin_node_type',
  'end_node_type',
  'relation_type:TYPE', # 關係的型別,比如Friends和Married
  'property' # 關係的其他屬性
  ]

製作出兩個csv後,通過以下步驟匯入neo4j:

  1. 兩個檔案nodes.csv ,relas.csv放在
     neo4j安裝絕對路徑/import
  2. 匯入到圖資料庫mygraph.db
     neo4j bin/neo4j-admin import --nodes=/var/lib/neo4j/import/nodes.csv --relationships=/var/lib/neo4j/import/relas.csv   --delimiter=^ --database=xinfang*.db
  
    注:delimiter=^ 指的是csv的分隔符
  1. 指定neo4j使用哪個資料庫
      修改 /root/neo4j/conf/neo4j.conf 檔案中的 dbms.default_database=mygraph.db
  1. 重啟neo4j就可以看到資料已經匯入成功了