[英]Need Help Converting some F# code to C#
我正在使用F#书进行机器学习。 我将F#代码转换为C#并进行了教程,因为我不太了解F#。 我真的陷入了代码的一部分,想知道是否有人可以告诉我如何用C#编写代码。 即使只是解释代码在F#中的功能也将有所帮助。
let tokenScore (group:DocsGroup) (token:Token) =
if group.TokenFrequencies.ContainsKey token
then log group.TokenFrequencies.[token]
else 0.0
let score (document:TokenizedDoc) (group:DocsGroup) =
let scoreToken = tokenScore group
log group.Proportion +
(document |> Seq.sumBy scoreToken)
我真的坚持
let scoreToken = tokenScore group
log group.Proportion +
(document |> Seq.sumBy scoreToken)
这是.Net开发人员机器学习项目中的教程-第2章。如果可以帮助我,那真是太好了。 提前致谢
F#函数是咖喱的 。 这意味着,如果使用两个参数声明一个函数,而仅用一个参数调用它,则结果是一个参数的另一个函数 。 这是一个例子:
let add x y = x + y
let n = add 2 3 // Now n has the value 5
let addFive = add 5 // This is a *function* that takes one parameter
let altAddFive y = add 5 y // Another way to define the same thing
let result = addFive 3 // Now result has the value 8
let altResult = altAddFive 3 // This one also has the value 8
因此,在score
函数中,名称scoreToken
现在是指一个具有一个参数的函数,然后使用两个参数调用tokenScore
: group
和刚刚传递的值。 换句话说, scoreToken
的定义可以写成:
let scoreToken token = tokenScore group token
那将是同一回事。
现在下一行。 首先, log
是自然对数函数 ,通常以数学符号ln
表示。 它采用一个浮点数,并返回一个浮点数。 运算符优先级的F#中的规则是该函数调用比运营商优先级更高 ,因此log 3.0 + 5.0
将被解释为(log 3.0) + 5.0
,这不会是相同的值作为log 8.0
。 因此,以下几行:
log group.Proportion +
(document |> Seq.sumBy scoreToken)
等效于:
let score1 = log group.Proportion
let score2 = document |> Seq.sumBy scoreToken
score1 + score2
最后, document |> Seq.sumBy scoreToken
行也可能使您感到困惑。 它有两个部分。 首先, Seq.sumBy
与LINQ Sum
方法的两参数版本等效,但是F#中的参数顺序与C#中的参数顺序相反。 F# Seq.sumBy
函数采用两个参数; 首先,应应用于每个元素以产生值的函数,其次是元素序列。 即,如果您在不使用|>
运算符的情况下调用它,则它将看起来像这样:
Seq.sumBy scoreToken document
这将遍历document
序列(其类型为TokenizedDoc
并且鉴于其使用方式,显然可以视为令牌序列)。 对于文档中的每个令牌,将调用scoreToken
函数(如果您还记得,调用scoreToken t
,其中t
是某些令牌,与调用tokenScore group t
相同)。 该调用将产生一个浮点值。 最后,所有浮点值将被加在一起以产生最终分数。
但是,在F#中,传统上在对序列求和或执行类似操作时使用“ pipe”运算符|>
: document |> Seq.sumBy scoreToken
与Seq.sumBy scoreToken document
完全等效。 |>
运算符在另一个SO问题的答案中作了很好的解释,因此在此我将不重复该答案。
因此,此功能正在执行的操作是获取group.Proportion
值的自然对数,并将其添加到文档中每个标记的分数中。 加法的结果是函数中的最后一个表达式,所以这就是函数的结果:在F#中,与C#不同,您不需要在函数末尾键入return
。 ( return
关键字在F#中具有不同的含义,由于这是一个完全不同的主题,因此我现在不再赘述)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.