首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >F#、R provider、R package tm和(几乎) Ovid示例

F#、R provider、R package tm和(几乎) Ovid示例
EN

Stack Overflow用户
提问于 2014-10-03 04:00:41
回答 2查看 382关注 0票数 3

请注意,我是F#和R的初学者(更多),所以可能会告诉我RTFM或其他地方;-)

我已经开始使用R和tm包研究一些文本数据挖掘。

我在R中有以下脚本,顺便说一下,它们非常类似于Ovid分析的示例(将真实示例的"lgtext“替换为"txt”,将language="no“替换为language="lat”,以运行Ovid示例):

代码语言:javascript
复制
library(tm)
library(SnowballC)

txt <- system.file("texts", "lgtextfull", package = "tm")
(lgorg <- VCorpus(DirSource(txt, encoding = "UTF-8"), 
          readerControl = list(language = "no")))

lg <- tm_map(lgorg , stripWhitespace)

因此,作为一个初学者,我选择了使用F#、R、Deedle和RPRovider。Deedle我还没有用过,所以这可能会被忽略。

然后,我尝试编写以下F#:

代码语言:javascript
复制
#I "../packages/RProvider.1.0.17/"

#load "RProvider.fsx"

open RProvider
open RDotNet

open RProvider.``base``
open RProvider.tm
open RProvider.openNLP
open RProvider.SnowballC

let txt = R.system_file("texts", "lgtextfull", package = "tm", lib_loc = null, mustWork=true )
let lang =  dict [("language", "no":>obj)]
let readerControl = R.list(lang)
let dirsource = R.DirSource(txt, encoding = "UTF-8")

let lgorg = R.VCorpus(dirsource, readerControl)

let lg =  R.tm__map(lgorg, R.stripWhitespace)

之所以对R脚本进行如此多的“扩展”,是为了让我理解它并使其工作。

经过一些来回运行之后,上面的代码将会运行,看起来它在REPL中的工作和报告与在R中相同,但最后一行除外:

代码语言:javascript
复制
let lg =  R.tm__map(lgorg, R.stripWhitespace)

这会给出一个错误,比如:

代码语言:javascript
复制
System.Exception: No converter registered for type FSI_0006+lg@81 or any of its base types
   at RProvider.RInteropInternal.convertToR@164.Invoke(String message) in c:\Tomas\Public\FSharp.RProvider\src\RProvider\RInterop.fs:line 164
   at Microsoft.FSharp.Core.PrintfImpl.go@523-3[b,c,d](String fmt, Int32 len, FSharpFunc`2 outputChar, FSharpFunc`2 outa, b os, FSharpFunc`2 finalize, FSharpList`1 args, Int32 i)
   at Microsoft.FSharp.Core.PrintfImpl.run@521[b,c,d](FSharpFunc`2 initialize, String fmt, Int32 len, FSharpList`1 args)
   at Microsoft.FSharp.Core.PrintfImpl.capture@540[b,c,d](FSharpFunc`2 initialize, String fmt, Int32 len, FSharpList`1 args, Type ty, Int32 i)
   at <StartupCode$FSharp-Core>.$Reflect.Invoke@720-4.Invoke(T1 inp)
   at RProvider.RInteropInternal.REngine.SetValue(REngine this, Object value, FSharpOption`1 symbolName) in c:\Tomas\Public\FSharp.RProvider\src\RProvider\RInterop.fs:line 274
   at RProvider.RInteropInternal.toR(Object value) in c:\Tomas\Public\FSharp.RProvider\src\RProvider\RInterop.fs:line 287
   at RProvider.RInterop.passArg@431(List`1 tempSymbols, Object arg) in c:\Tomas\Public\FSharp.RProvider\src\RProvider\RInterop.fs:line 445
   at RProvider.RInterop.argList@452-1.GenerateNext(IEnumerable`1& next) in c:\Tomas\Public\FSharp.RProvider\src\RProvider\RInterop.fs:line 453
   at Microsoft.FSharp.Core.CompilerServices.GeneratedSequenceBase`1.MoveNextImpl()
   at Microsoft.FSharp.Core.CompilerServices.GeneratedSequenceBase`1.System-Collections-IEnumerator-MoveNext()
   at Microsoft.FSharp.Collections.SeqModule.ToArray[T](IEnumerable`1 source)
   at RProvider.RInterop.callFunc(String packageName, String funcName, IEnumerable`1 argsByName, Object[] varArgs) in c:\Tomas\Public\FSharp.RProvider\src\RProvider\RInterop.fs:line 450
   at RProvider.RInterop.call(String packageName, String funcName, String serializedRVal, Object[] namedArgs, Object[] varArgs) in c:\Tomas\Public\FSharp.RProvider\src\RProvider\RInterop.fs:line 494
   at <StartupCode$FSI_0006>.$FSI_0006.main@() in C:\Users\helgeu\Documents\Visual Studio 2012\Projects\DisqusAnalyzer\DisqusAnalyzer.Lib\InteractiveSession.fsx:line 81
Stopped due to error

我必须承认我对此一无所知,google.com也帮不了我;-)

有没有人?有什么建议吗?它应该起作用吗?我做错了吗?

EN

回答 2

Stack Overflow用户

发布于 2015-02-13 00:23:24

我怀疑问题在于tm__map的第二个参数是一个R函数。当您编写R.stripWhitespace时,您会得到一个F#闭包,我们无法将其转换回R函数。

解决方法可能是计算一个将R函数作为SymbolicExpression返回的表达式,然后将其作为参数传递:

代码语言:javascript
复制
let stripWhite = R.eval(R.parse(text="stripWhitespace"))
let lg =  R.tm__map(lgorg, stripWhite)
票数 2
EN

Stack Overflow用户

发布于 2017-05-21 03:52:57

Tomas Petricek提供的解决方案不起作用,因为stripWhitespace函数来自tm包。要做到这一点,您应该使用函数的完全限定名称:

代码语言:javascript
复制
let stripWhitespace= R.eval(R.parse(text="tm::stripWhitespace"))
let lg = R.tm__map(lgorg, stripWhitespace)

这将会起到作用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26168683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档