---
# System prepended metadata

title: 'CharacTER : Translation Edit Rate on Character Level 論文導讀'

---

# CharacTER : Translation Edit Rate on Character Level 論文導讀
### 先備知識
#### 萊文斯坦距離 Levenshtein distance
**萊文斯坦距離**是一種量化兩字串間差異的演算法，代表從一個字串轉換為另一個字串最少需要多少次編輯操作，這種量化字間差異指標的演算法通稱**編輯距離(Edit distance)**。
萊文斯坦距離允許三種編輯方式：插入、刪除、置換
每一種編輯的距離都是1，因此舉例sitting跟kitten：
1. $sitting \rightarrow kitting$ 置換 $s \rightarrow k$ 
2. $kitting \rightarrow kitteng$ 置換 $i \rightarrow e$
3. $kitteng \rightarrow kitten$ 刪除 $g$

因此可知兩字間的編輯距離為 $3$。

Reference: [Wikipedia](https://en.wikipedia.org/wiki/Levenshtein_distance)
#### TER -- Translation Edit Rate
TER是考慮機器翻譯品質的方法，顧名思義，是計算翻譯結果Edit次數來評分翻譯品質，亦即：

$TER = \large{\#\,of\,edit \over average\,\#\,of\,reference\,words}$

- 分子是hypothesis調整至最接近的reference所需要的**編輯次數(cost)**，編輯動作包含：**插入、刪除、替代和字的平移，其中也包含標點符號以及大小寫。**
- 分母則是references的平均長度。

可以看出TER的方法是參考自萊文斯坦距離，但多考慮了字的平移操作。平移**連續**的字，不管平移幾格或總共幾個字的cost都是一樣的，在實作上需要注意的是最佳化字的平移這件事本身是**NP-complete**(Shapira and Storer, 2002)，所以TER在運算最佳化平移次數時是使用Greedy Algorithm 和 Dynamic Programming來近似。

#### TER sample python code:
```python!
CLASStorchmetrics.TranslationEditRate(normalize=False, no_punctuation=False, lowercase=True, asian_support=False, return_sentence_level_score=False, **kwargs)

preds = ['the cat is on the mat']
target = [['there is a cat on the mat', 'a cat is on the mat']]
ter = TranslationEditRate()
ter(preds, target)
#tensor(0.1538)
```
Reference: [A Study of Translation Edit Rate with Targeted Human Annotation](https://www.cs.umd.edu/~snover/pub/amta06/ter_amta.pdf), [TorchMetrics](https://torchmetrics.readthedocs.io/en/stable/text/translation_edit_rate.html)

### Translation Edit Rate on Character Level
廢話不多說，先上公式：
$\small CharacTER = \large{shift\,cost\,+\,edit\,distance \over \#\,characters\,in \,the\,hypothesis\,sentence}$

Translation Edit Rate on Character Level，顧名思義，CharacTER考慮的是字元(Character)層級的TER，但考慮到字母種類(alhpabet)在語言中的是非常有限的(ex:English 26)，因此若做單純的字母TER，字元比起字(words)更容易match，並在平移操作中使字污染而變成無意義的字，除此之外，words層級的TER若找到match的字，會繼續往後遍歷(traverse)直到找到最長的match字串，但字元層級的TER，因為字元彼此match的機率很高，因此會需要重複做traverse，使計算時間大幅度提升。

處理字串比對的演算法Rabin-Karp和KMP分別有average $O(n)$和worst case$O(n)$的Time Complexity，但都需要固定的pattern，因為TER的處理需要不斷更新pattern，因此不管以hash處理字串的Rabin-Karp還是以prefix和postfix處理文字的KMP都沒辦法在TER達成linear time的時間複雜度(應該需要$O(n^2)$)，所以簡單推算，若一個文章中的平均字長是$6$(採用ChrF的假設)，那需要的運算時間將會增加$6^2=36$倍(與文中作者比較TER和Character Error Rate在example sentence的運算時間相差$44$倍相近)。

因此CharacTER決定，先使用TER的**字平移規則**處理hypothesis，再將平移後的hypothesis sequence拆解成character(會考慮字間空格)並計算**萊文斯坦距離**。
這種處理方法僅會使運算時間增加10%。
#### 再來就是重頭戲了，在CharacTER中，兩個字(words)在符合這兩種情況下，會被判斷成匹配(matched)：
- **當兩個字一樣時**
- **當兩個字的編輯距離在一定的Threshold之下時**

例如，establish和established在absolute edit distance=2時會被判斷成匹配。因此，適當設定threshold可以提升CharacTER與人工ranking的correlation。

此外，因為字元level的刪除跟插入的cost增加很快，因此若採用TER對平移的***不管平移幾格或總共幾個字的cost都是一樣*** 的設定，penalty會太低，因此CharacTER採用字串中字的平均字長當作cost。
假設平移字串是: **the day before yesterday**
那平移它所需要的cost就會是 ${3+3+6+9\over4}=5.25$

CharacTER也測試了各種標準化的方法，若採用原本將reference長度作為分母的方式，會使的相同編輯距離的兩個不同長度的翻譯有一樣的TER，再經過比對後，文章發現採用hypotheses的字串長度比reference的字串長度更能反應不同翻譯的差異性和提升correlation，因此CharacTER決定採用hypotheses的字元長度作為分母。

#### 整理以上內容，總結CharacTER的評分方式：
- **使用TER的shift方式先最佳化平移句子，平移時的penalty考慮字串的平均字長**
- **拆解shift後的sequence並使用萊文斯坦距離計算編輯距離**
- **設定以編輯距離為Threshold作為判斷字異同的標準，文章實驗以WMT13/14作為資料時，Threshold設定為absolute edit distance=1有最好的correlation**
- **Normalization考慮評分需能反應不同翻譯句子長度，因此採用hypotheses的字元長度作為分母**

Reference: [Translation Edit Rate on Character Level](https://aclanthology.org/W16-2342.pdf), [CharacTER-Github](https://github.com/rwth-i6/CharacTER)
