2016-03-31 16 views
1

Grepl kullanarak terimleri bulmaya çalışıyorum ve çok fazla yanlış pozitif alıyorum. Listedeki herhangi bir terimin iki başarılı eşleşmesi için bir yol olabileceğini umuyordum (Verilerimin bir segmenti için manuel kodlama var ve en azından kabaca buna karşılık otomasyonu almaya çalışıyorum ama yaklaşık 5 tane var) Manuel kodlama ile yaptığım gibi çok pozitif zamanlar). Grepl'i TRUE'yi tetiklemek için birden fazla eşleşme gerektiren herhangi bir argümanı görmedim. Bir TRUE bulgusunu tetiklemek için iki eşleşme gerektirecek bir yol var mı? Yoksa kullanmam gereken başka bir işlev var mı?grepl ile TRUE için sadece bir tane yerine iki eşleşme gerekli midir?

GenericColumn <- cbind(grepl(Genericpattern, Statement$Statement.Text, ignore.case = TRUE)) 

DÜZENLEME:

İşte

daha somut örnektir:

şimdi olduğu gibi
Examplepattern <- 'apple|orange' 
ExampleColumn <- cbind(grepl(Examplepattern, Rexample$Statement.Text, ignore.case = TRUE)) 

, bunların hepsi grepl ile gerçek tetikleyecektir. Sadece iki referansı olan öğeleri doğru tetiklemeyi isterdim.

Örnek veriler:

Rexample <- structure(list(Statement.Text = structure(c(2L, 1L, 3L, 5L, 4L 
), .Label = c("This apple is a test about an apple.", "This is a test about apples.", 
"This orange is a test about apples.", "This orange is a test about oranges.", 
"This orange is a test."), class = "factor")), .Names = "Statement.Text", row.names = c(NA, 
5L), class = "data.frame") 

İstenilen Çıktı:, DOĞRU YANLIŞ, DOĞRU, DOĞRU, YANLIŞ

+0

En iyi beton örneğinin ne olduğundan emin değilim - gerçek kod yok İçinde bir ton bilgi var. 'code 'Genericpattern <- paste (Genericlist, sep =" ", daraltma =' | ') İçinde yaklaşık 50 terim var. webscraped metin kadar. Temel olarak sadece artan bir doğruluk oranı olduğunu anlamaya çalışıyorum çünkü sadece bir eşleşmenin çok hassas olması bir metriğe benziyor, öyle görünüyor ki, iki terimi (elma ve portakallar ya da elmalar) eşleştirmek zorunda kalacaklarını umuyordum. elma, yani iki farklı veya aynı iki kere). – Matthew

+0

[Nasıl yeniden üretilebilir bir R örneği yazılır] bölümüne bakın (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example/5963610#5963610) . Gerçekten, regex değil, bir HTML ayrıştırıcısı ile ayrıştırma yapmanız gerekir. "rvest :: html_nodes", CSS veya XPath seçicileriyle eşleştirilmiş hile yapmalıdır. – alistaire

+0

Verileri zaten bir csv'de var, bu yüzden zaten bir web sitesi üzerinden manipüle edilebilir bir dosyaya giriyorum - sadece şu anda bir kez yerine iki kez terimleri eşleştirmeye çalışıyorum.Tekrarlanabilir bir örnek ile gelip gelemeyeceğimi görmek için bu bağlantıyı takip edeceğim, ancak bir özellik sorunu olarak çok fazla bir hata sorunu olmamasına rağmen. – Matthew

cevap

1

{2} gibi tam parantezli düzenli ifadelerde tekrarlanan bir şeyi kaç kez istediğinizi belirtebilirsiniz (tam olarak önceki iki katı tam olarak), {2,5} (2-5 kez) veya {2,} (2 veya daha fazla kez). Bununla birlikte, eşleştirmek istediğiniz kelimeler arasında sözcüklere izin vermeniz gerekir, bu nedenle(0 veya daha fazla kez) ile nicelendirilmiş bir . joker karakterine ihtiyacınız vardır. Böylece

, size apple iki kez tekrarlanan veya orange iki kez tekrarlandı (ancak apple kez istiyorsanız ya (apple ve orange ve tersi de dahil) apple veya iki kez eşleşti orange, sen

grepl('(apple.*|orange.*){2}', Rexample$Statement.Text, ignore.case = TRUE) 
# [1] FALSE TRUE TRUE FALSE TRUE 

kullanabilirsiniz isterseniz ve orange (bir kere), ayrı ayrı belirtmek için:

grepl('(apple.*){2,}|(orange.*){2}', Rexample$Statement.Text, ignore.case = TRUE) 
# [1] FALSE TRUE FALSE FALSE TRUE 
+0

Güzel çözüm. Görünüşe göre, çıktıların farklı yorumları vardı. "Elma" 2 kezden fazla gösterse bile "TRUE" ifadesini alacağınız gibi, {2} 'yi kullanabileceğinizi unutmayın. – Jota

+0

Evet, aslında diğer yolla eşleşti ve değiştirdim. '{2,} '' grepl' ile ilgili haklısınız; Sanırım bir üst sınır "grepl" ile işe yaramaz. – alistaire

+0

Listenin tamamını kapsayan bir {2} koymak için bir yol var mı? İçerisinde, herhangi bir terimin iki kez göründüğü, ancak toplamda iki tane yapıp yapmadığı fark etmez. – Matthew

1

Sen (?:apple|orange).*(?:apple|orange)

(pattern <- paste0("(?:", Examplepattern, ")", ".*", "(?:", Examplepattern, ")")) 
#[1] "(?:apple|orange).*(?:apple|orange)" 


grepl(pattern, Rexample$Statement.Text, ignore.case = TRUE, perl = TRUE) 
#[1] FALSE TRUE TRUE FALSE TRUE 
gibi açıkça tekrar desen arar bir regex, deneyebilirsiniz
İlgili konular