Ruben Tsui commited on
Commit ·
c278a4b
1
Parent(s): 7476873
Fix mangled markdown grid tables
Browse files- fix_other_tables.py +96 -0
- fix_table.py +61 -0
- src/index.qmd +51 -147
- src/media/messed_up_regex_summary_table.png +3 -0
fix_other_tables.py
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import re
|
| 2 |
+
|
| 3 |
+
file_path = 'src/index.qmd'
|
| 4 |
+
|
| 5 |
+
with open(file_path, 'r', encoding='utf-8') as f:
|
| 6 |
+
text = f.read()
|
| 7 |
+
|
| 8 |
+
replacements = {
|
| 9 |
+
# Table 1: Opus
|
| 10 |
+
"""+-----------------------------------------------------------------------+
|
| 11 |
+
| Opus Corpus 首頁 |
|
| 12 |
+
| |
|
| 13 |
+
|  |
|
| 14 |
+
+=======================================================================+
|
| 15 |
+
+-----------------------------------------------------------------------+""":
|
| 16 |
+
"""::: {.callout-note appearance="minimal"}
|
| 17 |
+
Opus Corpus 首頁
|
| 18 |
+
|
| 19 |
+

|
| 20 |
+
:::""",
|
| 21 |
+
|
| 22 |
+
# Table 2: Alice
|
| 23 |
+
"""+-----------------------------------------------------------------------+
|
| 24 |
+
|  |
|
| 25 |
+
| |
|
| 26 |
+
| 輸入 down the rabbit 可以搜尋到2筆:目錄及第一章的標題。 |
|
| 27 |
+
| |
|
| 28 |
+
|  |
|
| 29 |
+
+=======================================================================+
|
| 30 |
+
+-----------------------------------------------------------------------+""":
|
| 31 |
+
"""::: {.callout-note appearance="minimal"}
|
| 32 |
+

|
| 33 |
+
|
| 34 |
+
輸入 down the rabbit 可以搜尋到2筆:目錄及第一章的標題。
|
| 35 |
+
|
| 36 |
+

|
| 37 |
+
:::""",
|
| 38 |
+
|
| 39 |
+
# Table 3: Zed
|
| 40 |
+
""" -----------------------------------------------------------------------  -----------------------------------------------------------------------
|
| 41 |
+
|
| 42 |
+
-----------------------------------------------------------------------""":
|
| 43 |
+
"",
|
| 44 |
+
|
| 45 |
+
# Table 4: Li Qingzhao
|
| 46 |
+
""" -----------------------------------------------------------------------  -----------------------------------------------------------------------
|
| 47 |
+
|
| 48 |
+
-----------------------------------------------------------------------""":
|
| 49 |
+
"",
|
| 50 |
+
|
| 51 |
+
# Table 5: Regex search image
|
| 52 |
+
"""+-----------------------------------------------------------------------+
|
| 53 |
+
| 在搜尋方塊輸入:`\d+`(\\.`\d+`)?\\s?(km\|GB\|%) |
|
| 54 |
+
| |
|
| 55 |
+
| {width="5.854166666666667in" |
|
| 56 |
+
| height="2.736111111111111in"} |
|
| 57 |
+
+=======================================================================+
|
| 58 |
+
+-----------------------------------------------------------------------+""":
|
| 59 |
+
"""::: {.callout-note appearance="minimal"}
|
| 60 |
+
在搜尋方塊輸入:`\d+(\.\d+)?\s?(km|GB|%)`
|
| 61 |
+
|
| 62 |
+
{width="5.854166666666667in" height="2.736111111111111in"}
|
| 63 |
+
:::""",
|
| 64 |
+
|
| 65 |
+
# Table 6: Regex explanation
|
| 66 |
+
"""+--------------+-------------------------------------------------------+
|
| 67 |
+
| `\d` | 數字(1或多個;代表整 |
|
| 68 |
+
| +(\\.`\d+`)?\ | 數部分),後面有「可有可無」的小數點及1或多個數字」\ |
|
| 69 |
+
| \\s?\ | 空格「可有可無」\ |
|
| 70 |
+
| (km\|GB\|%) | 3選1: km 或 GB 或 % |
|
| 71 |
+
| | |
|
| 72 |
+
| 解釋以上要出 | |
|
| 73 |
+
| 現在同一行: | |
|
| 74 |
+
| 分 3 rows | |
|
| 75 |
+
+==============+=======================================================+
|
| 76 |
+
+--------------+-------------------------------------------------------+""":
|
| 77 |
+
"""
|
| 78 |
+
| Regex 部分 | 解釋 |
|
| 79 |
+
| :--- | :--- |
|
| 80 |
+
| `\d+` | 數字(1或多個;代表整數部分) |
|
| 81 |
+
| `(\.\d+)?` | 後面有「可有可無」的小數點及1或多個數字 |
|
| 82 |
+
| `\s?` | 空格「可有可無」 |
|
| 83 |
+
| `(km|GB|%)` | 3選1:km 或 GB 或 % |
|
| 84 |
+
|
| 85 |
+
""",
|
| 86 |
+
|
| 87 |
+
# Table 7: Throw under the bus image
|
| 88 |
+
""" ----------------------------------------------------------------------- {width="5.854166666666667in" height="2.2916666666666665in"} -----------------------------------------------------------------------""":
|
| 89 |
+
"{width=\"5.854166666666667in\" height=\"2.2916666666666665in\"}"
|
| 90 |
+
}
|
| 91 |
+
|
| 92 |
+
for old, new in replacements.items():
|
| 93 |
+
text = text.replace(old, new)
|
| 94 |
+
|
| 95 |
+
with open(file_path, 'w', encoding='utf-8') as f:
|
| 96 |
+
f.write(text)
|
fix_table.py
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import re
|
| 2 |
+
|
| 3 |
+
file_path = 'src/index.qmd'
|
| 4 |
+
|
| 5 |
+
with open(file_path, 'r', encoding='utf-8') as f:
|
| 6 |
+
text = f.read()
|
| 7 |
+
|
| 8 |
+
# We need to find the section between "## 正規表示式摘要\n\n" and "\n\n例如,若欲找出文件中"
|
| 9 |
+
start_marker = "## 正規表示式摘要"
|
| 10 |
+
end_marker = "例如,若欲找出文件中"
|
| 11 |
+
|
| 12 |
+
start_idx = text.find(start_marker)
|
| 13 |
+
end_idx = text.find(end_marker)
|
| 14 |
+
|
| 15 |
+
if start_idx != -1 and end_idx != -1:
|
| 16 |
+
before = text[:start_idx + len(start_marker)]
|
| 17 |
+
after = text[end_idx:]
|
| 18 |
+
|
| 19 |
+
clean_table = """
|
| 20 |
+
|
| 21 |
+
| 字元 | 意義 / 用法 | 備註 |
|
| 22 |
+
| :--- | :--- | :--- |
|
| 23 |
+
| **字面意義的字元**<br>(literal characters) | 例如:`a` `b` `1` `2` `_` `"` `<` `>` | |
|
| 24 |
+
| **特殊字元**<br>**metacharacters** | | |
|
| 25 |
+
| `\\t` | **t**ab(定位字元) | |
|
| 26 |
+
| `\\n` | **n**ewline(換行字元);<br>Windows:`\\r\\n`(CR LF)<br>UNIX/Linux/macOS:`\\n`(LF) | |
|
| 27 |
+
| `\\s` | white **s**pace(空白字元) | 包含空格(space)及 tab 等 |
|
| 28 |
+
| `.`(*句點*) | 比對任意字元(`\\n` 除外) | |
|
| 29 |
+
| **元字元**<br>(必須以 `\\` 跳脫才能進行文字比對) | | |
|
| 30 |
+
| `\\` | 跳脫 (escape) 字元 | |
|
| 31 |
+
| `|` | 替代(或) | |
|
| 32 |
+
| `()` | 群組;`(?:)` 為非擷取群組 | |
|
| 33 |
+
| `[]` | 字元類別;恰好比對一個字元 | 範例:比對任一英文母音字母 `[aeiou]` |
|
| 34 |
+
| `{}` `*` `?` `+` | 量詞 | |
|
| 35 |
+
| `^` `$` | 錨點(零寬度) | |
|
| 36 |
+
| `?` | (1) 作為量詞時,作用於緊鄰其左方的一個字元、字元類別或群組;<br>(2) 作為非貪婪 non-greedy 或懶惰 lazy 指定符 | |
|
| 37 |
+
| **錨點 anchor**<br>(零寬度:僅比對位置,不比對字元) | | |
|
| 38 |
+
| `\\b` | 詞邊界 | 範例:空白字元(或標點符號)與文字字元之間的位置 |
|
| 39 |
+
| `^` | 脫字符號:字串開頭 | |
|
| 40 |
+
| `$` | 錢字符號:字串結尾 | |
|
| 41 |
+
| **量詞 quantifier**<br>(作用於緊鄰其左方的一個字元、字元類別或群組) | | |
|
| 42 |
+
| `*` | 零次或多次 | |
|
| 43 |
+
| `+` | 一次或多次 | 亦即「至少出現一次」 |
|
| 44 |
+
| `?` | 零次或一次 | 亦即「可有可無」 |
|
| 45 |
+
| `{n}` | 恰好 *n* 次 | |
|
| 46 |
+
| `{n,m}` | 至少 *n* 次,至多 *m* 次 | |
|
| 47 |
+
| `{n,}` | 至少 *n* 次,無上限 | |
|
| 48 |
+
| **字元類別** | 以 `[]` 括起的字元 ── 恰好比對一個字元 | |
|
| 49 |
+
| **範圍** | `[a-z]` 比對任一英文小寫字母;<br>`\\p{Han}`(最完整的寫法)或 `[一-龥]` 或 `[\\u4E00-\\u9FFF]` 或 `[\\x{4E00}-\\x{9FFF}]`,共 20,992 個基本中文字元 | 起始字元的 Unicode 碼位必須較小;中日韓統一表意文字(CJK Unified Ideographs)涵蓋最常見的 CJK 字元;Zed 及 Calibre ebook-viewer 皆可接受;CudaText 使用最後一種格式處理一般 Unicode 範圍 |
|
| 50 |
+
| **快捷寫法** | `^` 在 `[]` 中表示該類別的「相反」(也就是所有此類別以外的字元) | 範例:比對*任何*非英文母音的字元 `[^aeiou]` |
|
| 51 |
+
| `\\d` | 數字,等同於 `[0-9]` | |
|
| 52 |
+
| `\\w` | 「文字」字元;`\\d` 加上 `[a-zA-Z]` 加上 `_`(底線字元;underscore),對於非英文字母書寫的語言可能還包含更多字元 | `\\w` 的定義取決於特定的正規表示式引擎;部分引擎會納入中日韓字元及含附加符號的字元(如 é、ç、ü);其他引擎則不會。 |
|
| 53 |
+
| `\\D` `\\S` `\\W`<br>`\\P{Han}`<br>(相反集合) | 代表對應小寫字元類別之**否定**的字元類別 | `\\D`、`\\S`、`\\W`、`\\P{Han}` 分別為非數字、非空白、非文字及非中日韓字元 |
|
| 54 |
+
|
| 55 |
+
"""
|
| 56 |
+
|
| 57 |
+
with open(file_path, 'w', encoding='utf-8') as f:
|
| 58 |
+
f.write(before + clean_table + after)
|
| 59 |
+
print("Table 1 fixed.")
|
| 60 |
+
else:
|
| 61 |
+
print("Markers not found.")
|
src/index.qmd
CHANGED
|
@@ -21,12 +21,11 @@ title: "第三章 從使用工具到建立資源:語料、檢索與雙語平
|
|
| 21 |
|
| 22 |
在公開的平行語料資源中,OPUS 是很值得譯者認識的一個入口。OPUS 網站(Open Parallel Corpora, 公開平行語料庫,網址:https://opus.nlpl.eu)長年彙整各種可公開取得的平行語料與多語資料。截至 2026 年初,其官方首頁顯示已收錄超過一千個語料集、超過一千種語言,以及上千億級的句對。雖然這個數量本身不代表品質一定好,但至少說明了一件事:譯者若學會搜尋與篩選,其實可以接觸到遠比過去多的雙語材料,有助於擴大其翻譯的視野與能力。
|
| 23 |
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
|
| 27 |
-
|
| 28 |
-
|
| 29 |
-
+-----------------------------------------------------------------------+
|
| 30 |
|
| 31 |
OPUS 的優點,不只是量大,也在於來源多樣。其收錄的語料包含字幕、技術文件、開源軟體在地化資料、政府與國際組織文件、新聞評論、教育內容等。這代表譯者不必只停留在「有沒有例句」的層次,而是可以進一步問:「這些例句來自哪種文本?」「是否符合我的領域需求?」「是否接近我要交付的文體?」例如在翻譯口語對話、影視字幕或遊戲文本時,字幕型語料可能比法律文件更有參考價值;反之,若在翻譯技術說明、使用者介面或開發者文件,像 Mozilla、MDN Web Docs 這類來源就可能比電影字幕有用。
|
| 32 |
|
|
@@ -52,7 +51,7 @@ OPUS 的優點,不只是量大,也在於來源多樣。其收錄的語料包
|
|
| 52 |
|
| 53 |
對照查詢的核心價值,在於能把「語言單位」放回「語言環境」。譯者很少只翻一個詞,而是翻一個出現在特定句型中的詞。例如 account 不一定都是「帳號」;在會計文本裡可能是「帳戶」,在敘事語境裡可能是「敘述」、「說法」。若只查閱字典,很容易被高頻義項誤導;若觀察 concordance line,便能了解這個詞與哪些動詞、介系詞、修飾語反覆出現,進一步判斷這個詞在目前文本中的功能。
|
| 54 |
|
| 55 |
-
這種檢索能力,不必依賴昂貴平台才能做到。傳統的「對照檢索軟體」(concordancer[^1])可以勝任,很多日常工具也可以部分完成同樣的工作。以 Calibre 的 ebook-viewer 為例,這套工具原本是電子書閱讀器,卻很適合被譯者挪用為中小型語料檢索介面。官方文件指出,ebook-viewer 不只支援一般搜尋,也支援 whole words、nearby words 與 regex搜尋模式,並提供 Reference mode 方便定位段落,以及 highlight 與 annotation 功能協助做人工標記。若將整理好的雙語文件或單語參考資料做成
|
| 56 |
|
| 57 |
Calibre **Regex 工具使用方式**
|
| 58 |
|
|
@@ -71,14 +70,13 @@ Calibre 為一開源 (open source)電子書及文件格式轉換軟體,內
|
|
| 71 |
|
| 72 |
Ctrl-F (Windows) 或 ⌘F (macOS)可進入搜尋。搜尋方塊下方的下拉式選單中可點選以 regex 搜尋。
|
| 73 |
|
| 74 |
-
|
| 75 |
-
|
| 76 |
-
|
| 77 |
-
|
| 78 |
-
|
| 79 |
-
|
| 80 |
-
|
| 81 |
-
+-----------------------------------------------------------------------+
|
| 82 |
|
| 83 |
同樣地,許多支援正規表示式搜尋的文字編輯器,也能扮��輕量 concordancer的角色。例如 VS Code、CudaText、Zed、Sublime Text等,都可以對單檔或整個資料夾做全文檢索。對譯者來說,這很有用,因為實務上的目的並非進行大型語言研究,而是要在一批已知資料裡快速找到某種形式的句子、標記或對應模式。若資料來自一套雙語網站、一批舊譯稿或特定客戶過去的中英對照文件,那麼文字編輯器加上 regex,通常便足以解決多數問題。
|
| 84 |
|
|
@@ -86,17 +84,13 @@ Regex 工具 (2):Zed (開源文字編輯軟體;下載網址:[[https://zed.
|
|
| 86 |
|
| 87 |
安裝完成後可以編輯純文字檔案 (.txt)。按下 Ctrl-F (Windows) 或 ⌘F (macOS) 顯示搜尋方塊,再按下 **.\*** 圖示進入 regex 搜尋模式。
|
| 88 |
|
| 89 |
-
|
| 90 |
-
|
| 91 |
-
-----------------------------------------------------------------------
|
| 92 |
|
| 93 |
關鍵詞檢索、對照查詢與 regex 的關係可以如此理解:關鍵詞搜尋是找字串,concordancing 是看上下文,而regex 係將搜尋條件表達得更精準。當檢索需求從「找這個詞」變成「找所有帶有百分比與括號的句子」、「找所有未翻譯的英文字串」、「找所有第 X 條、第 X 項」,甚至是如「戚戚然」、「營營役役」的疊詞時,regex 就會變得非常有用。
|
| 94 |
|
| 95 |
-
下載《李清照集》([[https://www.degruyterbrill.com/document/doi/10.1515/9781501504518/html]{.underline}](https://www.degruyterbrill.com/document/doi/10.1515/9781501504518/html))英譯
|
| 96 |
|
| 97 |
-
|
| 98 |
-
|
| 99 |
-
-----------------------------------------------------------------------
|
| 100 |
|
| 101 |
正規表示式本質上是一種在文本中尋找特定文字出現形式、次序或規律(pattern)的語言。正規表示式通常不是在找某一個固定詞(不過一定要如此也可以),而是在描述一類字串長什麼樣子。舉例來說,若欲尋找所有阿拉伯數字,可以用`\d+`;若欲尋找小數,可以用 `\d+`(?:\\.`\d+`)?;若欲尋找百分比,可以在後面再接 %。這種寫法看起來像程式語言,但其實只要抓住幾個核心符號,譯者就已經能處理很多工作。
|
| 102 |
|
|
@@ -104,129 +98,39 @@ Regex 工具 (2):Zed (開源文字編輯軟體;下載網址:[[https://zed.
|
|
| 104 |
|
| 105 |
## 正規表示式摘要
|
| 106 |
|
| 107 |
-
|
| 108 |
-
|
|
| 109 |
-
|
| 110 |
-
| **字
|
| 111 |
-
|
|
| 112 |
-
|
|
| 113 |
-
|
|
| 114 |
-
|
|
| 115 |
-
|
| 116 |
-
|
|
| 117 |
-
|
|
| 118 |
-
|
|
| 119 |
-
|
| 120 |
-
| `
|
| 121 |
-
|
| 122 |
-
| `
|
| 123 |
-
|
|
| 124 |
-
|
| 125 |
-
|
|
| 126 |
-
|
| 127 |
-
|
|
| 128 |
-
|
|
| 129 |
-
+
|
| 130 |
-
|
|
| 131 |
-
|
| 132 |
-
| **
|
| 133 |
-
|
|
| 134 |
-
| `
|
| 135 |
-
|
|
| 136 |
-
|
|
| 137 |
-
|
| 138 |
-
| `\`
|
| 139 |
-
|
| 140 |
-
| `|` | 替代(或) | |
|
| 141 |
-
+-----------------+-----------------------------+---------------------+
|
| 142 |
-
| `()` | 群組;(?:) 為非擷取群組 | |
|
| 143 |
-
+-----------------+-----------------------------+---------------------+
|
| 144 |
-
| `[]` | 字元類別;恰好比對一個字元 | 範例:比對任一英 |
|
| 145 |
-
| | | 文母音字母\[aeiou\] |
|
| 146 |
-
+-----------------+-----------------------------+---------------------+
|
| 147 |
-
| `{}` `*` `?` `+` | 量詞 | |
|
| 148 |
-
+-----------------+-----------------------------+---------------------+
|
| 149 |
-
| `^` `$` | 錨點(零寬度) | |
|
| 150 |
-
+-----------------+-----------------------------+---------------------+
|
| 151 |
-
| ? | \(1\) | |
|
| 152 |
-
| | 作為 | |
|
| 153 |
-
| | 量詞時,作用於緊鄰其左方的 | |
|
| 154 |
-
| | 一個字元、字元類別或群組; | |
|
| 155 |
-
| | | |
|
| 156 |
-
| | \(2\) 作為非貪婪 non-greedy | |
|
| 157 |
-
| | 或懶惰 lazy 指定符 | |
|
| 158 |
-
+-----------------+-----------------------------+---------------------+
|
| 159 |
-
| **錨點 | | |
|
| 160 |
-
| anchor**(零寬 | | |
|
| 161 |
-
| 度:僅比對位置 | | |
|
| 162 |
-
| ,不比對字元) | | |
|
| 163 |
-
+-----------------+-----------------------------+---------------------+
|
| 164 |
-
| `\b` | 詞邊界 | 範例:空白字 |
|
| 165 |
-
| | | 元(或標點符號)與 |
|
| 166 |
-
| | | 文字字元之間的位置 |
|
| 167 |
-
+-----------------+-----------------------------+---------------------+
|
| 168 |
-
| `^` | 脫字符號:字串開頭 | |
|
| 169 |
-
+-----------------+-----------------------------+---------------------+
|
| 170 |
-
| `$` | 錢字符號:字串結尾 | |
|
| 171 |
-
+-----------------+-----------------------------+---------------------+
|
| 172 |
-
| **量詞 | | |
|
| 173 |
-
| q | | |
|
| 174 |
-
| uantifier**(作 | | |
|
| 175 |
-
| 用於緊鄰其左方 | | |
|
| 176 |
-
| 的一個字元、字 | | |
|
| 177 |
-
| 元類別或群組) | | |
|
| 178 |
-
+-----------------+-----------------------------+---------------------+
|
| 179 |
-
| `*` | 零次或多次 | |
|
| 180 |
-
+-----------------+-----------------------------+---------------------+
|
| 181 |
-
| `+` | 一次或多次 | 亦 |
|
| 182 |
-
| | | 即「至少出現一次」 |
|
| 183 |
-
+-----------------+-----------------------------+---------------------+
|
| 184 |
-
| ? | 零次或一次 | 亦即「可有可無」 |
|
| 185 |
-
+-----------------+-----------------------------+---------------------+
|
| 186 |
-
| {*n*} | 恰好 *n* 次 | |
|
| 187 |
-
+-----------------+-----------------------------+---------------------+
|
| 188 |
-
| {*n*,*m*} | 至少 *n* 次,至多 *m* 次 | |
|
| 189 |
-
+-----------------+-----------------------------+---------------------+
|
| 190 |
-
| {*n*,} | 至少 *n* 次,無上限 | |
|
| 191 |
-
+-----------------+-----------------------------+---------------------+
|
| 192 |
-
| **字元類別** | 以 \[\] 括起的字元 ── | |
|
| 193 |
-
| | 恰好比對一個字元 | |
|
| 194 |
-
+-----------------+-----------------------------+---------------------+
|
| 195 |
-
| **範圍** | \[a-z\] | 起始字元的 Unicode |
|
| 196 |
-
| | 比對任一英文小寫字母; | 碼位必須較小;中日 |
|
| 197 |
-
| | | 韓統一表意文字(CJK |
|
| 198 |
-
| | `\p{Han}`(最完整的寫法)或 | Unified |
|
| 199 |
-
| | `[一-龥]` 或 | Ideog |
|
| 200 |
-
| | \[\\u4E00-\\u9FFF\] 或 | raphs)涵蓋最常見的 |
|
| 201 |
-
| | \[\\x{4E00}-\\x{9FFF}\],共 | CJK 字元;Zed 及 |
|
| 202 |
-
| | 20,992 個基本中文字元 | Calibre |
|
| 203 |
-
| | | ebook-viewer |
|
| 204 |
-
| | | 皆可接受;CudaText |
|
| 205 |
-
| | | 使用最 |
|
| 206 |
-
| | | 後一種格式處理一般 |
|
| 207 |
-
| | | Unicode 範圍 |
|
| 208 |
-
+-----------------+-----------------------------+---------------------+
|
| 209 |
-
| **快捷寫法** | \^ 在 \[\] | 範例:比對*任 |
|
| 210 |
-
| | 中表示該類別的「相反」(也 | 何*非英文母音的字元 |
|
| 211 |
-
| | 就是所有此類別以外的字元) | `[^aeiou]` |
|
| 212 |
-
+-----------------+-----------------------------+---------------------+
|
| 213 |
-
| `\d` | 數字,等同於 \[0-9\] | |
|
| 214 |
-
+-----------------+-----------------------------+---------------------+
|
| 215 |
-
| `\w` | 「文字」字元;`\d` 加上 | `\w` |
|
| 216 |
-
| | \[a-zA-Z\] 加上 | 的定義取 |
|
| 217 |
-
| | \_(底線字元;und | 決於特定的正規表示 |
|
| 218 |
-
| | erscore),對於非英文字母書 | 式引擎;部分引擎會 |
|
| 219 |
-
| | 寫的語言可能還包含更多字元 | 納入中日韓字元及含 |
|
| 220 |
-
| | | 附加符號的字元(如 |
|
| 221 |
-
| | | é、ç、ü) |
|
| 222 |
-
| | | ;其他引擎則不會。 |
|
| 223 |
-
+-----------------+-----------------------------+---------------------+
|
| 224 |
-
| \\D \\S \\W | 代表對應小寫字 | \\D、 |
|
| 225 |
-
| \\P{Han}\ | 元類別之**否定**的字元類別 | \\S、\\W、\\P{Han} |
|
| 226 |
-
| (相反集合) | | 分別為 |
|
| 227 |
-
| | | 非數字、非空白、非 |
|
| 228 |
-
| | | 文字及非中日韓字元 |
|
| 229 |
-
+-----------------+-----------------------------+---------------------+
|
| 230 |
|
| 231 |
例如,若欲找出文件中所有可能的變數或 placeholder,可以用\\{\[\^}\]+\\} 或 \\{\\{\[\^}\]+\\}\\}之類的模式。若欲找出所有數值加單位的表達,例如 5 km、3.5 GB、20%,可以寫成`\d+`(\\.`\d+`)?\\s?(km\|GB\|%)。若欲擷取英文術語後面緊接中文括號說明的寫法,例如Application Programming Interface(API) 或workspace(工作區),可以針對英文字串與全形括號組合設計模式。這些檢索方式之所以有用,是因為這些模式不是把文字當作一串字,而是把文字當成一種可辨識的形式。
|
| 232 |
|
|
@@ -287,7 +191,7 @@ Regex 工具 (2):Zed (開源文字編輯軟體;下載網址:[[https://zed.
|
|
| 287 |
|
| 288 |
... **throwing** *you* under the bus.\ ... **throw** *me* under the bus!\ I **threw** *four people* under the bus for \$35,000, ... 等等
|
| 289 |
|
| 290 |
-
|
| 291 |
|
| 292 |
-----------------------------------------------------------------------
|
| 293 |
|
|
@@ -435,7 +339,7 @@ Regex 工具 (2):Zed (開源文字編輯軟體;下載網址:[[https://zed.
|
|
| 435 |
|
| 436 |
自建資源若要變成長期資產,還需要定期除污。所謂除污,包括刪除版本過時內容、移除低品質OCR 句對、合併重複資料、標記已棄用用詞、區分不同客戶或品牌的 style guide,並避免把明顯不該重用的材料一路保留。例如短期促銷文案、活動slogan、一次性公告、錯誤頁訊息的舊版本,都可能在某個時點失去重用價值。若不定期整理,資料庫只會越來越大,卻越來越不可信。
|
| 437 |
|
| 438 |
-
在這裡,Excel、TMX與其他格式之間其實不是互斥關係,而是不同層次的配合。很多譯者可以先用Excel 做整理與人工作業,等品質穩定後再匯出成 TMX 匯入CAT;同時又保留原始 HTML、TXT、
|
| 439 |
|
| 440 |
若要把這件事具體化,可以把「從雙語網站到CAT」想成一條最小可行流程。第一步,挑選一組可信網站,先人工確認二十組中英文頁面是真正翻譯關係。第二步,保留原始HTML 或 PDF,另外抽出正文成為 raw_text。第三步,用 regex與人工檢查去掉導覽列、頁尾、重複標題與格式噪音。第四步,把每份文本依標題、段落、列表項切成較穩定的單位。第五步,再進入句子層對齊,並把可疑項標記為待驗證。第六步,把人工看過的一批高品質句對先放進Excel 或CSV,補齊來源、語區、領域與版本資訊。第七步,只有在這一批資料已經足夠乾淨時,才匯出成TMX 並導入 CAT工具。這條流程看起來保守,但優點在於每一層都能回頭修正,不會因為一次匯入就把污染擴散到整個工作環境。
|
| 441 |
|
|
|
|
| 21 |
|
| 22 |
在公開的平行語料資源中,OPUS 是很值得譯者認識的一個入口。OPUS 網站(Open Parallel Corpora, 公開平行語料庫,網址:https://opus.nlpl.eu)長年彙整各種可公開取得的平行語料與多語資料。截至 2026 年初,其官方首頁顯示已收錄超過一千個語料集、超過一千種語言,以及上千億級的句對。雖然這個數量本身不代表品質一定好,但至少說明了一件事:譯者若學會搜尋與篩選,其實可以接觸到遠比過去多的雙語材料,有助於擴大其翻譯的視野與能力。
|
| 23 |
|
| 24 |
+
::: {.callout-note appearance="minimal"}
|
| 25 |
+
Opus Corpus 首頁
|
| 26 |
+
|
| 27 |
+

|
| 28 |
+
:::
|
|
|
|
| 29 |
|
| 30 |
OPUS 的優點,不只是量大,也在於來源多樣。其收錄的語料包含字幕、技術文件、開源軟體在地化資料、政府與國際組織文件、新聞評論、教育內容等。這代表譯者不必只停留在「有沒有例句」的層次,而是可以進一步問:「這些例句來自哪種文本?」「是否符合我的領域需求?」「是否接近我要交付的文體?」例如在翻譯口語對話、影視字幕或遊戲文本時,字幕型語料可能比法律文件更有參考價值;反之,若在翻譯技術說明、使用者介面或開發者文件,像 Mozilla、MDN Web Docs 這類來源就可能比電影字幕有用。
|
| 31 |
|
|
|
|
| 51 |
|
| 52 |
對照查詢的核心價值,在於能把「語言單位」放回「語言環境」。譯者很少只翻一個詞,而是翻一個出現在特定句型中的詞。例如 account 不一定都是「帳號」;在會計文本裡可能是「帳戶」,在敘事語境裡可能是「敘述」、「說法」。若只查閱字典,很容易被高頻義項誤導;若觀察 concordance line,便能了解這個詞與哪些動詞、介系詞、修飾語反覆出現,進一步判斷這個詞在目前文本中的功能。
|
| 53 |
|
| 54 |
+
這種檢索能力,不必依賴昂貴平台才能做到。傳統的「對照檢索軟體」(concordancer[^1])可以勝任,很多日常工具也可以部分完成同樣的工作。以 Calibre 的 ebook-viewer 為例,這套工具原本是電子書閱讀器,卻很適合被譯者挪用為中小型語料檢索介面。官方文件指出,ebook-viewer 不只支援一般搜尋,也支援 whole words、nearby words 與 regex搜尋模式,並提供 Reference mode 方便定位段落,以及 highlight 與 annotation 功能協助做人工標記。若將整理好的雙語文件或單語參考資料做成 ePub、或匯入為可閱讀文本,calibre 其實能成為相當順手的例句檢索工具。
|
| 55 |
|
| 56 |
Calibre **Regex 工具使用方式**
|
| 57 |
|
|
|
|
| 70 |
|
| 71 |
Ctrl-F (Windows) 或 ⌘F (macOS)可進入搜尋。搜尋方塊下方的下拉式選單中可點選以 regex 搜尋。
|
| 72 |
|
| 73 |
+
::: {.callout-note appearance="minimal"}
|
| 74 |
+

|
| 75 |
+
|
| 76 |
+
輸入 down the rabbit 可以搜尋到2筆:目錄及第一章的標題。
|
| 77 |
+
|
| 78 |
+

|
| 79 |
+
:::
|
|
|
|
| 80 |
|
| 81 |
同樣地,許多支援正規表示式搜尋的文字編輯器,也能扮��輕量 concordancer的角色。例如 VS Code、CudaText、Zed、Sublime Text等,都可以對單檔或整個資料夾做全文檢索。對譯者來說,這很有用,因為實務上的目的並非進行大型語言研究,而是要在一批已知資料裡快速找到某種形式的句子、標記或對應模式。若資料來自一套雙語網站、一批舊譯稿或特定客戶過去的中英對照文件,那麼文字編輯器加上 regex,通常便足以解決多數問題。
|
| 82 |
|
|
|
|
| 84 |
|
| 85 |
安裝完成後可以編輯純文字檔案 (.txt)。按下 Ctrl-F (Windows) 或 ⌘F (macOS) 顯示搜尋方塊,再按下 **.\*** 圖示進入 regex 搜尋模式。
|
| 86 |
|
| 87 |
+

|
|
|
|
|
|
|
| 88 |
|
| 89 |
關鍵詞檢索、對照查詢與 regex 的關係可以如此理解:關鍵詞搜尋是找字串,concordancing 是看上下文,而regex 係將搜尋條件表達得更精準。當檢索需求從「找這個詞」變成「找所有帶有百分比與括號的句子」、「找所有未翻譯的英文字串」、「找所有第 X 條、第 X 項」,甚至是如「戚戚然」、「營營役役」的疊詞時,regex 就會變得非常有用。
|
| 90 |
|
| 91 |
+
下載《李清照集》([[https://www.degruyterbrill.com/document/doi/10.1515/9781501504518/html]{.underline}](https://www.degruyterbrill.com/document/doi/10.1515/9781501504518/html))英譯 ePub 檔,以 Calibre ebook-viewer 搜尋 regex: ``(\p{Han})\1(\p{Han})\2`` 可找到9筆AABB式疊詞:
|
| 92 |
|
| 93 |
+

|
|
|
|
|
|
|
| 94 |
|
| 95 |
正規表示式本質上是一種在文本中尋找特定文字出現形式、次序或規律(pattern)的語言。正規表示式通常不是在找某一個固定詞(不過一定要如此也可以),而是在描述一類字串長什麼樣子。舉例來說,若欲尋找所有阿拉伯數字,可以用`\d+`;若欲尋找小數,可以用 `\d+`(?:\\.`\d+`)?;若欲尋找百分比,可以在後面再接 %。這種寫法看起來像程式語言,但其實只要抓住幾個核心符號,譯者就已經能處理很多工作。
|
| 96 |
|
|
|
|
| 98 |
|
| 99 |
## 正規表示式摘要
|
| 100 |
|
| 101 |
+
| 字元 | 意義 / 用法 | 備註 |
|
| 102 |
+
| :--- | :--- | :--- |
|
| 103 |
+
| **字面意義的字元**<br>(literal characters) | 例如:`a` `b` `1` `2` `_` `"` `<` `>` | |
|
| 104 |
+
| **特殊字元**<br>**metacharacters** | | |
|
| 105 |
+
| `\t` | **t**ab(定位字元) | |
|
| 106 |
+
| `\n` | **n**ewline(換行字元);<br>Windows:`\r\n`(CR LF)<br>UNIX/Linux/macOS:`\n`(LF) | |
|
| 107 |
+
| `\s` | white **s**pace(空白字元) | 包含空格(space)及 tab 等 |
|
| 108 |
+
| `.`(*句點*) | 比對任意字元(`\n` 除外) | |
|
| 109 |
+
| **元字元**<br>(必須以 `\` 跳脫才能進行文字比對) | | |
|
| 110 |
+
| `\` | 跳脫 (escape) 字元 | |
|
| 111 |
+
| `|` | 替代(或) | |
|
| 112 |
+
| `()` | 群組;`(?:)` 為非擷取群組 | |
|
| 113 |
+
| `[]` | 字元類別;恰好比對一個字元 | 範例:比對任一英文母音字母 `[aeiou]` |
|
| 114 |
+
| `{}` `*` `?` `+` | 量詞 | |
|
| 115 |
+
| `^` `$` | 錨點(零寬度) | |
|
| 116 |
+
| `?` | (1) 作為量詞時,作用於緊鄰其左方的一個字元、字元類別或群組;<br>(2) 作為非貪婪 non-greedy 或懶惰 lazy 指定符 | |
|
| 117 |
+
| **錨點 anchor**<br>(零寬度:僅比對位置,不比對字元) | | |
|
| 118 |
+
| `\b` | 詞邊界 | 範例:空白字元(或標點符號)與文字字元之間的位置 |
|
| 119 |
+
| `^` | 脫字符號:字串開頭 | |
|
| 120 |
+
| `$` | 錢字符號:字串結尾 | |
|
| 121 |
+
| **量詞 quantifier**<br>(作用於緊鄰其左方的一個字元、字元類別或群組) | | |
|
| 122 |
+
| `*` | 零次或多次 | |
|
| 123 |
+
| `+` | 一次或多次 | 亦即「至少出現一次」 |
|
| 124 |
+
| `?` | 零次或一次 | 亦即「可有可無」 |
|
| 125 |
+
| `{n}` | 恰好 *n* 次 | |
|
| 126 |
+
| `{n,m}` | 至少 *n* 次,至多 *m* 次 | |
|
| 127 |
+
| `{n,}` | 至少 *n* 次,無上限 | |
|
| 128 |
+
| **字元類別** | 以 `[]` 括起的字元 ── 恰好比對一個字元 | |
|
| 129 |
+
| **範圍** | `[a-z]` 比對任一英文小寫字母;<br>`\p{Han}`(最完整的寫法)或 `[一-龥]` 或 `[\u4E00-\u9FFF]` 或 `[\x{4E00}-\x{9FFF}]`,共 20,992 個基本中文字元 | 起始字元的 Unicode 碼位必須較小;中日韓統一表意文字(CJK Unified Ideographs)涵蓋最常見的 CJK 字元;Zed 及 Calibre ebook-viewer 皆可接受;CudaText 使用最後一種格式處理一般 Unicode 範圍 |
|
| 130 |
+
| **快捷寫法** | `^` 在 `[]` 中表示該類別的「相反」(也就是所有此類別以外的字元) | 範例:比對*任何*非英文母音的字元 `[^aeiou]` |
|
| 131 |
+
| `\d` | 數字,等同於 `[0-9]` | |
|
| 132 |
+
| `\w` | 「文字」字元;`\d` 加上 `[a-zA-Z]` 加上 `_`(底線字元;underscore),對於非英文字母書寫的語言可能還包含更多字元 | `\w` 的定義取決於特定的正規表示式引擎;部分引擎會納入中日韓字元及含附加符號的字元(如 é、ç、ü);其他引擎則不會。 |
|
| 133 |
+
| `\D` `\S` `\W`<br>`\P{Han}`<br>(相反集合) | 代表對應小寫字元類別之**否定**的字元類別 | `\D`、`\S`、`\W`、`\P{Han}` 分別為非數字、非空白、非文字及非中日韓字元 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 134 |
|
| 135 |
例如,若欲找出文件中所有可能的變數或 placeholder,可以用\\{\[\^}\]+\\} 或 \\{\\{\[\^}\]+\\}\\}之類的模式。若欲找出所有數值加單位的表達,例如 5 km、3.5 GB、20%,可以寫成`\d+`(\\.`\d+`)?\\s?(km\|GB\|%)。若欲擷取英文術語後面緊接中文括號說明的寫法,例如Application Programming Interface(API) 或workspace(工作區),可以針對英文字串與全形括號組合設計模式。這些檢索方式之所以有用,是因為這些模式不是把文字當作一串字,而是把文字當成一種可辨識的形式。
|
| 136 |
|
|
|
|
| 191 |
|
| 192 |
... **throwing** *you* under the bus.\ ... **throw** *me* under the bus!\ I **threw** *four people* under the bus for \$35,000, ... 等等
|
| 193 |
|
| 194 |
+
{width="5.854166666666667in" height="2.2916666666666665in"}
|
| 195 |
|
| 196 |
-----------------------------------------------------------------------
|
| 197 |
|
|
|
|
| 339 |
|
| 340 |
自建資源若要變成長期資產,還需要定期除污。所謂除污,包括刪除版本過時內容、移除低品質OCR 句對、合併重複資料、標記已棄用用詞、區分不同客戶或品牌的 style guide,並避免把明顯不該重用的材料一路保留。例如短期促銷文案、活動slogan、一次性公告、錯誤頁訊息的舊版本,都可能在某個時點失去重用價值。若不定期整理,資料庫只會越來越大,卻越來越不可信。
|
| 341 |
|
| 342 |
+
在這裡,Excel、TMX與其他格式之間其實不是互斥關係,而是不同層次的配合。很多譯者可以先用Excel 做整理與人工作業,等品質穩定後再匯出成 TMX 匯入CAT;同時又保留原始 HTML、TXT、ePub 或 Markdown檔作為檢索層。這種多層結構雖然看起來麻煩,但長期而言反而最穩。因為這種分層做法尊重不同格式的用途:表格適合管理、純文字適合搜尋、TMX適合 CAT。
|
| 343 |
|
| 344 |
若要把這件事具體化,可以把「從雙語網站到CAT」想成一條最小可行流程。第一步,挑選一組可信網站,先人工確認二十組中英文頁面是真正翻譯關係。第二步,保留原始HTML 或 PDF,另外抽出正文成為 raw_text。第三步,用 regex與人工檢查去掉導覽列、頁尾、重複標題與格式噪音。第四步,把每份文本依標題、段落、列表項切成較穩定的單位。第五步,再進入句子層對齊,並把可疑項標記為待驗證。第六步,把人工看過的一批高品質句對先放進Excel 或CSV,補齊來源、語區、領域與版本資訊。第七步,只有在這一批資料已經足夠乾淨時,才匯出成TMX 並導入 CAT工具。這條流程看起來保守,但優點在於每一層都能回頭修正,不會因為一次匯入就把污染擴散到整個工作環境。
|
| 345 |
|
src/media/messed_up_regex_summary_table.png
ADDED
|
Git LFS Details
|