gpt4 book ai didi

f# 迭代两个数组,使用来自 c# 库的函数

转载 作者:行者123 更新时间:2023-12-04 16:56:36 39 4
gpt4 key购买 nike

我有一个单词列表和一个相关词性标签列表。我想同时(匹配索引)使用每个索引元组作为 .NET 函数的输入对两者进行迭代。这是最好的方法吗(它有效,但对我来说并不自然):

let taggingModel = SeqLabeler.loadModel(lthPath + 
"models\penn_00_18_split_dict.model");
let lemmatizer = new Lemmatizer(lthPath + "v_n_a.txt")
let input = "the rain in spain falls on the plain"

let words = Preprocessor.tokenizeSentence( input )
let tags = SeqLabeler.tagSentence( taggingModel, words )
let lemmas = Array.map2 (fun x y -> lemmatizer.lookup(x,y)) words tags

最佳答案

您的代码对我来说看起来很不错 - 其中大部分处理一些加载和初始化,因此您可以做很多事情来简化该部分。替代 Array.map2 ,您可以使用 Seq.zip结合 Seq.map - zip函数将两个序列组合成一个包含具有匹配索引的元素对的单个序列:

let lemmas = Seq.zip words tags 
|> Seq.map (fun (x, y) -> lemmatizer.lookup (x, y))

lookup函数接受一个你得到的元组作为参数,你可以写:
// standard syntax using the pipelining operator
let lemmas = Seq.zip words tags |> Seq.map lemmatizer.lookup

// .. an alternative syntax doing exactly the same thing
let lemmas = (words, tags) ||> Seq.zip |> Seq.map lemmatizer.lookup
||>第二个版本中使用的运算符接受一个包含两个值的元组,并将它们作为两个参数传递给右侧的函数,这意味着 (a, b) ||> f意味着 f a b . |>运算符在左边只取一个值,所以 (a, b) |> f将意味着 f (a, b) (如果函数 f 期望元组而不是两个,空格分隔的参数,这将起作用)。

如果您需要 lemmas要成为最后的数组,您需要添加 Array.ofSeq到处理管道的末尾(所有 Seq 函数都使用序列,对应于 IEnumerable<T> )

另一种选择是使用序列表达式(如果需要,可以使用 [| .. |] 直接构造数组):
let lemmas = [| for wt in Seq.zip words tags do // wt is tuple (string * string)
yield lemmatizer.lookup wt |]

是否使用序列表达式 - 这只是个人喜好。在这种情况下,第一个选项似乎更简洁,但对于不太熟悉部分函数应用程序等事物的人来说,序列表达式可能更具可读性(在较短的版本中使用 Seq.map )

关于f# 迭代两个数组,使用来自 c# 库的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2853833/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com