1. 程式人生 > 其它 >【Stanford - Speech and Language Processing 讀書筆記 】2、Regular Expression,Text Normalization,Edit distance

【Stanford - Speech and Language Processing 讀書筆記 】2、Regular Expression,Text Normalization,Edit distance

介紹正則表示式、文字規範化和最小編輯距離

1、Introduction

正則表示式(regular expression):模式匹配,用於從文字中抽取特殊的詞句。

文字規範化(text normalization) :將文字轉化為更為方便、規範的格式,其中包括詞標記化(word tokenization)、詞形還原(lemmatization)、詞幹化(stemming)、語句分割(sentence segmenting)。

編輯距離(edit distance):度量兩個詞語相似程度的一種衡量指標,根據一個詞語對字母的刪除、插入、替換操作的次數來計算編輯距離。

2、Regular Expression

基本規則:

1、大小寫敏感(case sensitive)

2、字元析取(disjunction of characters)

3、範圍(range)

4、否定(negation): ^直接位於方括號 [ 之後

5、問號(question mark): ? 表示前面的字元或什麼都沒有

6、重複

* : 前面的字元重複0次或若干次

+ :前面的字元重複1次或若干次

例如 / [ 0 - 9 ] [ 0 - 9] * / 和 / [ 0 - 9 ] + / 均表示一個自然數

7、萬用字元(wildcard): 代替任何單個字元(除了回車)

8、錨定表示式(anchors)

例如 / ^ The dog\. $ / 表示一個句子 The dog.

9、析取(disjunction): disjunction operator / pipe symbol - |

例如 / cat | dog / 匹配 cat 或 dog

10、分組(grouping):括號()具有最高優先順序

例如 / guppy | ies / 匹配 guppy 或 ies ;/ gupp ( y | ies ) / 匹配 guppy 或 guppies

11、優先順序(precedence)

12、更多

13、替換,捕獲組(Substitution, Capture Groups)

替換操作符如 s/regexp1/pattern/ 可以讓一個正則表示式被另一個表示式替換,常常在python或Unix命令(vim或sed)中使用

數字符號 \1 可以 參考之前括號內的,如s/([0-9]+)/<\1>/ 可以在數字外面加上括號,/the (.*)er they were, the \1er they will be/ 等等

捕獲組: 如/the (.*)er they (.*), the \1er we \2/ ; \1 對應第一個括號內的,\2對應第二個括號內的。它可以匹配the faster they ran, the faster we ran,但不能匹配faster they ran, the faster we ate。 \3, \4...同理

如果某個模式不希望被捕獲,可以使用 / ? : pattern / ,它稱為non-capturing group。 例如/(?:some|a few) (people|cats) like some \1/ 可以匹配some cats like some cats 而非 some cats like some a few

14、先行斷言(lookahead assertions)

利用(?運算子——如果模式出現,運算子 (?= pattern) 為真,但寬度為零,即匹配指標不前進;運算子(?!模式)僅在模式不匹配時返回 true,但同樣為零寬度,並且匹配指標不前進。

負前瞻通常用於以下情況,正在解析一些複雜的模式,但想排除特殊情況。例如假設我們想在一行的開頭匹配任何不以“Volcano”開頭的單詞:

/ ˆ (?!Volcano) [A-Za-z]+ /

3、Word and Copora

詞的定義? 是否算上標點,是否算上停頓、結巴導致的語氣詞,詞與詞根? —— 根據不同的任務而定

幾個術語: lemma : 具有相同詞幹、相同的主要詞性和相同的詞義的一組詞, 如cat和cats

wordform :單詞的完整變形或派生形式

word tokens : 文字中單詞的個數(相同的單詞也重複計入),數量用N表示

      word types : 文字中不同的單詞個數(每一種單詞僅記一次),數量用|V| 表示

Herdan’s Law (Herdan, 1960) or Heaps’ Law (Heaps, 1978):

一般地,\beta在0.67-0.75之間

語料庫(Copera): 具有多樣性(語言、體裁、作者、時代……)

語言是隨情境而改變的,當在一個語料庫中建立模型時,需要考慮語料庫的某些細節,如語言、目的、出處等。

所以,建議語料庫的建立者製作一個數據表,包括例如:

動機、情境、語言、演講者的描述與統計、收集過程、註解過程、版權和產權 等等

4、Text Normalization

4.1 詞標記化(word tokenization): 將文字標記為一個個單詞

簡陋的方法——Unix工具,包括命令tr(單詞轉換,例如大小寫),sort(按首字母排序),uniq(合併相同的單詞並計數)

例如對莎士比亞的一片文章執行如下命令:

更為精細的方法,應該要做到:

1、對標點的處理——逗號、句號常常是分段的標誌,但也有可能在單詞內(如 Mr.)

2、擴寫縮寫單詞,如 we' re -> we are

3、命名實體識別,如 New York

一些語言如漢語、日語、泰語,使用的文字而非單詞, 常常使用神經序列模型(neural sequence model)

位元組對編碼(byte-pair encoding for tokenization)

對於未知單詞問題,引入子詞(subword)——比標記詞還要短小

位元組對編碼演算法:

1、檢測語料庫

2、選擇相鄰次數最多的兩個元素

3、合併這兩個元素,並將其替代原來的元素

4、返回1,持續檢測、計數、合併,直到合併k(引數)次產生k個新元素

如下例子:

4.2 詞標準化(word normalization)

將詞語轉化為標準形式, 為具有多個形式的詞選擇單一的形式。

應用:資訊恢復(information retrieval), 資訊抽取(information extraction)

字元摺疊(case folding)

大寫字母轉小寫

廣泛應用於資訊恢復、語音識別(speech recognition)

也不總是適用,如情感分析(sentiment analysis)、文字分類(text classification)等

詞形還原(Lemmatiziation)

覺得具有相同詞根的兩個單詞,如 be/am/is/are、dinners/dinner

方法:形態解析(morphological parsing) 對語素(morpheme)的研究 —— 1、詞幹(stem) 2、詞綴(affixes)

一種比較粗糙的演算法——The Porter Stemming

該演算法基於串聯執行的一系列重寫規則,作為級聯,其中每次傳遞的輸出作為輸入提供給下一次傳遞,規則的例子如下:

演算法應用於如下的段落:

演算法可能出現過泛化或欠泛化的錯誤

4.3 句子分割

有力的工具——標點符號

但有時標點的作用是模糊的,例如Mr.

為解決這類問題,可以結合詞標準化和句子分割; 也可以使用某些特殊的字典

5、Minimum Edit Distance

編輯距離(edit distance),用於衡量兩個字串的相似程度

策略:計算從一個字串轉變為另一個字串所需要的最小操作(插入, 刪除, 替換)次數。

這裡插入, 刪除, 替換可以賦不同的代價(距離),一般地插入, 刪除, 替換的代價分別為1,1,1或1,1,2

例如下圖,用上述兩種距離代價計算的編輯距離分別為5和8

演算法:動態規劃

給定兩個字串,長度為 n 的源字串 X 和長度為 m 的目標字串 Y,我們將 D[i, j] 定義為 X[1..i] 和 Y[1.. j] 之間的編輯距離 , 即 X 的前 i 個字元和 Y 的前 j 個字元。因此 X 和 Y 之間的編輯距離為 D[n,m]。採用如下演算法:

當插入、刪除代價為1, 替換插入代價為2:

演算法虛擬碼:

直觀的例子: