网上随便找段文字,就以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
试试
df <- as.data.frame(table(words))
可以,直接出词频了,R+M还有什么案例没?
没,基本都是在R文本挖掘教材里面找的,不过 http://community.powerbi.com/t5/R-Script-Showcase/bd-p/RVisuals 很多
请问如果用方法1的话,我把文本导入到Txt文件应该怎么做!?自己搞了很9都搞不定,期望博主赐教!!!!!
源改成=Text.FromBinary(File.Contents("xxxxxx.txt")),如果乱码就Text.FromBinary加第二参数0
然后把词频步骤里的源[文本]{0}改成源,就可以了
万分感谢
Expression.SyntaxError: 应为令牌 Comma。
line3,词库建立那里出现了错误,错误提示如上!
你第一行结尾少逗号吧,这个提示是符号的问题
确实是,谢谢
不知道为什么 现在一直卡在
意外错误: 未将对象引用设置到对象的实例。
更细PBI 版本号就一直出错, 隐私级别都设置成 公用了
依据,
https://powerbi.microsoft.com/zh-cn/documentation/powerbi-desktop-privacy-levels/
还是操作不了
我试了一下没有问题
意外错误: 未将对象引用设置到对象的实例。
详细信息:
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: 未将对象引用设置到对象的实例。
我估计是 我的Onedrive 把我的Rstudio IDE 给弄坏了,在Rstudio 无法读取所以的R包路径。伤心啊
没遇到过。。。
哥 帮我试试在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')
我引用一个表格,新增自定义列对每一行的文字进行分词
= Table.AddColumn(源, "分词",
each R.Execute("
library(""jiebaR"")
wk<-worker()
words<-wk["&[分词的列]&"]
df <- as.data.frame(table(words))
"))
为何总是询问我是否批准运行该脚本?而且源文件有多少行就询问多少次。。
大神有遇到这种情况么?请问应该怎么解决?希望不吝赐教
直接使用“解法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
意外错误: 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)