【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:
演算法虛擬碼:
直觀的例子: