分词词频统计

网上随便找段文字,就以Power BI官网上这段文字为例好了:

想要统计其中的词频,实现如下图的效果:

解法1:使用输入法词库

其中的难点无疑在分词了,中文不像英文可以按空格拆开分词,仅仅单靠Power Query中的功能遇到这种问题好像没法搞,因为它不知道你要按什么规则来拆,不知道哪几个字连起来算一个词。
那我们就得想办法告诉它规则,于是想到了输入法。输入法之所以如此贴心,就是因为有着丰富的词库,我们可以去输入法的设置里找出词库导出来。
我已经把我的输入法词库导出来并上传到网站服务器上,所以如果你找不到词库在哪就直接用我的吧。

let
    源 = Excel.CurrentWorkbook(){[Name="源数据"]}[Content],
    词库 = Table.FromColumns({List.Buffer(List.Select(Csv.Document(Web.Contents("https://pqfans.com/pq/pinyin/py.txt"),[Delimiter=" "])[Column2],each Text.Length(_)<>1))},{"词"}),
    词频 = Table.AddColumn(词库, "词频", each List.Count(Text.PositionOf(源[文本]{0},[词],2))),
    排序 = Table.Buffer(Table.Sort(词频,{{"词频", 1}})),
    筛选 = Table.SelectRows(排序, each ([词频] <> 0))
in
    筛选

 

解法2:使用R语言

以上是笨方法,但是如果在Power BI Desktop中,我们可以使用R.Execute运行R脚本,用jieba包进行分词。
那么首先你得安装R Open,并安装jieba。安装非常简单,首先去官网下载并装好R Open,然后打开并输入如下命令:install.packages("jiebaR")
等待自动安装完成即可。

先看下在R中如何来分词:

library("jiebaR")
wk<-worker()
words<-wk["pqfans中文分词词频统计"]
data.frame(words)

那么在Power BI中也类似,只不过我们想引用PBI内部的文本进行分词,先上代码吧:

