最大匹配算法(Maximum Matching)被用於對一個文段進行詞語劃分(Word Segmentation)。算法
注意
這是詞元化(Tokenization)算法
此方法不適用於無分隔符的字母語言(e.g.:德語、使用假名替代漢字的日語、被取消分詞符的英文等)
可是對漢語這類無詞間分隔符但不依賴字母的語言效果拔羣ui
人話版本(天然描述)
輸入:文段$\small P$,單詞表$\small W$
過程:對於給定的$\small P$和$\small W$:指針
- 令指針$\small i$從$\small P$的起點開始
- 每當找到最長匹配於$\small i$引領文段的單詞$\small w$,則將$\small w$加入詞元分析表$\small T$(一個順序表結構)中
- $\small i$向後移動$\small w$長度個位置
- 回到2,直至$\small i$沒法向後移動爲止
輸出:詞元分析表$\small T$code
這個概念用定義去描述其實很不容易理解,這裏直接上例子,好比,有一個字符串htm
The quick brown fox jumps over a lazy dog
如今給出這麼幾個字符串:Th
、The
、The slow
、The quick brown fox jumps over a lazy dog and a little duck
、quick brown
blog
注意,最長匹配的前提是能匹配得上,此外還要求是端點匹配字符串
先看Th
,很明顯,儘管Th
不能完美的匹配上原有字符串,但倒是原字符串的子串(Substring),也就是說它可以完美的和原字符串的局部相匹配,並且是從起始位置相匹配,能夠暫時認爲是原字符串的最長匹配。get
再看The
,和Th
同樣,其總體可以匹配上原字符串的部分,並且也是從起始位置匹配,所以也多是最長匹配,這樣一來Th
和The
都能匹配上原字符串,可是input
一個字符串在一個給定的字符串集合中只能找到一個最長匹配,並且是儘量長的那個
考慮到The
比Th
長,所以The
替掉了Th
成爲了目前的最長匹配
接下來看看The slow
,截止到The
都能匹配到原字符串上,但接下來的s
卻沒法匹配原字符串,儘管匹配部分的長度比The
還長,但很遺憾,The slow
只能認爲是不匹配。
The quick brown fox jumps over a lazy dog and a little duck
也是同理,別看它甚至是原字符串的延長串(也就是原字符串是它的子串),但後面多出來的部分匹配不回去,因此也只能認爲是不匹配。
原字符串是大爺!!
最後再看看quick brown
,固然這也是原字符串的子串,並且匹配長度爲11,甚至比The
的匹配性還強,可是也很遺憾,這並不是從起點匹配的,因此這個沒法認爲匹配
因而咱們獲得告終論:
在上述給出的5個字符串中,最長匹配爲
The
固然,這都是目前的最長匹配,若是咱們繼續給出The quick
、The quick brown
、……這個結果仍是會跟着變化的,由於:
理論上,從全部字符串構成的全集尋找某一字符串的最長匹配,其結果只能是該字符串自己
這裏先說對英語吧…… 由於是作詞元化工做,因此這裏暫時無視英語中的空格分隔符。
We are talking about weather. ↓ 移除全部分詞符 Wearetalkingaboutweather.
固然,咱們要對下面的內容作分詞,按說分詞工做作完後其分割結果應該和移除以前是同樣的:We|are|talking|about|weather|.
但若是採用MM算法使用一個標準詞庫進行匹配,就會是下面這樣:
首先從
W
開始,從詞庫中尋找從W
開始可以最長匹配的字符串,而後很是巧,咱們在詞典中找到了……Wear
!! ……
因而,咱們先無論後面能不能分出來,反正分完確定是這樣子:Wear|...|...
。
很明顯這種分法是不行的。
這裏面的緣由就在於:英語一共就26個字母,隨便找若干個字母湊成一個單詞的機率仍是很大的,特別是移除分隔符後出現大量輔音字母+若干元音字母的狀況。 並且,英語中詞彙的長度方差很大,短的只有一個字母,長的能夠10多個,極端狀況下也有40多個的甚至更多,不少短單詞會成爲一些長單詞的子串(we
之於wear
等),而移除分隔符後兩個本來獨立的子串被拼合成一個更長的單詞也不是什麼新鮮事。 一種極端狀況:
可是漢語就不同了,就以GB2312裏面的6700多個漢字想隨便挑出來幾個字就湊巧拼出一個詞語仍是很困難的,並且詞語長度的方差很低,不考慮詩句和歇後語的話,經常使用的詞語和成語絕大多數爲2~4個字,較長一些的8個字(比較少),這種狀況下即便沒有分隔符,兩個獨立的詞語可以被混淆成一個的概率仍是比較小的,好比:
一隻穿雲箭,千軍萬馬來相見 一隻|穿雲|箭|,|千軍萬馬|來|相見
基本上分割的徹底正確,並且即便把標點符號都去掉,也不太影響其分割的結果,斯坦福大學也給出了這樣的評價:
Doesn’t generally work in English! But works astonishingly well in Chinese!
不過其實說到底,這種算法比較依賴於詞典(事實上不少詞元化算法都挺依賴詞典),若是詞典編寫的不夠好,那麼即便是漢語其詞元化的質量也不盡如人意(特別是漢語須要足夠完善的詞彙庫,其工做量是至關龐大的)。