XQuery统计XML文本中单词后续词频率结果错误问题排查
错误原因
原有代码的计数逻辑存在问题:count() 函数会统计序列中所有项的总数量,你在统计频次的for循环中,每次都会返回一个eq判断得到的布尔值(true/false),无论判断结果是否为真,都会被算作序列的一项计入总数,因此最终所有关联词的计数都等于"has"的总出现次数26。
修正方案
你可以先一次性收集所有符合条件的后续词汇,再基于这个统一的序列做去重和计数,不仅逻辑更清晰,也避免重复遍历XML节点提升执行效率,修改后代码如下:
let $all_w_nodes := doc("C:/Users/money/Desktop/xml/files/KS0.xml")/bncDoc/stext/div/u/s/w (: 先提取所有值为"has"的<w>节点对应的下一个相邻节点归一化内容 :) let $follow_word_list := for $node in $all_w_nodes where $node/text() = "has" return normalize-space(lower-case($node/following-sibling::node()[1])) return for $word in distinct-values($follow_word_list) (: 直接统计目标词在预生成的后续词列表中的出现次数 :) let $count := count($follow_word_list[. = $word]) return concat($word, " ", $count)
如果你只想修改原有代码的计数部分,只需把判断条件移到for循环的where子句中,只返回符合匹配要求的节点即可,修改后的计数行如下:
let $count := count(for $node in $file where $node[text()] = "has" and normalize-space(lower-case($node/following-sibling::node()[1])) eq $value return $node)
内容的提问来源于stack exchange,提问作者Ali Umer
相关产品推荐
相关产品推荐