let
    源="Power BI 是一套商业分析工具,用于在组织中提供见解。可连接数百个数据源、简化数据准备并提供即席分析。生成美观的报表并进行发布,供组织在 Web 和移动设备上使用。每个人都可创建个性化仪表板,获取针对其业务的全方位独特见解。在企业内实现扩展,内置管理和安全性。",
    加引号 = """"&Text.Remove(源,"""")&"""",
    R脚本 = R.Execute("
                       library(""jiebaR"")
                       wk<-worker()
                       words<-wk["&加引号&"]
                       df<-data.frame(words)
                      "),
    分词 = R脚本[Value]{0}
in
    分词

为简化过程我直接把文本放在源中,实际上这个文本可以是从本地文件导入,也可以是从网上抓取的等等。
R脚本是以文本形式放在R.Execute函数中,所以我们可以对文本进行拼接,把源中的文本放到R脚本中。
尽管源中的文本已经是text,但是引用的时候还是要在文本的开头和结尾加上一对引号,所以我单独用了一个加引号的步骤便于大家理解。此处前后各4个引号,首尾两个代表引用文本,中间两个是引号的转义,代表一个引号。另外为了避免文本中本身包含引号而引发的错误,再做一个把引号移除的操作,反正我们又不要统计引号。
将数据框赋值给df变量,返回一个两列的table,分别为变量名及数据框内的数据,最后一步深化出[Value]中数据框的数据即可。
这是分词,最关键的一步做完了,剩下的词频统计直接分组就好了。

 

解法3:调用api

使用了一个名为SCWS的分词api,封装为自定义函数,调用即可。

let
    fenci=(word)=>
        let
            url="http://www.xunsearch.com/scws/api.php",
            headers=[#"Content-Type"="application/x-www-form-urlencoded"],
            content="respond=json&ignore=yes&data="&word,
            request=Table.FromRecords(Json.Document(Web.Contents(url,[Headers=headers,Content=Text.ToBinary(content)]))[words])
        in
            request,
    result=fenci("Power BI 是一套商业分析工具,用于在组织中提供见解。可连接数百个数据源、简化数据准备并提供即席分析。生成美观的报表并进行发布,供组织在 Web 和移动设备上使用。每个人都可创建个性化仪表板,获取针对其业务的全方位独特见解。在企业内实现扩展,内置管理和安全性。")
in
    result

附件

18 Replies to “分词词频统计”

  1. 请问如果用方法1的话,我把文本导入到Txt文件应该怎么做!?自己搞了很9都搞不定,期望博主赐教!!!!!

    1. 源改成=Text.FromBinary(File.Contents("xxxxxx.txt")),如果乱码就Text.FromBinary加第二参数0
      然后把词频步骤里的源[文本]{0}改成源,就可以了

      1. 意外错误: 未将对象引用设置到对象的实例。
        详细信息:
        Microsoft.Mashup.Evaluator.Interface.ErrorException: 未将对象引用设置到对象的实例。 ---> Microsoft.Mashup.Evaluator.Interface.ErrorException: 未将对象引用设置到对象的实例。 ---> Microsoft.Mashup.Evaluator.Interface.ErrorException: 未将对象引用设置到对象的实例。 ---> Microsoft.Mashup.Evaluator.Interface.ErrorException: 未将对象引用设置到对象的实例。 ---> Microsoft.Mashup.Evaluator.Interface.ErrorException: 未将对象引用设置到对象的实例。 ---> System.NullReferenceException: 未将对象引用设置到对象的实例。 ---> System.NullReferenceException: 未将对象引用设置到对象的实例。

        1. 我估计是 我的Onedrive 把我的Rstudio IDE 给弄坏了,在Rstudio 无法读取所以的R包路径。伤心啊

  2. 哥 帮我试试在R 新建视觉对象 使用 R脚本 visual ,测测下面能不能 相似图形出来
    library(showtext)
    library(readxl)
    library(plyr)
    library(stringr)
    library(jiebaR)
    library(wordcloud2)
    powerbi_rEnableShowTextForCJKLanguages = 1
    news <- read_excel(file.choose())
    articles <- as.character(sapply(news$articles, str_replace_all, '[\\s]*', ''))
    engine3 <- worker()
    wds <- segment(articles, engine3)
    df <- as.data.frame(table(wds))
    wf <- arrange(df, desc(Freq))
    wf <- wf[order(wf$Freq, decreasing = TRUE), ]
    wordcloud2(wf, backgroundColor = 'lightgray')

  3. 我引用一个表格,新增自定义列对每一行的文字进行分词
    = Table.AddColumn(源, "分词",
    each R.Execute("
    library(""jiebaR"")
    wk<-worker()
    words<-wk["&[分词的列]&"]
    df <- as.data.frame(table(words))
    "))
    为何总是询问我是否批准运行该脚本?而且源文件有多少行就询问多少次。。
    大神有遇到这种情况么?请问应该怎么解决?希望不吝赐教

  4. 直接使用“解法1”中的语言,提示下面的错误,请教一下如何解决?谢谢!

    DataSource.Error: Web.Contents 无法从“https://pqfans.com/pq/pinyin/py.txt”(404)获取内容: Not Found
    详细信息:
    DataSourceKind=Web
    DataSourcePath=http://pqfans.com/pq/pinyin/py.txt
    Url=https://pqfans.com/pq/pinyin/py.txt

  5. 意外错误: Container unexpectedly exited. Exit code: 0xC0000005. PID: 11792
    详细信息:
    Microsoft.Mashup.Evaluator.Interface.ErrorException: Container unexpectedly exited. Exit code: 0xC0000005. PID: 11792 ---> Microsoft.Mashup.Evaluator.ContainerExitException: Container unexpectedly exited. Exit code: 0xC0000005. PID: 11792 ---> Microsoft.Mashup.Evaluator.ContainerExitException: Container unexpectedly exited. Exit code: 0xC0000005. PID: 11792
    在 Microsoft.Mashup.Evaluator.ContainerProcess.WithClientPipesAttachedEvent(String hostToContainerPipeName, Func`1 func)
    在 Microsoft.Mashup.Evaluator.ContainerProcess.CreateProcess()
    在 Microsoft.Mashup.Evaluator.ProcessContainerFactory.Container.CreateProcess(String exePath, String logFolderPath, String arguments)
    在 Microsoft.Mashup.Evaluator.ProcessContainerFactory.Container..ctor(String exePath, String exitMutexName, Int32 containerID, ContainerJob job, String logFolderPath)
    在 Microsoft.Mashup.Evaluator.ProcessContainerFactory.CreateProcessContainer()
    在 Microsoft.Mashup.Evaluator.WorkingSetProcessContainerFactory.CreateProcessContainer()
    在 Microsoft.Mashup.Evaluator.ContainerPoolContainerFactory.CreatePooledContainer(TimeSpan ttlAdjustment)
    在 Microsoft.Mashup.Evaluator.ContainerPoolContainerFactory.CreateContainer()
    在 Microsoft.Mashup.Evaluator.RemoteEvaluationContainerFactory.CreateContainer()
    在 Microsoft.Mashup.Evaluator.RemoteDocumentEvaluator.CreateContainer()
    在 Microsoft.Mashup.Evaluator.RemoteDocumentEvaluator.RemoteEvaluation.Evaluate(Boolean enableFirewall)
    --- 内部异常堆栈跟踪的结尾 ---
    在 Microsoft.Mashup.Evaluator.RemoteDocumentEvaluator.RemoteEvaluation`1.TryCompleteWithException(Exception exception)
    在 Microsoft.Mashup.Evaluator.RemoteDocumentEvaluator.RemoteEvaluation.Evaluate(Boolean enableFirewall)
    在 Microsoft.Mashup.Evaluator.EvaluatorThreadPool.EvaluatorThread(Object state)
    在 Microsoft.Mashup.Evaluator.SafeThread2.c__DisplayClass9_0.b__0(Object o)
    在 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
    在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
    在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
    在 System.Threading.ThreadHelper.ThreadStart(Object obj)
    --- 内部异常堆栈跟踪的结尾 ---
    在 Microsoft.Mashup.Host.Document.Analysis.PackageDocumentAnalysisInfo.PackagePartitionAnalysisInfo.SetPreviewValue(EvaluationResult2`1 result, Func`1 getStaleSince, Func`1 getSampled)

发表回复

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