R-fasttext如何从命令行将输出加载到数据帧中

R-fasttext如何从命令行将输出加载到数据帧中,r,command-line,fasttext,R,Command Line,Fasttext,我正在R中的一个项目中工作,该项目从命令行调用fasttext,我不知道如何加载fasttext作为数据帧提供给我的输出 > data.train<-data.frame(index=c(rep("__label__1",3),rep("__label__2",3)),country=c("ENGLAND","BRITAIN","UNITED KINDOM","USA&quo

我正在R中的一个项目中工作,该项目从命令行调用fasttext,我不知道如何加载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"

这个问题回答了一些类似的问题,但对于python,我需要在R中这样做。

假设您已经使用
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

res3可能使用
intern=TRUE
。您尝试过使用“data.table”中的
fread
了吗?看起来intern=TRUE基本上实现了我想要的功能,因为它允许我将输出存储为R中的列表,但是每一行都存储为字符串,我以后必须解析为列,我认为我可能能够做到这一点。我还没有试过fread,不确定在什么时候我会这么做,你能解释一下吗?
fread
(来自data.table)应该能够读取系统命令。如果您
dput
使用
system
读取数据的
头部
,并显示所需输出,我编辑了这个问题,加入了一个可复制的例子,并展示了我想要的最终结果是什么,我对
fread
的想法是:
library(data.table);fread(cmd=“fasttext predict prob model\u data.bin data.test.txt 2”)
。查看示例数据中的结果字符串,您将得到一个4列
data.table
。我对fasttext格式知之甚少,无法判断这是否是一个好答案。例如,
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