2017-07-05 1 views
1

Meine Frage ist eine Erweiterung dieses: How to extract sentences containing specific person names using Rdie Namen in jedem Satz enthalten sind (nicht umgekehrt)

Ich werde den relevanten Teil hier schreiben (etwas für die Zwecke dieser Frage bearbeitet):

> sentences 
[1] "Opposed as a reformer at Tübingen, he accepted a call to the University of Wittenberg by Martin Luther, recommended by his great-uncle Johann Reuchlin" 
[2] " Melanchthon became professor of the Greek language in Wittenberg at the age of 21 with the help of Martin Luther"                  
[3] " He studied the Scripture, especially of Paul, and Evangelical doctrine" 
[4] " He was present at the disputation of Leipzig (1519) as a spectator, but participated by his comments."                   
[5] " Johann Eck having attacked his views, Melanchthon replied based on the authority of Scripture in his Defensio contra Johannem Eckium" 

toMatch <- c("Martin Luther", "Paul", "Melanchthon") 

Die Antwort bereitgestellt gibt die Sätze, die jeden Namen entsprechen:

foo<-function(Match){c(Match,sentences[grep(Match,sentences)])} 
> lapply(toMatch,foo) 
[[1]] 
[1] "Martin Luther"                                   
[2] "Opposed as a reformer at Tübingen, he accepted a call to the University of Wittenberg by Martin Luther, recommended by his great-uncle Johann Reuchlin" 
[3] " Melanchthon became professor of the Greek language in Wittenberg at the age of 21 with the help of Martin Luther" 

[[2]] 
[1] "Paul"                 
[2] " He studied the Scripture, especially of Paul, and Evangelical doctrine" 

[[3]] 
[1] "Melanchthon"                               
[2] " Melanchthon became professor of the Greek language in Wittenberg at the age of 21 with the help of Martin Luther"             
[3] " Johann Eck having attacked his views, Melanchthon replied based on the authority of Scripture in his Defensio contra Johannem Eckium" 

lapply(toMatch,foo) gibt eine Liste von toMatch Elemente und App ly jedes zur Funktion foo, die nach Übereinstimmungen in den Sätzen mit grep sucht (die Position des Satzvektors zurücksend, der übereinstimmt): sentences[grep(Match,sentences)].

Meine Frage ist, anstatt jeden Satz zurückzukehren, die die Elemente des toMatch Vektor entsprechen, wie könnten wir einen Vektor mit jedem Satz, und dann für die Namen suchen, die jeden übereinstimmen (zB: um in die andere Richtung ich weiß, es ist ein wenig verwirrend ist, würde der Ausgang dieses) sein:

[1] "Martin Luther" 
[2] "Melanchthon","Martin Luther"                  
[3] "Paul" 
[4] NA     #Or maybe this row doesn't exists, it's the same for me                
[5] "Melanchthon" 

Könnte dies das Ergebnis zu verändern getan werden bereits zur Verfügung gestellt oder vielleicht wäre dies einfacher sein, eine andere Funktion und lapply(sentences,FUNCTION) verwenden?

Antwort

1

Eine Option wäre str_extract

library(stringr) 
lst <- str_extract_all(sentences, paste(toMatch, collapse="|")) 
lst[lengths(lst)==0] <- NA 
lst 
#[[1]] 
#[1] "Martin Luther" 

#[[2]] 
#[1] "Melanchthon" "Martin Luther" 

#[[3]] 
#[1] "Paul" 

#[[4]] 
#[1] NA 

#[[5]] 
#[1] "Melanchthon" 

oder wir regmatches/gregexpr von base R

lst <- regmatches(sentences, gregexpr(paste(toMatch, collapse="|"), sentences)) 

und ersetzen Sie die list Elemente 0 mit length als NA (wie bisher) verwenden können

+0

Th ist perfekt, danke. Eine Sache, wenn "Paul" 4 Mal in den Sätzen [3] vorhanden wäre, wäre die Ausgabe für Ihren Code "Paul", "Paul", "Paul", "Paul". Wäre es möglich, jeden zu bekommen nur einmal pro Satz benennen? – Hoju

+1

@Hoju Derzeit wird es alle 'Paul's bekommen, aber wenn Sie nur' unique' brauchen, dann würde 'lapply (lst, unique)' es tun – akrun

+0

Ein Gedanke, in dem Fall, dass der 'toMatch' Namenvektor ist sehr groß, denken Sie, dass die Verkettung der Namen mit vielen ODER-Operatoren weniger effizient ist als die Verwendung des Funktionsansatzes 'foo <-funktion (Match) {Sätze [grep (Übereinstimmung, Sätze)]}'? Kannst du dir eine Möglichkeit vorstellen, die Frage mit einer solchen Funktion zu lösen? Ich denke, vielleicht wäre es schneller, weil es so etwas wie 'grep (" \\ ", Sätze) verwendet werden könnte, so dass es nur nach Wörtern statt nach Strings sucht. – Hoju

Verwandte Themen