Task1:知識圖譜介紹(1天)
阿新 • • 發佈:2021-01-12
一、知識圖譜簡介
“知識圖譜本質上是語義網路(Semantic Network)的知識庫”。但這有點抽象,所以換個角度,從實際應用的角度出發其實可以簡單地把知識圖譜理解成多關係圖(Multi-relational Graph)。
二、怎麼構建知識圖譜呢?
2.1 知識圖譜的資料來源
- 第一種:業務本身的資料。這部分資料通常包含在公司內的資料庫表並以結構化的方式儲存,一般只需要簡單預處理即可以作為後續AI系統的輸入;
- 第二種:網路上公開、抓取的資料。這些資料通常是以網頁的形式存在所以是非結構化的資料,一般需要藉助於自然語言處理等技術來提取出結構化資訊。
2.2 資訊抽取的難點
資訊抽取的難點在於處理非結構化資料。(如圖)
2.3 構建知識圖譜所涉及的技術
在構建類似的圖譜過程當中,主要涉及以下幾個方面的自然語言處理技術:
- 實體命名識別(Name Entity Recognition,NER):就是從文本里提取出實體並對每個實體做分類/打標籤。
- 關係抽取(Relation Extraction,RE):通過關係抽取技術,把實體間的關係從文字中提取出來。
- 實體統一(Entity Resolution,ER):不同詞彙其實是指向同一個實體。
- 指代消解(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:
- 兩個檔案nodes.csv ,relas.csv放在
neo4j安裝絕對路徑/import
- 匯入到圖資料庫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的分隔符
- 指定neo4j使用哪個資料庫
修改 /root/neo4j/conf/neo4j.conf 檔案中的 dbms.default_database=mygraph.db
- 重啟neo4j就可以看到資料已經匯入成功了