R:将 ConceptNet5 语法解析为数据框

R: Parsing ConceptNet5 syntax into Data frame

我已经用 grepgsub 研究了几个小时,但我觉得我没有真正正确地解决这个问题。

我正在使用一个惊人的公开数据集 ConceptNet5 which maps connection between concepts (which I found on the Open Data 社区)。

'csv' 文件中的数据在文本编辑器中读取时如下所示:

/a/[/r/RelatedTo/,/c/en/port/,/c/en/on_coast/]  /r/RelatedTo    /c/en/port  /c/en/on_coast  /ctx/all    0.02592754036220567 /s/site/verbosity   /e/4251f811726a5bc2d5c37636e6d9323b1d1f0d97 /d/verbosity    [[port]] is related to [[on coast]]
/a/[/r/RelatedTo/,/c/en/port/,/c/en/ship_offload/]  /r/RelatedTo    /c/en/port  /c/en/ship_offload  /ctx/all    0.04264433740849372 /s/site/verbosity   /e/0756f548fdcf0f2534719cce5c19f514cc32c037 /d/verbosity    [[port]] is related to [[ships offload]]
/a/ [/r/RelatedTo/,/c/en/port/,/c/en/wooden/]   /r/RelatedTo    /c/en/port  /c/en/wooden    /ctx/all    0.01010845347428868 /s/site/verbosity   /e/f95913c8a1c1263b494bdda44c12a3c50d025c8b /d/verbosity    [[port]] is related to [[wooden]]

With /a/ 表示在 [,,] 中找到的断言包含三个元素的断言。 /r/指'language-independent relations',/c/概念,/en/英文,/port//on_coast/。我最能理解的第一行的意思是表达港口与海岸有关的断言。

为了使该数据在 R 中易于处理,我想将其转换为 dataframe,如下所示

     assertion    subject    object        lang1 lang2  
 [1] RelatedTo    port       on_coast      en    en
 [2] RelatedTo    port       ship_offload  en    en
 [3] RelatedTo    port       wooden        en    en

如果您滚动到数据右侧,则断言信息的表示似乎完全相同。我不确定这是为了什么。还有一些关于断言来源的附加信息 /s/。我认为我不需要这些信息。

如果有人能为我指明正确的方向,告诉我如何将这些数据转换为 R 友好格式,我将不胜感激。

您可以使用 read.table 以 space 作为分隔符来读取 csv 文件。这将为您提供一个包含多列的数据框。但是,您可以丢弃除第一列以外的每一列,因为第一列包含构建您在问题中提供的数据框示例所需的所有信息。第一列的值如下所示:

/a/[/r/RelatedTo/,/c/en/port/,/c/en/on_coast/]

这里是要在 csv 文件中读取的代码:

data <- read.table("datafile.csv",
                   header=FALSE,
                   sep= "")          # delimeter is any amount of whitespace

data <- data[, 1]                    # retain only the first column
colnames(data) <- c("rawdata")       # rename first column

要为最终数据框提取所需的信息,您需要在数据框的第一列上使用正则表达式 data。这是提取 assertion 列的正则表达式:

data$assertion <- gsub("\/a\/\s*\[\/r\/(.*)\/\,", "\1", data$rawdata)

此正则表达式将获取它在 /a/[/r//, 之间找到的所有内容,并将其存储到数据框的 assertion 列中。

我会把它留给你作为作业来处理其他专栏。