知識圖譜技術的興起為自然語言處理提供了新的途徑。藉由圖資料函式庫的結構化特性,我們得以更有效率地儲存和查詢語義資訊,進而應用於自然語言生成和語義相似度計算。這篇文章將深入探討如何利用知識圖譜,特別是以 WordNet 為例,進行相關的自然語言處理任務。其中,Cypher 查詢語言扮演著關鍵角色,它讓我們能靈活地操作圖資料函式庫,提取所需的資訊。此外,文章也將介紹 NLTK 函式庫,提供 Python 環境下的實作範例,方便讀者快速上手。

知識圖譜與自然語言生成

知識圖譜是一種用於儲存和管理結構化資料的資料函式庫。它由實體(Entity)、屬性(Property)和關係(Relationship)組成。實體代表了世界中的事物,例如人、地點和組織。屬性描述了實體的特徵,例如名稱、地址和電話號碼。關係則描述了實體之間的連線,例如朋友、同事或親屬關係。

在知識圖譜中,自然語言生成可以用於根據圖譜中的資料生成自然語言的描述。例如,給定一個包含人、地點和組織的圖譜,NLG 可以用於生成一份自然語言的報告,描述這些實體之間的關係。

基本句子結構

自然語言生成的一個基本步驟是根據圖譜中的資料生成基本句子結構。這可以透過將實體、屬性和關係對映到句子中的主語、謂語和賓語來實作。

例如,給定一個包含兩個實體和一個關係的圖譜,NLG 可可以生成一個基本句子結構,如下所示:

  • 主語:實體 1
  • 謂語:關係
  • 賓語:實體 2

這個基本句子結構可以用於生成自然語言的描述,例如:“實體 1 與實體 2 有關係。”

實際應用

自然語言生成在知識圖譜中的實際應用包括:

  • 報告生成:根據圖譜中的資料生成自然語言的報告。
  • 對話系統:根據圖譜中的資料生成自然語言的對話。
  • 資料視覺化:根據圖譜中的資料生成自然語言的描述,以便更好地理解資料。
圖表翻譯:
  graph LR
    A[知識圖譜] -->|包含|> B[實體]
    A -->|包含|> C[屬性]
    A -->|包含|> D[關係]
    B -->|對映到|> E[主語]
    C -->|對映到|> F[謂語]
    D -->|對映到|> G[賓語]
    E -->|生成|> H[基本句子結構]
    F -->|生成|> H
    G -->|生成|> H

內容解密:

上述內容介紹了自然語言生成與知識圖譜的關係,並説明瞭如何根據圖譜中的資料生成自然語言的描述。同時,也提到了 NLG 在知識圖譜中的實際應用,包括報告生成、對話系統和資料視覺化。最後,透過一個簡單的例子説明瞭如何根據圖譜中的資料生成基本句子結構。

知識圖譜自然語言生成技術

知識圖譜是一種強大的資料儲存和查詢工具,但其資料通常以結構化的形式存在,難以直接轉換為自然語言。然而,隨著自然語言生成技術的發展,現在可以使用知識圖譜來生成自然語言描述。

基本概念

知識圖譜是一種圖形結構,節點代表實體,邊代表實體之間的關係。自然語言生成技術可以使用這種結構來生成描述實體和其關係的自然語言句子。

實作方法

有一種方法是使用 Cypher 查詢語言來查詢知識圖譜,並使用結果生成自然語言句子。例如,以下 Cypher 查詢可以生成描述實體和其關係的自然語言句子:

MATCH (n)-[r]->(m)
RETURN n.name + " " + type(r) + " " + m.name AS sentence

這個查詢會生成描述實體 nm 之間的關係 r 的自然語言句子。

知識圖譜註解

為了生成更自然的語言,知識圖譜可以被註解以提供更多的資訊。例如,可以新增實體的名稱、關係的名稱和描述等註解。這些註解可以被用來生成更自然的語言。

