2012-02-23 57 views
1

有沒有可能在F#中使用正則表達式而不使用正則表達式?一個詞沒有正則表達式的詞幹

我想知道如何編寫一個輸入字符串並阻止它的F#函數。

例如。

input = "going" 
output = "go" 

我無法找到一個方法來編寫代碼,而無需使用正則表達式:* ING \ B和替換功能,這將是幾乎像在C#這樣做沒有任何優勢。

什麼,我想寫

半僞代碼是:

let stemming word = 
    match word 
    |(word-"ing")+ing -> (word-"ing") 
+0

是的,你可以。但是你怎樣才能解決這些動詞:「死亡」,「希望」和「慢跑」? – pad 2012-02-23 14:17:25

+0

是的。即時嘗試實現一個簡單的詞幹開始。那麼我就會增加更多的條件。 – codious 2012-02-23 14:22:49

+0

@pad對於那些cud使用 - >(word-「ing」)+「e」?和(字 - 「ing」) - 「g」等 – codious 2012-02-23 14:25:16

回答

2

這裏是應用最簡單的所產生規則的函數:

let (|Suffix|_|) (suffix: string) (s: string) = 
    if s.EndsWith(suffix) then 
     Some(s.Substring(0, s.Length - suffix.Length)) 
    else 
     None 

let stem = function 
    | Suffix "ing" s -> s 
    | _ -> failwith "Not ending with ing" 

Parameterized active patterns使得模式匹配更加易讀並且在這種情況下更方便。如果幹擾規則變得複雜,則可以更新活動模式以保持stem函數不變。

+0

完美。這是我搜索如何使用字符串庫和活動模式。 – codious 2012-02-23 15:10:22

4

谷歌搜索快速位顯示是多麼複雜的詞幹是: http://en.wikipedia.org/wiki/Stemming

的標準似乎是「波特算法「,似乎有幾個人已將它移植到.NET中,我在」The Porter Stemming Algorithm「主頁上計算了兩個C#版本和一個VB.net版本: http://tartarus.org/martin/PorterStemmer/

I將使用F#中的這些庫中的一個來進行阻塞。

+0

這總是一個選項。但對於實驗性工作,你可以推薦什麼方法?解析單詞並執行子字符串搜索,然後手動替換索引? – codious 2012-02-23 14:34:41

+1

是的,可能F#的列表切片給出了訪問子字符串的不錯方法:http://blogs.msdn.com/b/chrsmith/archive/2008/12/09/f-zen-array-slices.aspx – Robert 2012-02-23 14:40:12

+0

感謝您的鏈接。 – codious 2012-02-23 15:13:49