2016-01-31 2 views
0

У меня есть текст с определенными метками и нужно разделить текст в соответствии с метками. В приведенном примере текст с этикетками набор {A, B, C ..}Простой способ извлечения текста между определенным набором строк в R

text <- c("A: how are you B: hello sir C: bye bye") 
text2 <- c("USER COMMENTS: TEST PROC: Refer manual. SOLUTION: fix BIAS32 user:param", "TEST PROC: install spare unit. USER COMMENTS: hello sir SOLUTION: tighten bolt 12","TEST PROC: bye bye.") 

Мне нужно извлечь текст «как ты», «привет сэр», и т.д .., соответствующие этикетки A, B и т.д. Там нет конкретного заказа этикеток, некоторые ярлыки могут отсутствовать и этикетки могут быть фразы (а не только символы)

Это то, что я до сих пор, чтобы извлечь текст, соответствующий ярлык A:

gsub("(.*A.*:)(.*)(B.*|C.*)","\\2",text,perl=TRUE) 

Но это не работает во многих случаях! Я ищу решение, где я могу определить вектор меток, таких как

labels <- c("USER COMMENTS", "TEST PROC", "SOLUTION") # this is a big list! 

и извлекать текст, соответствующий этим меткам, как показано ниже

ПОЛЬЗОВАТЕЛЕЙ КОММЕНТАРИИ являются «», «привет сэр» TEST PROC - «Refer manual.», «Установить запасной блок», «до свидания». РЕШЕНИЕ: «исправить пользователя BIAS32: param», «затянуть болт 12» и т. Д.

+0

@akrun Два вопроса, когда я попробовал ваше решение. Во-первых, текст без метки может также содержать текст в верхнем регистре или быть пустой строкой, поэтому решение не выполняется. Во-вторых, поскольку порядок меток может отличаться в каждом тексте, мне нужен метод, который может извлекать текст, соответствующий ярлыкам, или связывать разделенный текст с метками. – Sharath

+0

@akrun Спасибо. Я уточнил вопрос для ясности. Также добавлен пример, показывающий сложность – Sharath

+0

У меня такое ощущение, что в ваших данных может быть больше сложностей (которые вы не показывали). Реджикс-решения основаны на шаблонах, которые вы показываете. – akrun

ответ

0

Я думаю, у меня может быть решение, основанное на комментарии Шарата.

Во-первых, существует strsplit(), который может разбивать вектор на основе регулярного выражения. В вашем случае вы можете использовать:

labels2<-paste(labels,collapse="|") 
[1] "USER COMMENTS|TEST PROC|SOLUTION" 

Если применить strsplit на том, что:

splittedtext<-strsplit(text2,labels2) 
[[1]] 
[1] ""      ": "      
[3] ": Refer manual. "  ": fix BIAS32 user:param" 

[[2]] 
[1] ""      ": install spare unit. " ": hello sir "   
[4] ": tighten bolt 12"  

[[3]] 
[1] ""   ": bye bye." 

Довольно много, что вы хотите, верно? Вы можете сделать некоторые уточнения, добавив «:» в конец каждого индекса, а первый элемент - тарабарщина. Таким образом, заботясь о последних:

splittedtext<-lapply(splittedtext,"[",-1) 

Это порождает проблему, которую вы должны выяснить, на этикетке которого комментарий относится. Для этого можно использовать функцию RegExpr() в R.

pos=sapply(labels,regexpr,text2) 
USER COMMENTS TEST PROC SOLUTION 
[1,]    1  16  41 
[2,]   32   1  57 
[3,]   -1   1  -1 

Каждая ячейка представляет собой положение, в котором указанный метка [столбец] появляется на строке [строка]. -1 означает, что он не отображается в этой строке.

Теперь переключитесь, -1 для NA и ранжируйте остальные цифры. Это даст вам, какой фрагмент строки представляет этот ярлык.

pos=ifelse(pos==-1,NA,pos) #switch -1 for NA 
pos=t(apply(pos,1,rank,na.last="keep")) 
USER COMMENTS TEST PROC SOLUTION 
[1,]    1   2  3 
[2,]    2   1  3 
[3,]   NA   1  NA 

Теперь это просто совпадение.

Смежные вопросы