如何使用filter从文本词对统计数据中查询指定单词的相邻词及出现频次
实现方案
你可以通过「筛选+映射」的组合逻辑完成需求,这里提供两种写法:
写法1:列表推导式(更简洁)
neighbours pairs c = [ (neighbour, cnt) | ((w1, w2), cnt) <- pairs, w1 == c || w2 == c, let neighbour = if w1 == c then w2 else w1 ]
逻辑说明:
- 遍历所有词对频次条目,先筛选出包含目标词
c的条目 - 对符合条件的条目,取出和
c配对的另一个词,和对应频次组成新的元组
写法2:filter + map 组合(匹配你最初的思路)
你最初的filter条件逻辑写反了,我们需要保留包含目标词的条目,所以匹配条件是两个词任意一个等于目标词即可:
neighbours pairs c = map extract $ filter match pairs where -- 筛选包含目标词c的词对条目 match ((w1, w2), _) = w1 == c || w2 == c -- 转换格式,取出相邻词和对应频次 extract ((w1, w2), cnt) = if w1 == c then (w2, cnt) else (w1, cnt)
效果验证
用你给出的测试用例调用:
neighbours [(("red","car"),2),(("house","red"),1)] "red"
返回结果为[("car",2),("house",1)],完全符合需求。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

