F# 显示str的次数

F# 显示str的次数,f#,F#,我制作了一个函数来读取.txt文件并将其转换为字符串 从这里我需要帮助收集一个单词的显示次数 但是我不确定从这里到哪里去,我们非常感谢您对任何bulletpoints的任何帮助。让我们一步一步地完成这个步骤,为每个位创建一个函数: 将以大写字母开头的单词转换为小写单词,以便所有单词都是小写字母 将字符串拆分为一系列单词: let getWords (s: string) = s.Split(' ') 将“hello world”转换为[“hello”;“world”] 对单词的显示次

我制作了一个函数来读取.txt文件并将其转换为字符串

从这里我需要帮助收集一个单词的显示次数


但是我不确定从这里到哪里去,我们非常感谢您对任何bulletpoints的任何帮助。

让我们一步一步地完成这个步骤,为每个位创建一个函数:

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

将字符串拆分为一系列单词:

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", ["hello"; "hello"]);
 ("world", ["world"])]
从显示的最频繁的单词和较不频繁的单词进行排序

根据第二部分中项目的
长度
(计数)对列表进行降序排序(第一大)-请参见上面的表示

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

let output group =
    group
    |> Seq.map fst
这将从组中拾取元组的第一部分:

(“hello”、[“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"; ...]

然后,让我们一步一步地完成这个步骤,为每个位创建一个函数:

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

将字符串拆分为一系列单词:

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", ["hello"; "hello"]);
 ("world", ["world"])]
从显示的最频繁的单词和较不频繁的单词进行排序

根据第二部分中项目的
长度
(计数)对列表进行降序排序(第一大)-请参见上面的表示

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

let output group =
    group
    |> Seq.map fst
这将从组中拾取元组的第一部分:

(“hello”、[“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"; ...]

这里有另一种使用正则表达式的方法

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

这里有另一种使用正则表达式的方法

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

我没有投反对票,但投反对票的人很可能投了反对票,因为你要求别人写一些代码,而没有展示你的尝试。看来你对F#还不熟悉,我给出了一个答案,解释了一种解决这个问题的方法,即用函数的方式思考。希望这是一个跳板,能让你用F#解决问题。当F#在.NET上运行时,你有时可以从C#中获得灵感(比如标点符号代码)。啊,好的。我应该这么说。我已经试过了,我可以拆分字符串,这样它就可以打印单词而不是字符,但我想这会让我的帖子变得混乱,因为我写的代码很难看。我也在尝试使用正则表达式。Escape至少可以计算一个单词的出现次数,我看到了这一点:发布你所拥有的东西总是有帮助的。。。当你知道你在寻找什么并且想要计算的时候,这个代码就可以使用了。它可以用来解决你的问题,但如果你想计算所有的实例,我总是希望groupBy来计算。我没有投反对票,但投反对票的人很可能投了反对票,因为你要求别人写一些代码,而没有显示你的尝试。看来你对F#还不熟悉,我给出了一个答案,解释了一种解决这个问题的方法,即用函数的方式思考。希望这是一个跳板,能让你用F#解决问题。当F#在.NET上运行时,你有时可以从C#中获得灵感(比如标点符号代码)。啊,好的。我应该这么说。我已经试过了,我可以拆分字符串,这样它就可以打印单词而不是字符,但我想这会让我的帖子变得混乱,因为我写的代码很难看。我也在尝试使用正则表达式。Escape至少可以计算一个单词的出现次数,我看到了这一点:发布你所拥有的东西总是有帮助的。。。当你知道你在寻找什么并且想要计算的时候,这个代码就可以使用了。它可以用来解决你的问题,但如果你想计算所有的实例,我总是更喜欢用groupBy来计算。哇!非常感谢你,戴夫,我在这里学到了很多!这里有很多我不知道的地方,所以我会再读几遍你的答案。哇!非常感谢你,戴夫,我在这里学到了很多!这里有很多我不知道的地方,所以我会再读几遍你的答案。