关系三元组提取中的R - TM,stringr,Perl的正则表达式

问题描述:

在从文本本体学习的情况下,假设我有两个概念,我很感兴趣,它们之间的关系:关系三元组提取中的R - TM,stringr,Perl的正则表达式

class <- c(animal.class, dog.class) 
individual <- "Snoopy" 

animal.class <- c("animal", "animals") 
dog.class <- c("dog", "dogs") 

sentence1 <- "Snoopy is an animal." 
sentence2 <- "Snoopy is a dog." 

如何提取与R的语言上下文和语义关系,以便我可以收集数据帧,而不必具有之前定义的上下文/关系(“是(n)”)。

data.frame(CLASS1="animal",CLASS2="Snoopy",context="CLASS2 is an CLASS1") 
data.frame(CLASS1="dog",CLASS2="Snoopy",context="CLASS2 is a CLASS1") 

可以很容易地提取这种与像有限状态转换器等工具的事情,但我想留在R和我没有R.

发现这样的事情的时刻我想象一下使用perl正则表达式的一些解决方案以及包tmstringr ......它们足够吗?

+0

目前还不清楚会是什么是可用的数据,预期的结果是什么。你想扣除给定的一些句子的课程,或生成给定类的句子?要么...? – 2015-04-06 05:39:25

+0

Tyler Rinker的qdap包可能有所帮助。 – lawyeR 2015-04-06 11:04:04

+0

@DominicComtois:可用的数据是句子或语料库。 NLTK(Python)有一个特定的功能:http://www.nltk.org/_modules/nltk/sem/relextract.html – 2015-04-06 12:33:06

我不完全确定你在做什么。这是我想什么办法,我认为你是后:

sentences <- c(
    "Snoopy is an animal.", 
    "Snoopy is a dog.", 
    "Snoopy likes chocolate!", 
    "Goofy is a dog" 
) 

if (!require("pacman")) install.packages("pacman") 
pacman::p_load(qdapRegex, dplyr, tidyr) 

(out <- rm_default(sentences, pattern = S("@around_", 1, "is a(n*)", 1), extract=TRUE) %>% 
    unlist %>% 
    sub("\\s+", "<SPLIT>", .) %>% 
    data_frame(new = .) %>% 
    na.omit %>% 
    separate(new, c("CLASS2", "context", "CLASS1"), sep = "(<SPLIT>)|((?=[^ ]+$))") %>% 
    mutate(context = sprintf("CLASS 2 %s CLASS 1", context)) %>% 
    select(c(1, 3, 2))) 

## CLASS2 CLASS1    context 
## 1 Snoopy animal CLASS 2 is an CLASS 1 
## 2 Snoopy dog CLASS 2 is a CLASS 1 
## 3 Goofy dog CLASS 2 is a CLASS 1 

然后拉出各种类别的具体情况对管道的末端使用filter

out %>% 
    filter(grepl("[Ss]noopy", CLASS2)) 

## CLASS2 CLASS1    context 
## 1 Snoopy animal CLASS 2 is an CLASS 1 
## 2 Snoopy dog CLASS 2 is a CLASS 1 

out %>% 
    filter(grepl("[Dd]og", CLASS1)) 

## CLASS2 CLASS1    context 
## 1 Snoopy dog CLASS 2 is a CLASS 1 
## 2 Goofy dog CLASS 2 is a CLASS 1