【问题标题】:R - fasttext how to load output into a dataframe from command lineR - fasttext 如何从命令行将输出加载到数据框中
【发布时间】:2020-12-03 17:03:13
【问题描述】:

我正在开发一个从命令行调用 fasttext 的 R 项目,但我不确定如何加载 fasttext 给我的输出作为数据框

> data.train<-data.frame(index=c(rep("__label__1",3),rep("__label__2",3)),country=c("ENGLAND","BRITAIN","UNITED KINDOM","USA","AMERICA","UNITED STATES"))

> data.train
       index       country
1 __label__1       ENGLAND
2 __label__1       BRITAIN
3 __label__1 UNITED KINDOM
4 __label__2           USA
5 __label__2       AMERICA
6 __label__2 UNITED STATES

> data.test<-c("EGLND","MURICA")

> data.test
[1] "EGLND"  "MURICA"

> write.table(data.train,"data.train.txt",sep="\t",quote=FALSE,row.names=FALSE,col.names=FALSE)
> 

> write.table(data.test,"data.test.txt",sep="\t",quote=FALSE,row.names=FALSE,col.names=FALSE)
> 
> system("fasttext supervised -input data.train.txt -output model_data")
Read 0M words
Number of words:  8
Number of labels: 2
Progress: 0.0%  words/sec/thread: 103000  lr: 0.100000  loss: 0.672343  eta: -596523h-14m Progress: 100.0%  words/sec/thread: 103000  lr: 0.000000  loss: 0.672343  eta: 0h0m 
Saving model file.

> system("fasttext predict-prob model_data.bin data.test.txt 2")

__label__1 0.5 __label__2 0.498047
__label__1 0.5 __label__2 0.498047

> res<-system("fasttext predict-prob model_data.bin data.test.txt 2", intern=TRUE)

> res
[1] "__label__1 0.5 __label__2 0.498047" "__label__1 0.5 __label__2 0.498047"

原始系统调用只是将 fasttext 输出打印到控制台,这是问题所在,但是根据 cmets intern=TRUE 允许我将其保存到变量 res 中,但现在问题是变量只是一个向量我实际需要的是每个标签的概率数据框,如下所示:

> want
  __label__1  __label__2
1 0.5       0.49807
2 0.5       0.49807

这个问题Fasttext how to load a .csv column into model.predict 回答了类似的问题,但对于 python,我需要在 R 中执行此操作。

【问题讨论】:

  • 也许使用intern = TRUE。您是否尝试过使用“data.table”中的fread
  • 看起来 intern=TRUE 主要完成了我想要的工作,因为它允许我将输出作为列表存储在 R 中,但是每一行都存储为一个字符串,稍后我必须将其解析为列我想我或许可以做到。我没有尝试过 fread,但不确定我会在什么时候这样做,你能解释一下吗?
  • fread(来自 data.table)应该能够从系统命令中读取。如果您使用system 设法读取的数据中的dput head 并显示您想要的输出,那么提供帮助会更容易。
  • 好的,我编辑了问题以包含一个可重现的示例并显示我想要的最终结果是什么
  • 我对@9​​87654330@ 的想法类似于:library(data.table); fread(cmd = "fasttext predict-prob model_data.bin data.test.txt 2")。查看示例数据中的结果字符串,您最终会得到一个 4 列 data.table。我对 fasttext 格式的了解还不够,无法说出这是否是一个好的答案。例如,res 的每个元素是否总是有相同数量的标签?标签总是一样的吗?

标签: r command-line fasttext


【解决方案1】:

假设您已经使用system(..., intern = TRUE) 获得了res 的字符向量,您可以尝试以下操作。

res3 <- c("__label__1 0.500768 __label__2 0.499252", 
          "__label__2 0.500768 __label__1 0.499252",
          "__label__3 1")

library(data.table)
x <- fread(text = res3, fill = TRUE)
# rename the columns in "variable"/"value" pairs and add a row indicator
setnames(x, paste0(rep(c("var_", "val_"), length.out = ncol(x)), 
                   rep(1:2, each = ncol(x)/2)))[, row := .I][]
# melt the data into a long form and cast it into a wide form
out <- melt(x, measure = patterns("var_", "val_"), na.rm = TRUE)[
  , dcast(.SD, row ~ value1, value.var = "value2")]
out
#    row __label__1 __label__2 __label__3
# 1:   1   0.500768   0.499252         NA
# 2:   2   0.499252   0.500768         NA
# 3:   3         NA         NA          1

如果您想在输出中将NA 替换为0,可以将fill = 0 添加到dcast

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多