什麼是SED?
SED這個程式是一個典型的command line的程式。在command line上打「sed 你要電腦做什麼的指令 檔名」即可。但是要記得,當我們在Windows系統下安裝模擬Mac系統的程式時,我們要把處理的檔案,放在「Cigwin/home/user」下,才能使用。如果還是不行,請到「控制台/系統/進階/編輯」下,建立一個新的路徑「C:/pdp++/bin/CYGWIN」,注意,路徑和路徑中間要用「;」做區隔唷!
沈老師為我們介紹了最基本的Regular Expression,
/………/ 對要做的東西,以夾註表示。
^ 行開頭。
$ 行結尾。
並請我們舉一反三地想想看「/^$/」代表什麼呢?各位看倌,您猜出來了嗎?您想想行開頭和行結尾中沒有任何東西、內容,所以,這個Regular Expression代表「空行」。
做做SED的練習題:
在做練習之前,請先首先,安裝好Cygwin這個程式。並下載syn_trees這個檔案,並把它存在你的Cigwin/home/user的檔案夾下。
Step 1:
1. 開啟Cygwin,並在上面的command下輸入「sed ‘/^$/p’ syn_trees」(這裡的p是print的意思。)
2. 你會看到畫面上無數的檔案瘋狂的跑,這些檔案也就是…………….??(這些在跑的檔案,是syn_trees 這個檔案下,所有的空行嗎?)
3. 此時如果希望畫面停止,請按「Ctrl+c」即可。
Step 2:
1. sed ‘/^$/d’ syn_trees|sort|uniq –c|sort –n –r>result
2. 接著到開啟檔案總管,到Cygwin/bin/result,用windows的wordpad開啟這個檔案,即可見結果。 (這些結果是什麼東西呢?)
接著,我們再進ㄧ步多了解一些Regular Expression。
. 任意字元
\ 換行。Enter是控制字元(control sequence),但是若在我們的text中,就包含這些控制字元,我們就要把text中的這些字元放在\下,告訴電腦我放在這裡面的不是控制字元,而是我資料text的一部份。
* 重複。例如,aaab, aaaaaaab我們都可以標示為a*b,以表示a重複了好幾次。
^ 字首的定址符號anchor。
$ 行尾的定址符號anchor。
[] 代表可以放什麼東西。但是每一個程式的環境不同,而R.E.就會因環境不同而有些許不同。例如說在「…..意義是什麼?」 ?…系統下,是以以下的R.E.表示「/^[:ulnwn:]*$/」,但在另ㄧ個系統下,卻是以下的R.E.表示「/^[0-9 a-b A…]/」,我們可以清楚的看出不同的環境下表示法就不一樣。
Step 3: 把syn_trees這個程式裡所有的數字找出來,要打什麼指令呢?(結合awk和sed的工具。)
1. 首先我們先用wordpad打開syn_trees這個檔案。
2. 我們可以看出每個字,都是以____-_____-___的方式表現的。最後一格的地方是數字。也就是我們要的地方,所以現在我們要做的事,是把我們要找的東西用R.E.表示出來告訴電腦,我們要做的是什麼?
3. 輸入以下指令「awk ‘{for (i=1;i<=NF;i++){print $i}}’ syn_trees| sed ‘s/^.*[^-]-\([-0-9]*\)$/\1/’|less」。
\(….\) 把括號裡的變數存起來。
s/……./\1/,把裡面的東西replace存起來。
4. 畫面上就會出現在syn_trees中,我們要找的數字。
我們都知道Sà W1,W2,W3,…,Wn,一個句子是由一個字一個字組成的。 而認知語言學研究的就是人腦如何去處理語言,而類神經網路,就是以電腦建構一個類似類神經網路的架構,去教會電腦像人類一樣有學習的能力。而回歸到我們的主題,Autotagger, 就是教電腦如何看到一個字W1,就知道它的tag是什麼?而看到W2,就知道它的tag是什麼?我們可以用Trigram來預測class tag。
所以我們要見一個trigramàCT,來做autotagger的。而gram是以看的字為主要點。我們逐一介紹:
Zero gramà從corpus的觀念來的,所有的字都一樣。
Unigramà及一個字出現的頻率,100個字中,「我」出現10次,那麼其unigram就是10/100。
Bigramà
TrigramàW1,W2,W3,W4,如果我們要看W2這個字時,我們會連它的前後鄰居一起看。
其實,中文比較不會受前後的字影響,所以一般中文的語音辨識,目前用bigram正確率就很高、很有效率了,但是英文容易受前後的字影響,所以一定要用trigram辨識度才夠。
今日習題:
@_@1. 怎麼去抓blw_100這個檔案裡的unigram呢?用awk怎麼抓?
@_@2. 怎麼抓trigram呢?
Awk ______ {for(i=1;i<=NF;i++){print$(i-1),$i,$(+1)}}|sort|uniq –c|
底線中要填什麼呢?然後用sed再做一件事。做什麼呢?