在没有正则表达式的情况下扼杀一个词

时间:2012-02-23 14:03:24

标签: f# f#-scripting

是否可以在F#中使用Regex来阻止单词?

我想知道如何编写一个F#函数来输入一个字符串并使其起作用。

例如

input = "going"
output = "go"

我无法在不使用正则表达式的情况下找到编写代码的方法:。* ing \ b和replace函数几乎就像在C#中一样没有任何优势。

我想写的半伪代码是:

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

2 个答案:

答案 0 :(得分:4)

谷歌搜索的一小部分揭示了干扰的复杂程度: http://en.wikipedia.org/wiki/Stemming

标准似乎是“Porter算法”,似乎有几个人将它移植到.NET,我在“The Porter Stemming Algorithm”主页上计算了两个C#版本和一个VB.net版本: http://tartarus.org/martin/PorterStemmer/

我会使用F#中的其中一个来完成词干。

答案 1 :(得分: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功能不变。