显示str的次数

时间:2018-11-09 20:13:54

标签: f#

我已经实现了读取.txt文件并将其转换为字符串的功能。

从这里开始,我需要帮助收集单词显示的次数。

但是我不确定从这里可以去哪里,对任何要点的任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

然后逐步进行此操作,为每个位创建一个函数:

  

将以大写字母开头的单词转换为小写字母,以便所有单词均为小写字母。

将字符串分割成单词序列:

let getWords (s: string) = 
    s.Split(' ')

将“ hello world”切换为["hello"; "world"]

  

对单词显示的次数进行排序。从这个意义上说,一个单词是没有空格或标点符号(!#=等)的字符序列

第1部分:将单词格式化为小写而无标点:

let isNotPunctuation c = 
    not (Char.IsPunctuation(c))

let formatWord (s: string) = 
    let chars = 
        s.ToLowerInvariant()
        |> Seq.filter isNotPunctuation
        |> Seq.toArray

    new String(chars)

打开“你好!”进入“你好”。

第2部分:按单词的格式将其分组。

let groupWords (words: string seq) = 
    words
    |> Seq.groupBy formatWord

这将返回一个元组,第一部分为键(formatWord),第二部分为单词列表。

["hello"; "world"; "hello"]变成

[("hello", ["hello"; "hello"]);
 ("world", ["world"])]
  

从显示的最常见单词到不太频繁的单词排序。

let sortWords group = 
    group
    |> Seq.sortByDescending (fun g -> Seq.length (snd g))

将列表的降序排列(从大到大),再排第二部分的length(项)-请参见上面的表示形式。

现在我们只需要清理输出:

let output group =
    group
    |> Seq.map fst

这将从组中选择元组的第一部分:

("hello", ["hello"; "hello"])变成“你好”。


现在我们拥有所有功能,我们可以将它们捆绑在一起成为一个链:

let s = "some long string with some repeated words again and some other words"

let finished = 
    s
    |> getWords
    |> groupWords
    |> sortWords
    |> output

printfn "%A" finished
//seq ["some"; "words"; "long"; "string"; ...]

答案 1 :(得分:1)

这是使用正则表达式的另一种方式

open System.Text.RegularExpressions

let str = "Some (very) long string with some repeated words again, and some other words, and some punctuation too."

str 
|> (Regex @"\W+").Split
|> Seq.choose(fun s -> if s = "" then None else Some (s.ToLower()))
|> Seq.countBy id
|> Seq.sortByDescending snd