語義距離

**語義距離**（）係自然語言處理（NLP）上成日用嘅一個概念，指兩隻字（或者第啲語言單位）之間喺意思上爭幾遠。舉個簡化嘅例子，**[[狼]]**同**[[狗]]**呢兩隻字嘅語義距離好近－兩隻字都係分別表示緊某種動物，而且兩隻字所表示嘅動物好相似；相比之下，**狼**同**[[雲]]**呢兩隻字嘅語義距離就遠，因為兩隻字表示嘅事物冇乜直接嘅啦掕。

喺實際 NLP 上，「語義距離要點量度」係一條相當受爭義嘅問題：喺最簡單嗰種情況下，語義距離可以用「兩隻字喺語義網絡入面最短要通過幾多條邊，先可以將佢哋連埋一齊」嚟量度－理論上，要過嘅邊數量愈少，兩隻字嘅語義距離就算愈短；實際計數嗰陣，研究者可以攞 WordNet 等現成嘅語義網絡－呢啲網絡會紀錄嗮隻語言入面啲字之間嘅關係，然後攞要計嗰兩隻字 1 同 2，睇吓字 1 同字 2 之間「隔咗幾多隻字」，就得出一個語義距離估計值。專業 NLP 上仲有更加進階複雜嘅方法計語義距離。

响廿一世紀初嘅 NLP 同相關應用上，語義距離相當有用，可以攞嚟做詞義消歧（教電腦撞到歧義情況嗰陣，同每隻有歧義嘅字搵出佢嘅意思）嘅工作，而且仲有認知心理學工作者提倡可以運用語義距離嘅概念嚟衡量文字作品「幾有創意」。
## 理論基礎

語義距離建基於一個簡單嘅事實：語言同文字係攞嚟表達意思嘅，每隻字都梗會有某啲意思；呢個諗頭又帶起咗語義網絡嘅概念－一個基本嘅語義網絡會有
#若干個節點，每個節點代表一個概念，
#節點之間會有一啲**連繫**，兩個概念之間嘅連繫表達佢哋之間嘅關係。
舉例說明，想像文頭嗰個語義網絡，圖入面有哺乳類、貓同埋毛皮等嘅節點，每個節點都代表咗個概念，幅圖仲有一條條嘅連繫（啲箭咀）喺節點之間，表示啲概念之間嘅關係－由貓指去哺乳類條箭咀表示「貓**係一種**哺乳類」，而由貓指去毛皮條箭咀表示「貓**有**毛皮」... 呀噉。

語義網絡等嘅概念，就自然帶起咗語義距離嘅諗法：直覺上認為，字詞同字詞之間可以意思上相近，例如**[[蜜蜂]]**同**[[蝴蝶]]**都係指緊某啲昆蟲，所以喺意思上相對近，而**蜜蜂**同**[[雕像]]**（後者指緊一種死物）就俾人感覺係意思上相距遠；有人仲主張「字詞同字詞之間喺意思上爭幾遠」可以用客觀嘅方法量度，簡單嘅有「數吓嗰兩隻字詞喺個語義網絡入面相距幾多條連繫」－呢啲噉嘅量度就可以得出語義距離嘅估計值。

要留意嘅係，啲人傾語義距離相關嘅嘢嗰陣，好多時會用**語義相似度**或者**語義相關度**呢類詞彙。語義相似度係語義距離嘅相反，不過兩隻詞彙都係描述緊同一個諗頭：如果兩隻字之間喺語義上相似，佢哋之間就算係語義距離短、語義相似度高；而如果兩隻字之間喺語義上唔相似，噉佢哋之間就算係語義距離長、語義相似度低。

## 基本計法

計語義距離嘅過程，涉及咗噉嘅運算：
*Input：要比較嘅字符或者句子；
*Output：一個個數值表示語義距離嘅估計值；
呢個過程會用到以下呢啲數學概念。要留意嘅係，同一嚿 input，唔同計法出嘅數值可以好唔同，分析者會睇情況決定用邊種計法。

### 雅卡德指數

雅卡德指數係統計學成日用嘅一種數值，可以攞嚟評估兩個集有幾接近。想像家陣有兩個集 A 同 B，佢哋之間有個交集（A \cap B；指兩個集都有嘅嘢）；噉兩個集之間嘅雅卡德指數 J(A,B) 可以用以下條式計：
:J(A,B) =  = 

J(A,B) 數值愈大，就愈表示兩個集相似。上述噉嘅思考方式可以用落句子度－想像而家 A 同 B 係以下呢兩句句子：
#「個樽係空嘅。」
#「個樽入面乜都冇。」
用最簡單嗰種方法諗嘅話：呢兩句嘢入面都有**個**同**樽**呢兩隻字，呢兩隻字就係 A \cap B（A \cap B = 2），淨低嗰八隻字唔喺 A \cap B 入面（A \cup B = 2 + 8），所以噉計嘅話，兩句句子之間嘅雅卡德語義距離就係
:J(A,B) = {2 \over 10} = 0.2
雅卡德指數有個好處係唔受重複咗嘅字影響，例如上面句子 1 就算加多個「空」字落去，雅卡德語義距離數值都唔會變。而喺實際嘅 NLP 應用上，雅卡德指數最大嘅弱點係淨係可以攞嚟量度句子或者段落之間嘅相似度，冇得攞嚟比較字同字之間嘅相似度。

