2015-04-06 19 views
0

在從文本本體學習的情況下,假設我有兩個概念,我很感興趣,它們之間的關係:關係三元組提取中的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

回答

1

我不完全確定你在做什麼。這是我想什麼辦法,我認爲你是後:

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