自然語言生成引擎

自然語言生成引擎可以使用知識圖譜和註解來生成自然語言描述。引擎會根據知識圖譜和註解生成描述實體和其關係的自然語言句子。

內容解密:

上述 Cypher 查詢可以生成描述實體和其關係的自然語言句子。但是,為了生成更自然的語言,需要新增更多的註解和資訊。例如,可以新增實體的名稱、關係的名稱和描述等註解。這些註解可以被用來生成更自然的語言。

圖表翻譯:

以下是使用 Mermaid 圖表來描述知識圖譜和自然語言生成引擎的流程:

  graph LR
    A[知識圖譜] --> B[查詢]
    B --> C[結果]
    C --> D[自然語言生成引擎]
    D --> E[自然語言描述]

這個圖表描述了知識圖譜、查詢、結果、自然語言生成引擎和自然語言描述之間的流程。

使用 Cypher 查詢 WordNet 知識圖

WordNet 是一個英文詞彙資料函式庫,將名詞、動詞、形容詞和副詞分組為一組認知上的同義詞(稱為 synsets),每個 synset 表達一個不同的概念。這些 synsets 之間透過關係連線,形成一個可以自然儲存在圖中的元素網路。

匯入 WordNet 到 Neo4j

WordNet 有多種格式可供使用,其中包括 RDF 格式。這使得匯入 RDF 到 Neo4j 變得相當簡單,如下面的 Cypher 查詢所示:

CREATE CONSTRAINT n10s_unique_uri ON (r:Resource)
ASSERT r.uri IS UNIQUE
CALL n10s.graphconfig.init( {handleVocabUris : "IGNORE"});
CALL n10s.rdf.import.fetch(".../english-wordnet-2021.ttl.gz","Turtle");

查詢 WordNet

WordNet 的圖結構(schema)主要由 Lexical Entry、Lexical Sense 和 Lexical Concept 組成。下面的 Cypher 查詢傳回所有與單詞 “clear” 相關的意思:

MATCH (lemma:Form)<-[:canonicalForm]-(le:LexicalEntry)
-[:sense]->()-[:isLexicalizedSenseOf]->(concept)
WHERE lemma.writtenRep = "clear"
RETURN le.partOfSpeech AS PoS, concept.definition AS definition

這個查詢傳回的結果很多,因為 “clear” 可以作為名詞、動詞、形容詞或副詞。結果以表格形式傳回,並且匹配了 “clear” 的各種含義。

使用 WordNet 進行語義分析

WordNet 可以用於取得單詞或一組單詞的所有可能含義。大多數查詢都根據遍歷主圖模式 Form–Lexical Entry–Lexical Sense–Lexical Concept。

結合 Rasa 和 Neo4j

Rasa 是一個開源的對話方塊架,包括 “知識函式庫操作” 來利用外部資料函式庫的資訊,可以用於與根據 Neo4j 的知識圖進行互動。以下是使用 Rasa 連線到 Neo4j 知識圖的示例:

from rasa_sdk.knowledge_base.storage import KnowledgeBase
from rasa_sdk.knowledge_base.actions import ActionQueryKnowledgeBase

class MyKnowledgeBaseAction(ActionQueryKnowledgeBase):
    def __init__(self):
        knowledge_base = KnowledgeBase("ref to neo4j")
        super().__init__(knowledge_base)

這樣就可以使用 Rasa 和 Neo4j 來構建一個對話系統,利用 WordNet 和其他知識圖來提供更智慧和更具上下文的回應。

詞彙意義與詞網的應用

詞彙意義是自然語言處理中的一個重要研究領域,旨在瞭解詞彙的多重意義和其之間的關係。詞網(WordNet)是一個大型的英語詞彙資料函式庫,提供了詞彙之間的語義關係。

查詢詞網

