2013-10-02 52 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

非常感谢。我无法投票,因为我需要更多的声誉。无论如何,你的代码是完美的,谢谢 –

相关问题