導航:首頁 > 源碼編譯 > cyk演算法實現

cyk演算法實現

發布時間:2025-01-19 20:06:40

A. 關於CRC演算法,高手賜教

循環冗餘校驗(CRC)是一種根據網路數據封包或電腦檔案等數據產生少數固定位數的一種散列函數,主要用來檢測或校驗數據傳輸或者保存後可能出現的錯誤。生成的數字在傳輸或者儲存之前計算出來並且附加到數據後面,然後接收方進行檢驗確定數據是否發生變化。一般來說,循環冗餘校驗的值都是32位的整數。由於本函數易於用二進制的電腦硬體使用、容易進行數學分析並且尤其善於檢測傳輸通道干擾引起的錯誤,因此獲得廣泛應用。它是由W. Wesley Peterson在他1961年發表的論文中披露[1]。

{{noteTA
|T=zh-hans:循環冗餘校驗;zh-hant:循環冗餘校驗;
|1=zh-hans:循環冗餘校驗;zh-hant:循環冗餘校驗;
}}
'''循環冗餘校驗'''(CRC)是一種根據網路數據封包或[[電腦檔案]]等數據產生少數固定位數的一種[[散列函數]],主要用來檢測或校驗數據傳輸或者保存後可能出現的錯誤。生成的數字在傳輸或者儲存之前計算出來並且附加到數據後面,然後接收方進行檢驗確定數據是否發生變化。一般來說,循環冗餘校驗的值都是32位的整數。由於本函數易於用二進制的[[電腦硬體]]使用、容易進行數學分析並且尤其善於檢測傳輸通道干擾引起的錯誤,因此獲得廣泛應用。它是由[[W. Wesley Peterson]]在他1961年發表的論文中披露<ref name="PetersonBrown1961">
{{cite journal
| author = Peterson, W. W. and Brown, D. T.
| year = 1961
| month = January
| title = Cyclic Codes for Error Detection
| journal = Proceedings of the IRE
| doi = 10.1109/JRPROC.1961.287814
| issn = 0096-8390
| volume = 49
| pages = 228
}}</ref>。

==簡介==
CRC「校驗和」是兩個位元數據流採用二進制除法(沒有進位,使用XOR異或來代替減法)相除所得到的余數。其中被除數是需要計算校驗和的信息數據流的二進製表示;除數是一個長度為<math>n+1</math>的預定義(短)的二進制數,通常用多項式的系數來表示。在做除法之前,要在信息數據之後先加上<math>n</math>個0.

CRCa 是基於[[有限域]]GF(2)([[同餘|關於2同餘]])的[[多項式環]]。簡單的來說,就是所有系數都為0或1(又叫做二進制)的多項式系數的集合,並且集合對於所有的代數操作都是封閉的。例如:

:<math>(x^3 + x) + (x + 1) = x^3 + 2x + 1 \equiv x^3 + 1</math>

2會變成0,因為對系數的加法都會模2. 乘法也是類似的:

:<math>(x^2 + x)(x + 1) = x^3 + 2x^2 + x \equiv x^3 + x</math>

我們同樣可以對多項式作除法並且得到商和余數。例如, 如果我們用''x''<sup>3</sup> + ''x''<sup>2</sup> + ''x''除以''x'' + 1。我們會得到:
:<math>\frac{(x^3 + x^2 + x)}{(x+1)} = (x^2 + 1) - \frac{1}{(x+1)}</math>
<!--註:在說「除以」的時候, 讀者將會看到等式中的除號。這里看不到除號常使我感到有點混亂。-->

也就是說,

:<math>(x^3 + x^2 + x) = (x^2 + 1)(x + 1) - 1</math>

這里除法得到了商''x''<sup>2</sup> + 1和余數-1,因為是奇數所以最後一位是1。

字元串中的每一位其實就對應了這樣類型的多項式的系數。為了得到CRC, 我們首先將其乘以<math>x^{n}</math>,這里<math>n</math>是一個固定多項式的[[多項式的階|階]]數, 然後再將其除以這個固定的多項式,余數的系數就是CRC。

在上面的等式中,<math>x^2+x+1</math>表示了本來的信息位是<code>111</code>, <math>x+1</math>是所謂的'''鑰匙''', 而余數<math>1</math>(也就是<math>x^0</math>)就是CRC. key的最高次為1, 所以我們將原來的信息乘上<math>x^1</math>來得到<math>x^3 + x^2 + x</math>,也可視為原來的信息位補1個零成為<code>1110</code>。

一般來說,其形式為:

:<math>M(x) \cdot x^{n} = Q(x) \cdot K(x) + R (x) </math>

這里 M(x) 是原始的信息多項式。K(x)是<math>n</math>階的「鑰匙」多項式。<math>M(x) \cdot x^{n}</math>表示了將原始信息後面加上<math>n</math>個0。R(x)是余數多項式,既是CRC「校驗和」。在通訊中,發送者在原始的信息數據M後加上<math>n</math>位的R(替換本來附加的0)再發送。接收者收到M和R後,檢查<math>M(x) \cdot x^{n} - R(x)</math>是否能被<math>K(x)</math>整除。如果是,那麼接收者認為該信息是正確的。值得注意的是<math>M(x) \cdot x^{n} - R(x)</math>就是發送者所想要發送的數據。這個串又叫做''codeword''.

