M函数名词频统计

题目:

经常有小伙伴问:哎呀M里怎么有这么多函数?那么多单词你们是怎么记的?
单词虽然看上去挺多,但大部分都是很简单并且在其他语言中也经常出现的词。
不管怎么说,要学好M,第一课就是——背单词,多学点单词总是有好处的。
今天就来做一个如下图的M函数的词频统计,在练习统计方法的同时还能学单词,一举两得~

思路:

第一步:我们知道输入= #shared会返回所有函数名和帮助说明,可以从中提取出函数名作为数据源。
第二步:然后要做的就是分词。所有函数名都是"类.函数"的格式,我们可以很容易把点的左右两边拆开。但是我们想要的是把每个单词拆开,而M函数中每个单词首字母都是大写的,在此我采用的方法是使用List.Accumulate批量替换,在每个大写字母之前插入一个点,这样就能把每个单词分开了。
第三步:先把整个list合并成一个文本,然后按点再拆分为list。
第四步:把list中的无效值筛选掉,然后转为table。
第五步:将单词按出现次数分组,得到词频,并按照词频降序排列。
第六步:使用《使用PQ调用API》中介绍的方法,调用有道API,把英文单词翻译为中文。

let
    函数名 = Record.FieldNames(#shared),
    批量替换 = List.Transform(函数名,each List.Accumulate({"A".."Z"},_,(x,y)=>Text.Replace(x,y,"."&y))),
    拆分 = Text.Split(Text.Combine(批量替换),"."),
    筛选 = Table.FromColumns({List.Select(拆分,each _<>"" and _<>"查询1")},{"单词"}),
    分组排序 = Table.Buffer(Table.Sort(Table.Group(筛选, {"单词"}, {"词频",Table.RowCount}),{"词频",1})),
    翻译 = Table.AddColumn(分组排序, "翻译", each Json.Document(Web.Contents("http://fanyi.youdao.com/openapi.do?keyfrom=neverland&key=969918857&type=data&doctype=json&version=1.1&q="&[单词]))[translation]{0})
in
    翻译

PS:函数中有些单词是缩写,另外有些词有多个意思,所以机器翻译稍有偏差也在所难免。该API每个key每小时调用的限额为1000次,这里有400多条记录也就说刷新两次就没了。。。如果自己测试的时候翻译那一步报错也很正常,最好是自己去申请一个key。

One Reply to “M函数名词频统计”

  1. 利用拆分器,“批量替换”和“拆分”这两步也可以改成这样:
    批量替换 = List.Transform(函数名,each Splitter.SplitTextByCharacterTransition({"a".."z"}, {"A".."Z"})(Text.Replace(_,".",""))),
    拆分 = List.Combine(批量替换),

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注