2013-10-02 50 views
0

我正在使用f#查找給定字符串或文本中的短語以及每個短語的頻率。查找字符串中的短語和每個短語的頻率

該短語將2個或更多的單詞。

我知道如何在其他語言中使用它,但我對F Sharp的匿名函數很感興趣,目前我正在學習和發現它。

這是一個非常複雜和有用的想法,因爲短語包含兩個或更多單詞。

我有什麼至今:

let containsPhrase (phrase:string) (text:string) = 

    let rec contains index = 
     if index <= text.Length - phrase.Length then compare index 
     else false 
    and compare index =   
     if String.Compare(text, index, phrase, 0, phrase.Length) <> 0 
     then nextWord index 
     else true 
    and nextWord index = 
     let index = text.IndexOf(' ', index) 

     if index >= 0 then  
      contains (index+1) 
     else 
     false    
    contains 0 

let Phrases = ["Good morning";"Take care";"black Friday"] 

for phrase in Phrases do 
    printfn "[%A] was found %b" phrase (containsPhrase (phrase.ToLower()) text) 

我能找到一個解決方案,對這個問題的第一部分,但我覺得很多嘗試後輸給計算每個詞組是多少字符串中使用。

上面的代碼可以檢查任何給定的短語是否在字符串中。

任何人都可以請幫我添加一個計數器的每個短語的頻率?

回答

0

像這樣?

let text = """ 
Good morning Take care black Friday 
Good morning Take care black Friday 
Good morning Take care black Friday 
Good morning Take care black Friday 
Good morning Take care black Friday 
""" 

let phrases = ["Good morning";"Take care";"black Friday"] 

let occurrences (phrase: string) = 
    let rec loop (index: int) count = 
    match text.IndexOf(phrase, index) with 
    | -1 -> count 
    | n -> loop (n + phrase.Length) (count + 1) 
    loop 0 0 

phrases |> List.map (fun s -> s, occurrences s) 
> val it : (string * int) list = 
    [("Good morning", 5); ("Take care", 5); ("black Friday", 5)] 
+0

非常感謝。我無法投票,因爲我需要更多的聲譽。無論如何,你的代碼是完美的,謝謝 –