詞網提供了一個公共的線上查詢介面,允許使用者查詢詞彙的意義和其相關資訊。例如,查詢詞彙 “clear” 的意義,可以得到多個不同的結果,每個結果代表了一個不同的詞彙概念。

圖形化查詢

使用 Cypher 查詢語言,可以查詢詞彙的圖形化表示。例如,查詢詞彙 “clear” 的圖形化表示,可以得到一個包含多個詞彙概念的圖形,每個概念代表了一個不同的詞彙意義。

多義詞彙

多義詞彙是指具有多個意義的詞彙。使用聚合查詢,可以找到英語中最多義的詞彙。例如,查詢前五個最多義的詞彙,可以得到一個列表,顯示每個詞彙的意義數量。

範例查詢

以下是兩個範例查詢:

  • 查詢詞彙 “clear” 的圖形化表示:

MATCH path = (lemma:Form)<-[:canonicalForm]-(:LexicalEntry)-[:sense]->()-[:isLexicalizedSenseOf]->() WHERE lemma.writtenRep = “clear” RETURN path

*   查詢前五個最多義的詞彙:
    ```cypher
MATCH (lemma:Form)
RETURN lemma.writtenRep AS lemma, size((lemma)<-[:canonicalForm]-(:LexicalEntry)-[:sense]->()) AS senseCount
ORDER BY senseCount DESC
LIMIT 5

結果

查詢結果如下:

詞彙意義數量
break75
cut70
run57
play52

這些結果顯示了英語中最多義的詞彙及其意義數量。

圖表翻譯:

  graph LR
    A[詞彙] --> B[意義]
    B --> C[圖形化表示]
    C --> D[多義詞彙]
    D --> E[聚合查詢]
    E --> F[結果]

此圖表顯示了詞彙、意義、圖形化表示、多義詞彙、聚合查詢和結果之間的關係。

逆向查詢的應用:WordNet 知識圖中的語義相似度

在 WordNet 知識圖中,除了可以進行詞彙查詢外,我們還可以進行逆向查詢,以發現從概念到詞彙的對應關係。這種查詢方式可以幫助我們找到所有能夠表達某個概念的詞彙。

概念到詞彙的對映

使用 Cypher 查詢語言,我們可以實作從概念到詞彙的對映。以下是查詢範例:

MATCH (lemma:Form)<-[:canonicalForm]-(:LexicalEntry)-[:sense]->(s)-[:isLexicalizedSenseOf]->(con:LexicalConcept)
RETURN con.definition AS concept, count(lemma.writtenRep) AS wordCount, collect(lemma.writtenRep) AS words
ORDER BY wordCount DESC

這個查詢會傳回所有概念及其對應的詞彙數量和詞彙列表。

詞彙之間的語義相似度

WordNet 知識圖中還包含了詞彙之間的語義相似度資訊。這些資訊可以用來計算兩個詞彙之間的語義相似度。以下是三種常用的語義相似度計算方法:

  1. 路徑相似度(Path Similarity):根據兩個詞彙之間的最短路徑長度計算相似度。
  2. 萊昂霍夫距離(Levenshtein Distance):根據兩個詞彙之間的編輯距離計算相似度。
  3. Jaccard 相似度(Jaccard Similarity):根據兩個詞彙的共有詞彙集合計算相似度。

以下是路徑相似度的 Cypher 實作範例:

MATCH (a:LexicalConcept {uri: $a_id})
MATCH (b:LexicalConcept {uri: $b_id})
MATCH p = shortestPath((a)-[:hypernym*0..]-(b))
WITH a, b, length(p) AS pathLen
RETURN a.definition AS a_def, b.definition AS b_def, pathLen, 1.0/(1+pathLen) AS pathSim

這個查詢會傳回兩個詞彙之間的路徑長度和相似度。

瞭解語義相似度:從WordNet到圖基方法

在自然語言處理(NLP)中,計算語義相似度是一個重要的任務。語義相似度是指兩個詞彙或概念之間的意義相似程度。WordNet是一個廣泛使用的詞彙網路,它提供了一個基礎的框架來計算語義相似度。在本文中,我們將探討如何使用WordNet和圖基方法來計算語義相似度。

WordNet和NLTK

WordNet是一個大型的詞彙網路,它包含了大量的英語詞彙及其相應的意義。NLTK(Natural Language Toolkit)是一個流行的Python函式庫,它提供了一個簡單的介面來存取WordNet。使用NLTK,我們可以輕鬆地計算兩個詞彙之間的語義相似度。

以下是使用NLTK計算語義相似度的範例:

import nltk
from nltk.corpus import wordnet

dog = wordnet.synset('dog.n.01')
lion = wordnet.synset('lion.n.01')

print(dog.definition())
print(lion.definition())

print(dog.path_similarity(lion))

這段程式碼計算了「dog」和「lion」兩個詞彙之間的語義相似度,並輸出了結果。

圖基方法

雖然NLTK提供了一個簡單的介面來計算語義相似度,但它有一些限制。例如,NLTK只支援WordNet 3.0,而最新版本的WordNet已經是4.0。另外,NLTK的實作可能不夠靈活,無法滿足特定的需求。

為了克服這些限制,我們可以使用圖基方法來計算語義相似度。圖基方法是根據圖論的,它將詞彙之間的關係表示為一個圖。透過分析這個圖,我們可以計算語義相似度。

以下是使用Cypher查詢語言計算語義相似度的範例:

MATCH path = (leaf:LexicalConcept)-[:hypernym*0..]->(root)
WHERE NOT EXISTS (()-[:hypernym]->(leaf))
AND NOT EXISTS ((root)-[:hypernym]->())
RETURN path

這段程式碼計算了詞彙之間的語義相似度,並輸出了結果。

Leacock-Chodorow Similarity

Leacock-Chodorow相似度是一種根據圖基方法的語義相似度演算法。它考慮了詞彙之間的距離和詞彙的深度。透過計算詞彙之間的距離和深度,我們可以得到一個更準確的語義相似度。

以下是使用Cypher查詢語言計算Leacock-Chodorow相似度的範例:

MATCH path = (leaf:LexicalConcept)-[:hypernym*0..]->(root)
WHERE NOT EXISTS (()-[:hypernym]->(leaf))
AND NOT EXISTS ((root)-[:hypernym]->())
RETURN length(path) AS depth

這段程式碼計算了詞彙之間的距離和深度,並輸出了結果。

瞭解語義相似度:Leacock-Chodorow 距離公式

在語義相似度的計算中,Leacock-Chodorow 距離公式是一種重要的方法,用於衡量兩個詞彙之間的相似度。這個公式是根據詞彙在分類別學樹中的深度來計算的。

Leacock-Chodorow 距離公式

Leacock-Chodorow 距離公式的基本思想是,兩個詞彙在分類別學樹中的距離越短,則它們之間的相似度越高。這個公式可以使用 Cypher 語言在 WordNet 知識圖中實作,如下所示:

MATCH (a:LexicalConcept {uri: $a_id})
MATCH (b:LexicalConcept {uri: $b_id})
MATCH p = shortestPath((a)-[:hypernym*0..]-(b))
WITH a, b, length(p) AS pathLen
RETURN a.definition AS a_def, b.definition AS b_def, pathLen, -log10(pathLen/(2.0*$depth)) AS LCSim

這個公式計算了兩個詞彙之間的最短距離,並將其轉換為相似度值。

Wu 和 Palmer 相似度

Wu 和 Palmer 相似度是一種根據最小公共上綱 (LCS) 的相似度計算方法。LCS 是兩個詞彙的最具體公共祖先節點。這個方法可以使用 NLTK函式庫在 Python 中實作,如下所示:

import nltk
from nltk.corpus import wordnet as wn

dog = wn.synset('dog.n.01')
lion = wn.synset('lion.n.01')

print(dog.definition())
print(lion.definition())
print(wn.lch_similarity(dog, lion))

這個方法計算了兩個詞彙之間的相似度,並傳回一個介於 0 和 1 之間的值,表示兩個詞彙之間的相似度。

圖解語意相似度:Wu-Palmer 距離公式

語意相似度是計算兩個詞彙或概念之間語意上的接近程度的指標。Wu-Palmer 距離公式是一種用於計算語意相似度的方法,結合了兩個元素的深度和其最低共同祖先(LCS)的深度。

Wu-Palmer 距離公式

Wu-Palmer 距離公式定義為: [ \text{Wu-Palmer} = \frac{2 \times \text{LCS 深度}}{\text{元素 A 深度} + \text{元素 B 深度}} ]

這個公式結合了兩個元素的深度和其最低共同祖先的深度,從而得到兩個元素之間的語意相似度。

實作 Wu-Palmer 距離公式

為了計算 Wu-Palmer 距離公式,我們需要使用 Cypher 實作 LCS 的查詢和距離的計算。以下是實作 Wu-Palmer 距離公式的 Cypher 程式碼:

MATCH (a:LexicalConcept {uri: $a_id})
MATCH (b:LexicalConcept {uri: $b_id})
MATCH p = (a)-[:hypernym*0..]->(lcs)<-[:hypernym*0..]-(b)
WITH a, b, lcs, length(p) AS pathLen
MATCH p = (lcs)-[:hypernym*0..]->(root)
WHERE NOT (root)-[:hypernym]->()
RETURN lcs.definition AS lcs_def, lcs.uri AS lcs_id, length(p) AS lcs_depth
ORDER BY lcs_def

這段 Cypher 程式碼查詢兩個元素的最低共同祖先(LCS),並計算其深度。

計算 Wu-Palmer 相似度

一旦我們得到 LCS 的深度,我們就可以計算 Wu-Palmer 相似度。以下是計算 Wu-Palmer 相似度的 Cypher 程式碼:

MATCH (a:LexicalConcept {uri: $a_id})
MATCH (b:LexicalConcept {uri: $b_id})
MATCH (lcs:LexicalConcept {uri: $lcs_id})
MATCH a_to_lcs = (a)-[:hypernym*0..]->(lcs)
WITH a, b, lcs, length(a_to_lcs) AS a_depth, length((b)-[:hypernym*0..]->(lcs)) AS b_depth
RETURN (2 * length((lcs)-[:hypernym*0..]->(root))) / (a_depth + b_depth) AS wu_palmer_similarity

這段 Cypher 程式碼計算兩個元素之間的 Wu-Palmer 相似度,使用 LCS 的深度和兩個元素的深度。

圖表翻譯:

下圖示範了 Wu-Palmer 距離公式的計算過程:

  graph LR
    A[元素 A] -->| hypernym |->> L[最低共同祖先]
    B[元素 B] -->| hypernym |->> L
    L -->| hypernym |->> R[根節點]
    style L fill:#f9f,stroke:#333,stroke-width:4px

這個圖表顯示了兩個元素(A 和 B)之間的最低共同祖先(LCS),以及 LCS 的深度。

內容解密:

Wu-Palmer 距離公式是一種用於計算語意相似度的方法,結合了兩個元素的深度和其最低共同祖先的深度。這個公式可以用於計算兩個詞彙或概念之間的語意相似度。透過使用 Cypher 實作 LCS 的查詢和距離的計算,我們可以得到兩個元素之間的 Wu-Palmer 相似度。

WordNet 知識圖譜中實體的新增過程

為了在 WordNet 知識圖譜中新增新的實體,需要遵循特定的模式,即「形式(Form)-詞彙條目(Lexical Entry)-詞彙意義(Lexical Sense)-詞彙概念(Lexical Concept)」。這個過程涉及到新增代表詞彙的節點和關係,包括詞彙的形式、詞彙條目、詞彙意義和詞彙概念。

新增詞彙概念(Lexical Concept)

首先,需要建立一個代表詞彙概念的節點。這個節點應該包含詞彙概念的定義、部分語言和示例。例如,對於「專有軟體」(proprietary software)的概念,可以使用以下 Cypher 陳述式:

CREATE (lc:LexicalConcept:Noun {
  partOfSpeech: "Noun",
  definition: "電腦軟體在限制使用、研究或重新分發的許可下發布",
  example: ["我們的組織不允許使用專有軟體"]
})

新增詞彙意義(Lexical Sense)

接下來,需要建立一個代表詞彙意義的節點。這個節點作為詞彙概念和詞彙條目之間的橋梁,對於每個詞彙概念,可以有多個詞彙意義。

CREATE (ls1:LexicalSense)
CREATE (lc)<-[:isLexicalizedSenseOf]-(ls1)

新增詞彙條目(Lexical Entry)

最後,需要建立一個代表詞彙條目的節點,並將其與詞彙意義相關聯。詞彙條目包含了詞彙的標準形式和語言資訊。

CREATE (le1:LexicalEntry:Noun {
  canonicalForm: "proprietary software",
  partOfSpeech: "Noun"
})
CREATE (le1)-[:hasSense]->(ls1)

完整的新增過程

透過上述步驟,可以完成在 WordNet 知識圖譜中新增新的實體的過程。這個過程不僅增加了知識圖譜的豐富度,也為語義相似度的計算提供了基礎。

MATCH (b_to_lcs = (b)-[:hypernym*0..]->(lcs))
WITH a, b, lcs, length(a_to_lcs) AS depth_a,
     length(b_to_lcs) AS depth_b
RETURN (2.0 * $lcs_depth) / (2.0 * $lcs_depth + depth_a + depth_b) AS wp_sim

這段 Cypher 查詢陳述式計算了兩個實體之間的 Wu-Palmer 相似度,利用了知識圖譜中實體之間的超紐關係和深度資訊。

NLTK 中的 Wu-Palmer 相似度計算

在 NLTK 中,可以使用 wn.wup_similarity() 函式直接計算兩個詞彙之間的 Wu-Palmer 相似度。

from nltk.corpus import wordnet as wn

dog = wn.synset('dog.n.01')
lion = wn.synset('lion.n.01')

print(dog.definition())
print(lion.definition())

print(wn.wup_similarity(dog, lion))

這段 Python 程式碼展示瞭如何使用 NLTK 計算「dog」和「lion」兩個詞彙之間的 Wu-Palmer 相似度,並列印預出它們的定義和相似度值。

建立知識圖譜中的詞彙概念

在建立知識圖譜時,需要將詞彙概念(LexicalConcept)與詞彙條目(LexicalEntry)相連,形成一個複雜的網路結構。以下是建立詞彙概念的步驟:

從技術架構視角來看,知識圖譜與自然語言生成的結合,為知識表達和應用開啟了新的篇章。本文深入探討瞭如何利用知識圖譜的結構化資料,透過自然語言生成技術,將知識轉化為更易於理解和使用的自然語言描述。分析了從基本句子結構的生成到實際應用場景的落地,涵蓋了報告生成、對話系統和資料視覺化等多個方面。技術的關鍵挑戰在於如何有效地處理知識圖譜中複雜的關係和多樣化的實體,並生成準確、流暢且符合語境的自然語言文字。對於想要將知識圖譜應用於自然語言處理的開發者,建議深入研究 Cypher 查詢語言以及相關的自然語言生成工具和技術,並關注如何提升生成文字的品質和效率。未來,隨著知識圖譜技術的發展和自然語言生成模型的最佳化,我們預見知識的自動化表達和應用將更加普及,進一步推動人工智慧的發展。玄貓認為,此技術方向兼具學術價值和商業潛力,值得技術社群持續關注和投入。