### 歐幾里得距離

首先，思考字嵌入嘅概念：家陣攞若干隻字俾部電腦分析，段嘢入面每隻字都可以有件字嵌入；每件字嵌入係個以實數表示嘅 n 維向量，啲實數會表示隻字嘅意思，所以啲數值相近嘅字嵌入會係表示緊意思上相近嘅字。

舉個實質啲嘅例子，想像每隻字嘅字嵌入有 30 個實數（n = 30 ），當中第一個實數表示嗰隻字同「貓科」有幾強嘅語義關聯，第二個實數表示嗰隻字同「人類」有幾強嘅語義關聯，第三個實數表示嗰隻字同「昆蟲」有幾強嘅語義關聯... 等等，數值愈正就表示語義關聯愈勁，即係
*`Cat`（**[[貓]]**）呢隻字嘅字嵌入係 `[0.9, 0.1, -0.8...]`；
*`Tiger`（**[[老虎]]**）呢隻字嘅字嵌入係 `[0.7, -0.6, -0.75...]`；
*`Nebula`（**[[星雲]]**）呢隻字嘅字嵌入係 `[-0.9, -0.95, -0.95...]`；
姑且唔好諗「點樣知一隻字嘅字嵌入數值係乜」嘅問題住。假想而家每隻字都有咗件字嵌入，一件字嵌入係個向量，所以可以當做空間入面嘅一點噉嚟睇－好似附圖噉；當咗兩隻字係空間入面嘅兩點，分析者就有得計兩點之間嘅歐幾里得距離，得出個數值嚟反映「嗰兩隻字喺意思上爭幾遠」，例如 Python 就有陳述式可以一嘢俾出兩點之間嘅歐幾里得距離：

```python
# ...
# 假設 embeddings[0] = cat 嘅 embedding，embeddings[1] = tiger 嘅 embedding
  距離 = euclidean_distance(embeddings[0], embeddings[1]) # 距離嘅數值設做嗰兩個 embedding 之間嘅歐幾里得距離。
```


### 餘弦相似度

餘弦相似度可以攞嚟量度兩列數之間有幾相似。計餘弦相似度嗰陣，條式會攞兩個向量做 input，而 output 就會俾個數 \theta 出嚟，\theta 嘅值反映兩個向量之間「個角度有幾大」，\theta 數值愈細就表示兩個向量愈相似。

設 \mathbf{A} 同 \mathbf{B} 做要分析嗰兩個向量，而 A_i 同 B_i 係 \mathbf{A} 同 \mathbf{B} 嘅組成部份，噉餘弦相似度可以用噉嘅式計：
:\text{cosine soeng ci dou} =S_C (A,B):= \cos(\theta) = {\mathbf{A} \cdot \mathbf{B} \over \|\mathbf{A}\| \|\mathbf{B}\|} = \frac{ \sum\limits_{i=1}^{n}{A_i  B_i} }{ \sqrt{\sum\limits_{i=1}^{n}{A_i^2}}  \sqrt{\sum\limits_{i=1}^{n}{B_i^2}} }
呢條式會出嘅 output 可能數值最低係 -1 最高係 1，數值愈高就表示兩個向量愈相似。如果上面條式嗰兩個向量係兩隻字嘅字嵌入，餘弦相似度就可以計到兩隻字喺語義上爭幾遠。

## 睇埋
*潛在語義分析
*網絡科學
*相似度學習
*語料庫
*Word2vec
*Tf-idf
*BLEU

## 文獻

*Dumais, S (2003). "Data-driven approaches to information access". *Cognitive Science*. 27 (3): 491-524. doi:10.1207/s15516709cog2703_7.
*Lee, M. D., Pincombe, B., & Welsh, M. (2005). An empirical evaluation of models of text document similarity (PDF). In B. G. Bara & L. Barsalou & M. Bucciarelli (Eds.), *27th Annual Meeting of the Cognitive Science Society, CogSci2005* (pp. 1254-1259). Austin, Tx: The Cognitive Science Society, Inc.
*Landauer, T. K., & Dumais, S. T. (1997). A solution to Plato's problem: The latent semantic analysis theory of acquisition, induction, and representation of knowledge. *Psychological review*, 104(2), 211.
*Olson, J. A., Nahas, J., Chmoulevitch, D., Cropper, S. J., & Webb, M. E. (2021). Naming unrelated words predicts creativity. *Proceedings of the National Academy of Sciences*, 118(25)，有認知心理學家指出，語義距離嘅概念可以攞嚟量度創意－創意定義上就係指個人能夠諗啲同主流見解唔同嘅諗頭，所以愈有創意嘅人理應會愈能夠（例如）寫出啲同主流意見語義距離遠嘅字句，又或者因為能夠諗出好多唔同嘅諗頭，而能夠做到自己寫嘅唔同文字之間語義距離遠。

## 註釋

## 來源
篇文用咗嘅行話，英文名如下：

篇文引用咗以下呢啲文獻同網頁：

## 拎
* Text Similarity Measures Live Demo.
* How to Rank Text Content by Semantic Similarity. *Towards Data Science*.
* Ultimate Guide To Text Similarity With Python. *NewsCatcher*.