CRCs 經常被叫做「[[校驗和]]」, 但是這樣的說法嚴格來說並不是准確的,因為技術上來說,校驗「和」是通過加法來計算的,而不是CRC這里的除法。

「[[錯誤糾正編碼]]」常常和CRCs緊密相關,其語序糾正在傳輸過程中所產生的錯誤。這些編碼方式常常和數學原理緊密相關。

==實現==

==變體==
CRC 有幾種不同的變體

* <code>shiftRegister</code> 可以逆向使用,這樣就需要檢測最低位的值,每次向右移動一位。這就要求 <code>polynomial</code> 生成逆向的數據位結果。''實際上這是最常用的一個變體。''
* 可以先將數據最高位讀到移位寄存器,也可以先讀最低位。在通訊協議中,為了保留 CRC 的[[突發錯誤]]檢測特性,通常按照[[物理層]]發送數據位的方式計算 CRC。
* 為了檢查 CRC,需要在全部的碼字上進行 CRC 計算,而不是僅僅計算消息的 CRC 並把它與 CRC 比較。如果結果是 0,那麼就通過這項檢查。這是因為碼字 <math>M(x) \cdot x^{n} - R(x) = Q(x) \cdot K(x)</math> 可以被 <math>K(x)</math> 整除。
* 移位寄存器可以初始化成 1 而不是 0。同樣,在用演算法處理之前,消息的最初 <math>n</math> 個數據位要取反。這是因為未經修改的 CRC 無法區分只有起始 0 的個數不同的兩條消息。而經過這樣的取反過程,CRC 就可以正確地分辨這些消息了。
* CRC 在附加到消息數據流的時候可以進行取反。這樣,CRC 的檢查可以用直接的方法計算消息的 CRC、取反、然後與消息數據流中的 CRC 比較這個過程來完成,也可以通過計算全部的消息來完成。在後一種方法中,正確消息的結果不再是 0,而是 <math>\sum_{i=n}^{2n-1} x^{i}</math> 除以 <math>K(x)</math> 得到的結果。這個結果叫作核驗多項式 <math>C(x)</math>,它的十六進製表示也叫作[[幻數]]。

按照慣例,使用 CRC-32 多項式以及 CRC-16-CCITT 多項式時通常都要取反。CRC-32 的核驗多項式是
<math>C(x) = x^{31} + x^{30} + x^{26} + x^{25} + x^{24} + x^{18} + x^{15} + x^{14} + x^{12} + x^{11} + x^{10} + x^8 + x^6 + x^5 + x^4 + x^3 + x + 1</math>。

