作为练习的一部分,为了更好地理解我目前正在学习的 F#,我编写了将给定字符串拆分为 n-gram 的函数。
1)我想收到关于我的功能的反馈:这可以写得更简单或更有效吗?
2)我的总体目标是编写基于 n-gram 相似度返回字符串相似度(在 0.0 .. 1.0 范围内)的函数;这种方法是否适用于短字符串比较,或者这种方法可以可靠地用于比较大字符串(例如文章)。
3) 我知道 n-gram 比较忽略两个字符串的上下文这一事实。你会建议什么方法来实现我的目标?
//s:string - target string to split into n-grams
//n:int - n-gram size to split string into
let ngram_split (s:string, n:int) =
let ngram_count = s.Length - (s.Length % n)
let ngram_list = List.init ngram_count (fun i ->
if( i + n >= s.Length ) then
s.Substring(i,s.Length - i) + String.init ((i + n) - s.Length)
(fun i -> "#")
else
s.Substring(i,n)
)
let ngram_array_unique = ngram_list
|> Seq.ofList
|> Seq.distinct
|> Array.ofSeq
//produce tuples of ngrams (ngram string,how much occurrences in original string)
Seq.init ngram_array_unique.Length (fun i -> (ngram_array_unique.[i],
ngram_list |> List.filter(fun item -> item = ngram_array_unique.[i])
|> List.length)
)