==錯誤檢測能力==
CRC 的錯誤檢測能力依賴於關鍵多項式的階次以及所使用的特定關鍵多項式。''誤碼多項式'' <math>E(x)</math> 是接收到的消息碼字與正確消息碼字的''異或''結果。當且僅當誤碼多項式能夠被 CRC 多項式整除的時候 CRC 演算法無法檢查到錯誤。
* 由於 CRC 的計算基於除法,任何多項式都無法檢測出一組全為零的數據出現的錯誤或者前面丟失的零。但是,可以根據 CRC 的[[#變體|變體]]來解決這個問題。
* 所有隻有一個數據位的錯誤都可以被至少有兩個非零系數的任意多項式檢測到。誤碼多項式是 <math>x^k</math>,並且 <math>x^k</math> 只能被 <math>i \le k</math> 的多項式 <math>x^i</math> 整除。
* CRC 可以檢測出所有間隔距離小於[[多項式階次]]的雙位錯誤,在這種情況下的誤碼多項式是
<math>E(x) = x^i + x^k = x^k \cdot (x^{i-k} + 1), \; i > k</math>。
如上所述,<math>x^k</math> 不能被 CRC 多項式整除,它得到一個 <math>x^{i-k} + 1</math> 項。根據定義,滿足多項式整除 <math>x^{i-k} + 1</math> 的 <math>{i-k}</math> 最小值就是多項是的階次。最高階次的多項式是[[本原多項式]],帶有二進制系數的 <math>n</math> 階多項式

==CRC 多項式規范==
下面的表格略去了「初始值」、「反射值」以及「最終異或值」。
* 對於一些復雜的校驗和來說這些十六進制數值是很重要的,如 CRC-32 以及 CRC-64。通常小於 CRC-16 的 CRC 不需要使用這些值。
* 通常可以通過改變這些值來得到各自不同的校驗和,但是校驗和演算法機制並沒有變化。

CRC 標准化問題
* 由於 CRC-12 有三種常用的形式,所以 CRC-12 的定義會有歧義
* 在應用的 CRC-8 的兩種形式都有數學上的缺陷。
* 據稱 CRC-16 與 CRC-32 至少有 10 種形式,但沒有一種在數學上是最優的。
* 同樣大小的 CCITT CRC 與 ITU CRC 不同,這個機構在不同時期定義了不同的校驗和。

==常用 CRC(按照 ITU-IEEE 規范)==
{|class="wikitable"
! 名稱|| 多項式 || 表示法:正常或者翻轉
|-
|CRC-1 || <math>x + 1</math><br>(用途:硬體,也稱為[[奇偶校驗位]]) || 0x1 or 0x1 (0x1)
|-
|CRC-5-CCITT || <math>x^{5} + x^{3} + x + 1</math> ([[ITU]] G.704 標准) || 0x15 (0x??)
|-
|CRC-5-USB || <math>x^{5} + x^{2} + 1</math> (用途:[[USB]] 信令包) || 0x05 or 0x14 (0x9)
|-
|CRC-7 || <math>x^{7} + x^{3} + 1</math> (用途:通信系統) || 0x09 or 0x48 (0x11)
|-
|CRC-8-ATM || <math>x^8 + x^2 + x + 1</math> (用途:ATM HEC) || 0x07 or 0xE0 (0xC1)
|-
|CRC-8-[[CCITT]] || <math>x^8 + x^7 + x^3 + x^2 + 1</math> (用途:[[1-Wire]] [[匯流排]]) ||
|-
|CRC-8-[[Dallas_Semiconctor|Dallas]]/[[Maxim_IC|Maxim]] || <math>x^8 + x^5 + x^4 + 1</math> (用途:[[1-Wire]] [[bus]]) || 0x31 or 0x8C
|-
|CRC-8 || <math>x^8 + x^7 + x^6 + x^4 + x^2 +1</math> || 0xEA(0x??)
|-
|CRC-10 || x<sup>10</sup> + x<sup>9</sup> + x<sup>5</sup> + x<sup>4</sup> + x + 1 || 0x233 (0x????)
|-
|CRC-12 || <math>x^{12} + x^{11} + x^3 + x^2 + x + 1</math><br>(用途:通信系統) || 0x80F or 0xF01 (0xE03)
|-
|CRC-16-Fletcher || 參見 [[Fletcher's checksum]] || 用於 [[Adler-32]] A & B CRC
|-
|CRC-16-CCITT || ''x''<sup>16</sup> + ''x''<sup>12</sup> + ''x''<sup>5</sup> + 1 ([[X25]], [[V.41]], [[Bluetooth]], [[PPP]], [[IrDA]]) || 0x1021 or 0x8408 (0x0811)
|-
|CRC-16-[[IBM]] || ''x''<sup>16</sup> +''x''<sup>15</sup> + ''x''<sup>2</sup> + 1 || 0x8005 or 0xA001 (0x4003)
|-
|CRC-16-[[BBS]] || x<sup>16</sup> + x<sup>15</sup> + x<sup>10</sup> + x<sup>3</sup> (用途:[[XMODEM]] 協議) || 0x8408 (0x????)
|-
|CRC-32-Adler || See [[Adler-32]] || 參見 [[Adler-32]]
|-
|CRC-32-MPEG2 || See [[IEEE 802.3]] || 參見 [[IEEE 802.3]]
|-
|CRC-32-[[IEEE 802.3]] || <math>x^{32} + x^{26} + x^{23} + x^{22} + x^{16} + x^{12} + x^{11} + x^{10} + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1</math> || 0x04C11DB7 or 0xEDB88320 (0xDB710641)
|-
|CRC-32C (Castagnoli)<ref name="cast93"/>|| <math>x^{32} + x^{28} + x^{27} + x^{26} + x^{25} + x^{23} + x^{22} + x^{20} + x^{19} + x^{18} + x^{14} + x^{13} + x^{11} + x^{10} + x^9 + x^8 + x^6 + 1</math> || 0x1EDC6F41 or 0x82F63B78 (0x05EC76F1)
|-
|CRC-64-ISO || <math>x^{64} + x^4 + x^3 + x + 1</math><br>(use: ISO 3309) || 0x000000000000001B or 0xD800000000000000 (0xB000000000000001)
|-
|CRC-64-[[Ecma International|ECMA]]-182 || <math>x^{64} + x^{62} + x^{57} + x^{55} + x^{54} + x^{53} + x^{52} + x^{47} + x^{46} + x^{45} + x^{40} + x^{39} + x^{38} + x^{37} + x^{35} + x^{33} + x^{32} </math><br><!--Too long to display in one table--><math>+ x^{31} + x^{29} + x^{27} + x^{24} + x^{23} + x^{22} + x^{21} + x^{19} + x^{17} + x^{13} + x^{12} + x^{10} + x^9 + x^7 + x^4 + x + 1</math><br>(as described in [http://www.ecma-international.org/publications/standards/Ecma-182.htm ECMA-182] p.63) || 0x42F0E1EBA9EA3693 or 0xC96C5795D7870F42 (0x92D8AF2BAF0E1E85)
|-
|CRC-128 || IEEE-ITU 標准。被 [[MD5]] & [[SHA-1]] 取代||
|-
|CRC-160 || IEEE-ITU 標准。被 [[MD5]] & [[SHA-1]] 取代||
|-
|}

==CRC 與數據完整性==
盡管在[[錯誤檢測]]中非常有用,CRC 並不能可靠地驗證[[數據完整性]](即數據沒有發生任何變化),這是因為 CRC 多項式是線性結構,可以非常容易地''故意''改變數據而維持 CRC 不變,參見[http://www.woodmann.com/fravia/crctut1.htm CRC and how to Reverse it]中的證明。我們可以用 [[Message authentication code]] 驗證數據完整性。

===CRC發生碰撞的情況===

與所有其它的[[散列函數]]一樣,在一定次數的碰撞測試之後 CRC 也會接近 100% 出現碰撞。CRC 中每增加一個數據位,就會將碰撞數目減少接近 50%,如 CRC-20 與 CRC-21 相比。
* 理論上來講,CRC64 的碰撞概率大約是每 18{{e|18}} 個 CRC 碼出現一次。
* 由於 CRC 的不分解多項式特性,所以經過合理設計的較少位數的 CRC 可能會與使用較多數據位但是設計很差的 CRC 的效率相媲美。在這種情況下 CRC-32 幾乎同 CRC-40 一樣優秀。

===設計 CRC 多項式===

生成多項式的選擇是 CRC 演算法實現中最重要的部分,所選擇的多項式必須有最大的錯誤檢測能力,同時保證總體的碰撞概率最小。多項式最重要的屬性是它的長度,也就是最高非零系數的數值,因為它直接影響著計算的校驗和的長度。

最常用的多項式長度有
* 9 位 (CRC-8)
* 17 位 (CRC-16)
* 33 位 (CRC-32)
* 65 位 (CRC-64)

在構建一個新的 CRC 多項式或者改進現有的 CRC 時,一個通用的數學原則是使用滿足所有模運算不可分解多項式約束條件的多項式。
* 這種情況下的不可分解是指多項式除了 1 與它自身之外不能被任何其它的多項式整除。

生成多項式的特性可以從演算法的定義中推導出來:
* 如果 CRC 有多於一個的非零系數,那麼 CRC 能夠檢查出輸入消息中的所有單數據位錯誤。
* CRC 可以用於檢測短於 2k 的輸入消息中的所有雙位錯誤,其中 k 是多項式的最長的不可分解部分的長度。
* 如果多項式可以被 x+1 整除,那麼不存在可以被它整除的有奇數個非零系數的多項式。因此,它可以用來檢測輸入消息中的奇數個錯誤,就象奇偶校驗函數那樣。

==參見==
總的分類
* [[糾錯碼]]
* [[校驗和演算法列表]]
* [[奇偶校驗位]]

特殊技術參考
* [[Adler-32]]
* [[Fletcher's checksum]]

==參考文獻 ==
<references/>

==外部鏈接==
* [http://www.relisoft.com/science/CrcMath.html Tutorial and C++ implementation] of CRC
* Cyclic rendancy check - a simple guide to what it means for your data, CD and DVD discs. http://www.softwarepatch.com/tips/cyclic-rendancy.html
* [http://www.ross.net/crc/ ''The CRC Pitstop'']
* Williams, R. (1993-09) [http://www.repairfaq.org/filipg/LINK/F_crc_v3.html ''A Painless Guide to CRC Error Detection Algorithms'']
* [http://www.4d.com/docs/CMU/CMU79909.HTM ''Understanding Cyclic Rendancy Check'']
* Black, R. (1994-02) [http://www.cl.cam.ac.uk/Research/SRG/bluebook/21/crc/crc.html ''Fast CRC32 in Software''] — Algorithm 4 is used in Linux and info-zip's zip and unzip.
* Barr, M. ([http://www.netrino.com/Connecting/1999-11/ ''1999-11''], [http://www.netrino.com/Connecting/1999-12/ ''1999-12''], [http://www.netrino.com/Connecting/2000-01/ ''2000-01'']) checksums, CRCs, and their source code. Embedded Systems Programming
* [http://www.codeproject.com/cpp/crc32.asp CRC32: Generating a checksum for a file], C++ implementation by Brian Friesen
* Online [http://serversniff.net/hash.php Tool to compute common CRCs (8/16/32/64) from strings]
* Online [http://www.zorc.breitbandkatze.de/crc.html CRC calculator]
* Online [http://www.easics.com/webtools/crctool CRC Tool: Generator of synthesizable CRC functions]
* [http://www.paulschou.com/tools/xlate/ Online Char (ASCII), HEX, Binary, Base64, etc... Encoder/Decoder with MD2, MD4, MD5, SHA1+2, CRC, etc. hashing algorithms]
* [http://apollo.backplane.com/matt/crc64.html CRC16 to CRC64 collision research]
* [http://sar.informatik.hu-berlin.de/research/publications/index.htm#SAR-PR-2006-05 Reversing CRC – Theory and Practice.]

{{math-stub}}

[[Category:校驗和演算法]]

[[bg:CRC]]
[[ca:Control de rendància cíclica]]
[[cs:Cyklický rendantní součet]]
[[de:Zyklische Rendanzprüfung]]
[[en:Cyclic rendancy check]]
[[es:Control de rendancia cíclica]]
[[eu:CRC]]
[[fi:CRC]]
[[fr:Contrôle de redondance cyclique]]
[[he:בדיקת יתירות מחזורית]]
[[id:CRC]]
[[it:Cyclic rendancy check]]
[[ja:巡迴冗長検査]]
[[ko:순환 중복 검사]]
[[nl:Cyclic Rendancy Check]]
[[pl:CRC]]
[[pt:CRC]]
[[ru:Циклический избыточный код]]
[[simple:Cyclic rendancy check]]
[[sk:Kontrola cyklickým kódom]]
[[sv:Cyclic Rendancy Check]]
[[vi:CRC]]

B. NLP第九篇-句法分析

句法分析的基本任務是確定句子的 語法結構 或句子中 詞彙之間的依存關系 。句法分析不是一個自然語言處理任務的最終目標,但它往往是實現最終目標的關鍵環節。

句法分析分為 句法結構分析 和 依存關系分析 兩種。以獲取整個句子的句法結構為目的的稱為 完全句法分析 ,而以獲得局部成分為目的的語法分析稱為 局部分析 ,依存關系分析簡稱 依存分析 。

一般而言,句法分析的任務有三個:

判斷輸出的字元串是否屬於某種語言

消除輸入句子中詞法和結構等方面的歧義

分析輸入句子的內部結構,如成分構成、上下文關系等。

第二三個任務一般是句法分析的主要任務。

一般來說,構造一個句法分析器需要考慮兩部分工作:一部分是語法的形式化表示和詞條信息描述問題,形式化的語法規則構成了規則庫,詞條信息等由詞典或同義詞表等提供,規則庫與詞典或同義詞表構成了句法分析的知識庫;另一部分就是基於知識庫的解析演算法了。

語法形式化屬於句法理論研究的范疇,目前在自然語言處理中廣泛使用的是上下文無關文法(CFG)和基於約束的文法,後者又稱合一文法。

簡單的講,句法結構分析方法可以分為基於規則的分析方法和基於統計的分析方法兩大類。

基於規則的句法結構分析方法的基本思路是,由人工組織語法規則,建立語法知識庫,通過條件約束和檢查來實現句法結構歧義的消除。

根據句法分析樹形成方向的區別,人們通常將這些方法劃分為三種類型:自頂向下的分析方法,自底向上的分析方法和兩者相結合的分析方法。自頂向下分析演算法實現的是規則推導的過程,分析樹從根結點開始不斷生長,最後形成分析句子的葉結點。而自底向上分析演算法的實現過程恰好想法,它是從句子符號串開始,執行不斷規約的過程,最後形成根節點。

基於規則的語法結構分析可以利用手工編寫的規則分析出輸入句子所有可能的句法結構;對於特定領域和目的,利用有針對性的規則能夠較好的處理句子中的部分歧義和一些超語法(extra-grammatical)現象。

但對於一個中等長度的輸入句子來說,要利用大覆蓋度的語法規則分析出所有可能的句子結構是非常困難的,而且就算分析出來了,也難以實現有效的消歧,並選擇出最有可能的分析結果;手工編寫的規則帶有一定的主觀性,還需要考慮到泛化,在面對復雜語境時正確率難以保證;手工編寫規則本身就是一件大工作量的復雜勞動,而且編寫的規則領域有密切的相關性,不利於句法分析系統向其他領域移植。

基於規則的句法分析演算法能夠成功的處理程序設計語言的編譯,而對於自然語言的處理卻始終難以擺脫困境,是因為程序設計語言中使用的知識嚴格限制的上下文無關文法的子類,但自然語言處理系統中所使用的形式化描述方法遠遠超過了上下文無關文法的表達能力;而且人們在使用程序設計語言的時候,一切表達方式都必須服從機器的要求,是一個人服從機器的過程,這個過程是從語言的無限集到有限集的映射過程,而在自然語言處理中則恰恰相反,自然語言處理實現的是機器追蹤和服從人的語言,從語言的有限集到無限集推演的過程。

完全語法分析

基於PCFG的基本分析方法

基於概率上下文無關文法的短語結構分析方法,可以說是目前最成功的語法驅動的統計句法分析方法,可以認為是規則方法與統計方法的結合。

PCFG是CFG的擴展,舉個例子:

PCFG

當然,同一個符號不同生成式的概率之和為1。NP是名詞短語、VP是動詞短語、PP是介詞短語。

基於PCFG的句法分析模型,滿足以下三個條件:

位置不變性:子樹的概率不依賴於該子樹所管轄的單詞在句子中的位置

上下文無關性:子樹的概率不依賴於子樹控制范圍以外的單詞

祖先無關性:子樹的概率不依賴於推導出子樹的祖先節點

根據上述文法,『He met Jenny with flowers』有兩種可能的語法結構:

而且我們可以通過將樹中的所有概率相乘,得到兩棵子樹的整體概率,從中選擇概率更大的子樹作為最佳結構。

與HMM類似,PCFG也有三個基本問題:

給定一個句子W=w1w2…wn和文法G,如何快速計算概率P(W|G)

給定一個句子W=w1w2…wn和文法G,如何選擇該句子的最佳結構?即選擇句法結構樹t使其具有最大概率

給定PCFG G和句子W=w1w2…wn,如何調節G的概率參數,使句子的概率最大

首先是第一個問題,HMM中我們用的是前向演算法和後向演算法來計算觀察序列O概率,相似的,這里我們用的是內向演算法和外向演算法來計算P(W|G) 。

首先我們定義內向變數αij(A),與前向變數相似但又有不同,αij(A)即非終結符A推導出W中字串wiw(i+1)…wj的概率。那P(W|G)自然就等於α1n(S)了,S是起始符號,計算的就是由起始符號S推導出整個句子W=w1w2…wn的概率。

所以只要有αij(A)的遞歸公式就能計算出P(W|G),遞歸公式如下:

根據定義,αii(A)自然就等同於符號A輸出wi的概率;而αij(A)的計算思路是,這個子串wiw(i+1)…wj可以被切成兩部分處理,前一部分wiw(i+1)…wk由非終結符號B生成,後一部分wkw(k+1)…wj由非終結符號C生成,而BC由A生成。這樣將概率依次相乘,即可將一個大問題劃分為兩個小問題處理,兩個小問題又可以進一步劃分直到不能劃分為止,然後遞歸回來得到結果。

這里給一張內向變數計算方法示意圖:

這個問題也可以用外向演算法來解決。

首先定義外向變數,βij(A)是,初始符號S在推導出語句W=w1w2…wn的過程中,產生符號串w1w2…w(i-1)Aw(j+1)…wn的概率(隱含著A會生成wiw(i+1)…wj)。也就是說βij(A)是S推導出除了以A節點為根節點的子樹以外的其他部分的概率。

《統計自然語言處理(第二版)》這本書里講錯了,這里我給出我自己的理解,書里給的演算法步驟如下:

很明顯的錯誤,初始化都把結果初始化了,那這個演算法還算什麼,直接等於1就完了唄。

這是作者對外向變數定義理解模糊的問題,上面給了外向變數的定義,裡面有一句話『隱含著A會生成wiw(i+1)…wj』,那問題在於,A會生成wiw(i+1)…wj,這到底算是條件還是推論。

看這個演算法的初始化的意思,說β1n(A),在A=S的時候,為1,不等於S為0,意思是什麼?意思就是『隱含著A會生成wiw(i+1)…wj』這句話是條件,β1n(S)已經隱含了S生成W=w1w2…wn了,所謂的w1w2…w(i-1)Aw(j+1)…wn也就不存在了,只剩下一個S->S了,所以概率自然為1。

但是在第三步這個地方,作者理解成什麼意思了呢?作者又把『隱含著A會生成wiw(i+1)…wj』這句話當成推論了,認為在β1n(S),里S會生成W=w1w2…wn是推論,那真是就正好了,要求的結果就是S生成W=w1w2…wn,這不就結束了嗎,結果就導致了這個演算法第一步初始化都把結果初始化了。

那我的理解是什麼呢,通過這個公式計算出來的β1n(S),確實是正確的,意義實際上也是包含了『隱含著A會生成wiw(i+1)…wj』這句話是推論,但是右側式子里由於不斷遞歸而產生的β1n(S),是把『隱含著A會生成wiw(i+1)…wj』這句話當條件的,所以計算上沒有問題。

我傾向於為第三步中的β1n(S)加一個星號,以表明意義的不同。

書中還給了個外向變數的計算方法示意圖,我覺得也是莫名其妙:

他說βij(A)是這兩種情況的概率和,這我們知道j比i大,那這圖里這個k既比i小又比j大,這不是搞笑嗎。只能說圖上這倆C就不是一個C,k也不是一個k。

那我為什麼會理解成一個呢,除了字母相同,他前面還這么講『必定運用了形如B->AC或者B->CA的規則』、『運用B->AC或者B->CA兩種規則的情況』,這明顯就是給人以順序交換的誤解。

另外,還在內向變數的使用上前後不一,可以說這本書里對外向演算法的講解是非常失敗的。而且對外向演算法的計算仍然需要用到內向演算法的遞歸,那真的直接用內向演算法就好了,外向演算法還要多定義變數。

然後是第二個問題,選擇句子的最佳結構,也即給定一個句子W=w1w2…wn和文法G,

選定擁有最大概率的語法結構樹。這一問題與HMM中類似,仍然採用動態規劃的思想去解決。最後利用CYK演算法去生成擁有最大概率的語法結構樹。

第三個問題是給定PCFG G和句子W=w1w2…wn,如何調節G的概率參數,使句子的概率最大,與HMM相對的,PCFG這里採用的演算法名叫內外向演算法。與前後向演算法相同,也屬於一種EM演算法,其基本思想是,首先給G的產生式隨機地賦予一個概率值(滿足歸一化條件),得到文法G0,然後根據G0和訓練數據,可以計算出每條規則使用次數的期望值,用期望值進行最大似然估計,得到語法G的新參數值,新的語法記作G1,然後循環執行該過程,G的參數概率將收斂於最大似然估計值。

PCFG只是一種特殊的上下文無關文法模型,根據PCFG的模型和句子,具體去對句子做語法分析,生成語法結構樹,靠的是還是CYK演算法。CYK演算法是一個用來判定任意給定的字元串W是否屬於一個上下文無關文法的演算法。

基於PCFG的句法分析模型存在有許多問題,比如因為PCFG沒有對詞彙進行建模,所以存在對詞彙信息不敏感的問題。因此人們提出了詞彙化的短語結構分析器,有效的提升了基於PCFG的句法分析器的能力。

而且,我們上面也提到了PCFG的三個獨立性假設,這也導致了規則之間缺乏結構依賴關系(就像HMM的三個假設也不完全合理一樣),而在自然語言中,生成每個非終結符的概率往往是與其上下文結構有關系的,所以有人提出了一種細化非終結符的方法,為每個非終結符標註上其父節點的句法標記信息。

D. Klein提出了帶有隱含標記的上下文無關文法(PCFG with latent annotations,PCFG-LA),使得非終結符的細化過程可以自動進行,並且在使用EM演算法優化時,為避免到達局部最優,對其進行了改進,提出了一種層次化的『分裂-合並』策略,以期獲取一個准確並且緊湊的PCFG-LA模型。基於PCFG-LA的Berkeley Parser作為非詞彙化句法分析器的代表,無論是性能表現還是運行速度,都是目前開源的短語結構分析器中最好的。其語法樹如下圖:

普通句法樹與PCFG-LA句法樹對照實例

這個x就是隱含標記,xi的取值范圍一般是人為設定的,一般取1~16之間的整數。而且PCFG-LA也類似於HMM模型,原始非終結符對應HMM模型中的觀察輸出,而隱含標記對應HMM模型中的隱含狀態。

淺層語法分析(局部語法分析)

由於完全語法分析要確定句子所包含的全部句法信息,並確定句子中各成分之間的關系,這是一項十分苦難的任務。到目前為止,句法分析器的各方面都難以達到令人滿意的程度,為了降低問題的復雜度,同時獲得一定的句法結構信息,淺層句法分析應運而生。

淺層語法分析只要求識別句子中的某些結構相對簡單的獨立成為,例如非遞歸的名詞短語、動詞短語等,這些被識別出來的結構通常稱為語塊(chunk)。

淺層句法分析將句法分析分解為兩個主要子任務,一個是語塊的識別和分析,另一個是語塊之間的依附關系分析。其中,語塊的識別和分析是主要任務。在某種程度上說,淺層句法分析使句法分析的任務得到了簡化,同時也有利於句法分析系統在大規模真實文本處理系統中迅速得到應用。

基本名詞短語(base NP)是語塊中的一個重要類別,它指的是簡單的、非嵌套的名詞短語,不含有其他子項短語,並且base NP之間結構上是獨立的。示例如下:

base NP識別就是從句子中識別出所有的base NP,根據這種理解,一個句子中的成分和簡單的分為baseNP和非base NP兩類,那麼base NP識別就成了一個分類問題。

base NP的表示方法有兩種,一種是括弧分隔法,一種是IOB標注法。括弧分隔法就是將base NP用方括弧界定邊界,內部的是base NP,外部的不屬於base NP。IOB標注法中,字母B表示base NP的開端,I表示當前詞語在base NP內,O表示詞語位於base NP之外。

基於SVM的base NP識別方法

由於base NP識別是多值分類問題,而基礎SVM演算法解決的是二值分類問題,所以一般可以採用配對策略(pairwise method)和一比其餘策略(one vs. other method)。

SVM一般要從上下文的詞、詞性、base NP標志中提取特徵來完成判斷。一般使用的詞語窗口的長度為5(當前詞及其前後各兩個詞)時識別的效果最好。

基於WINNOW的base NP識別方法

WINNOW是解決二分問題的錯誤驅動的機器學習方法,該方法能從大量不相關的特徵中快速學習。

WINNOW的稀疏網路(SNoW)學習結構是一種多類分類器,專門用於處理特徵識別領域的大規模學習任務。WINNOW演算法具有處理高維度獨立特徵空間的能力,而在自然語言處理中的特徵向量恰好具有這種特點,因此WINNOW演算法也常用於詞性標注、拼寫錯誤檢查和文本分類等等。

簡單WINNOW的基本思想是,已知特徵向量和參數向量和實數閾值θ,先將參數向量均初始化為1,將訓練樣本代入,求特徵向量和參數向量的內積,將其與θ比較,如果大於θ,則判定為正例,小於θ則判定為反例,將結果與正確答案作比較,依據結果來改變權值。

如果將正例估計成了反例,那麼對於原來值為1的x,把它的權值擴大。如果將反例估計成了正例,那麼對於原來值為1的x,把它的權值縮小。然後重新估計重新更改權重,直到訓練完成。

這其實讓我想到了LR演算法,因為LR演算法也是特徵向量與參數向量的內積,最後將其送到Sigmoid函數中去拿到判定結果,然後大於0.5的為正例,小於0.5的為反例,實際上只要反過來,Sigmod函數輸出0.5時候的輸入就是WINNOW演算法里的那個實數閾值θ。但是區別在於WINNOW演算法只判定大小,不判定概率,而LR利用Sigmoid函數給出了概率。LR利用這給出的概率,通過使訓練集的生成概率最大化來調整參數,而WINNOW則是直接樸素的錯誤情況來增大或縮小相關參數。目測LR因為使用了梯度下降,它的收斂速度要快於WINNOW,而WINNOW的優勢則在於可以處理大量特徵。

基於CRF的base NP識別方法

基於CRF的base NP識別方法擁有與SVM方法幾乎一樣的效果,優於基於WINNOW的識別方法、基於MEMM的識別方法和感知機方法,而且基於CRF的base NP識別方法在運行速度上較其他方法具有明顯優勢。

依存語法理論

在自然語言處理中,我們有時不需要或者不僅僅需要整個句子的短語結構樹,而且要知道句子中 詞與詞之間的依存關系 。用詞與詞之間的依存關系來描述語言結構的框架成為依存語法,又稱從屬關系語法。利用依存語法進行句法分析也是自然語言理解的重要手段之一。

有人認為,一切結構語法現象可以概括為關聯、組合和轉位這三大核心。句法關聯建立起詞與詞之間的從屬關系,這種從屬關系由 支配詞 和 從屬詞 聯結而成, 謂語中的動詞是句子的中心並支配別的成分,它本身不受其他任何成分支配 。

依存語法的本質是一種結構語法,它主要研究以謂詞為中心而構句時由深層語義結構映現為表層語法結構的狀況及條件,謂詞與體詞之間的同現關系,並據此劃分謂詞的詞類。

常用的依存於法結構圖示有三種:

計算機語言學家J. Robinson提出了依存語法的四條公理:

一個句子只有一個獨立的成分

句子的其他成分都從屬於某一成分

任何一個成分都不能依存於兩個或兩個以上的成分

如果成分A直接從屬於成分B,而成分C在句子中位於A和B之間,那麼,成分C或者屬於成分A,或者從屬於B,或者從屬於A和B之間的某一成分。

這四條公理相當於對依存圖和依存樹的形式約束:單一父節點、連通、無環和可投射,由此來保證句子的依存分析結果是一棵有根的樹結構。

這里提一下可投射,如果單詞之間的依存弧畫出來沒有任何的交叉,就是可投射的(參考上面的兩個有向圖)。

為了便於理解,我國學者提出了依存結構樹應滿足的5個條件:

單純結點條件:只有終結點,沒有非終結點

單一父結點條件:除根節點沒有父結點外,所有的結點都只有一個父結點

獨根結點條件:一個依存樹只能有一個根結點,它支配其他結點

非交條件:依存樹的樹枝不能彼此相交

互斥條件:從上到下的支配關系和從左到右的前於關系之間是相互排斥的,如果兩個結點之間存在著支配關系,它們就不能存在於前於關系

這五個條件是有交集的,但它們完全從依存表達的空間結構出發,比四條公理更直觀更實用。

Gaifman 1965年給出了依存語法的形式化表示,證明了依存語法與上下文無關文法沒有什麼不同..

類似於上下文無關文法的語言形式對被分析的語言的投射性進行了限制,很難直接處理包含非投射現象的自由語序的語言。20世紀90年代發展起來了約束語法和相應的基於約束滿足的依存分析方法,可以處理此類非投射性語言問題。

基於約束滿足的分析方法建立在約束依存語法之上,將依存句法分析看做可以用約束滿足問題來描述的有限構造問題。

約束依存語法用一系列形式化、描述性的約束將不符合約束的依存分析去掉,直到留下一棵合法的依存樹。

生成式依存分析方法、判別式依存分析方法和確定性依存分析方法是數據驅動的統計依存分析中具有代表性的三種方法。

生成性依存分析方法

生成式依存分析方法採用聯合概率模型生成一系列依存語法樹並賦予其概率分值,然後採用相關演算法找到概率打分最高的分析結果作為最後輸出。

生成式依存分析模型使用起來比較方便,它的參數訓練時只在訓練集中尋找相關成分的計數,計算出先驗概率。但是,生成式方法採用聯合概率模型,再進行概率乘積分解時做了近似性假設和估計,而且,由於採用全局搜索,演算法的復雜度較高,因此效率較低,但此類演算法在准確率上有一定優勢。但是類似於CYK演算法的推理方法使得此類模型不易處理非投射性問題。

判別式依存分析方法

判別式依存分析方法採用條件概率模型,避開了聯合概率模型所要求的獨立性假設(考慮判別模型CRF舍棄了生成模型HMM的獨立性假設),訓練過程即尋找使目標函數(訓練樣本生成概率)最大的參數θ(類似Logistic回歸和CRF)。

判別式方法不僅在推理時進行窮盡搜索,而且在訓練演算法上也具有全局最優性,需要在訓練實例上重復句法分析過程來迭代參數,訓練過程也是推理過程,訓練和分析的時間復雜度一致。

確定性依存方法

確定性依存分析方法以特定的方向逐次取一個待分析的詞,為每次輸入的詞產生一個單一的分析結果,直至序列的最後一個詞。

這類演算法在每一步的分析中都要根據當前分析狀態做出決策(如判斷其是否與前一個詞發生依存關系),因此,這種方法又稱決策式分析方法。

通過一個確定的分析動作序列來得到一個唯一的句法表達,即依存圖(有時可能會有回溯和修補),這是確定性句法分析方法的基本思想。

短語結構與依存結構之間的關系

短語結構樹可以被一一對應地轉換成依存關系樹,反之則不然。因為一棵依存關系樹可能會對應多棵短語結構樹。

閱讀全文

與cyk演算法實現相關的資料

熱點內容
排課走班源碼 瀏覽:222
程序員剛畢業去了小公司有發展嗎 瀏覽:90
速騰怎麼安裝安卓手機互聯 瀏覽:143
linux設備驅動程序代碼 瀏覽:301
伺服器的功耗怎麼看 瀏覽:651
app組件哪裡找 瀏覽:87
androidqq紅包 瀏覽:412
伺服器如何傳輸 瀏覽:456
如何快速將多個文件夾快速解壓縮 瀏覽:114
程序員睡前都在想什麼 瀏覽:37
少兒編程技能培訓心得 瀏覽:458
白命令 瀏覽:816
headfirstjavapdf 瀏覽:552
廣數980t怎麼編程 瀏覽:592
無邪app在哪裡下載 瀏覽:462
mac自帶php目錄 瀏覽:632
海淘小程序源碼 瀏覽:750
哪裡下載蘇寧秒達app 瀏覽:643
androidcmnet 瀏覽:31
易語言標題源碼 瀏覽:948