2016-03-31 10 views
1

Я пытаюсь определить термины с помощью grepl, и я получаю слишком много ложных срабатываний. Я надеялся, что может потребоваться два успешных совпадения любого термина из списка (у меня есть ручное кодирование для сегмента моих данных, и я пытаюсь получить автоматизацию, по крайней мере, примерно соответствует этому, но у меня около 5 как и в случае с ручным кодированием). Я не видел grepl как принятие каких-либо аргументов, требующих более одного совпадения для запуска TRUE. Есть ли способ потребовать двух совпадений, чтобы вызвать ИСТИННЫЙ вывод? Или есть какая-то другая функция, которую я должен использовать?Любой способ потребовать два совпадения вместо одного для TRUE с grepl?

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

EDIT:

Вот более конкретный пример:

Examplepattern <- 'apple|orange' 
ExampleColumn <- cbind(grepl(Examplepattern, Rexample$Statement.Text, ignore.case = TRUE)) 

В настоящем время, все они будут вызывать верно с grepl. Мне бы хотелось, чтобы элементы с двумя ссылками запускали true.

Пример данных:

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") 

Желаемая Выход: TRUE, FALSE, TRUE, TRUE, FALSE

+0

Я не уверен, какой лучший пример конкретного примера - фактический код doesn В нем нет тонны информации. У меня есть шаблон, сделанный: «code' Genericpattern <- paste (Genericlist, sep =" ", collapse = '|') В нем около 50 терминов, которые я просматриваю в столбце CSV с текстом webscraped. Я просто пытаюсь понять, что есть способ повысить точность, потому что, поскольку кажется, что только один матч слишком чувствителен к метрике, поэтому я надеялся, что ему придется сопоставить два термина (яблоки и апельсины, или яблоки и яблоки, так что два или два одинаковых). – Matthew

+0

См. [Как написать отличный воспроизводимый пример R] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example/5963610#5963610), чтобы мы могли помочь вам , На самом деле, вероятно, вы должны разбираться с парсером HTML, а не с регулярным выражением. 'rvest :: html_nodes' должен делать трюк в паре с селекторами CSS или XPath. – alistaire

+0

У меня уже есть данные в csv, поэтому он уже отключен от веб-сайта в управляемом файле - я просто пытаюсь сопоставить термины дважды, а не один раз прямо сейчас.Я буду следить за этой ссылкой, чтобы узнать, могу ли я придумать воспроизводимый пример, хотя проблема не столько в проблеме, сколько в проблеме с функцией. – Matthew

ответ

1

Вы можете указать, сколько раз вы хотите что-то повторяющееся в регулярном выражении с фигурными фигурными скобками, например {2} (ровно в два раза больше, чем перед ним), {2,5} (2-5 раз), или {2,} (2 или более раз). Тем не менее, вам нужно разрешить слова между теми, которые вы хотите сопоставить, поэтому вам нужно создать подстановочный знак . с помощью * (0 или более раз).

Таким образом, если вы хотите, либо apple или orange соответствует дважды (в том числе apple и orange и наоборот), вы можете использовать

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

Если вы хотите apple повторен дважды или orange повторяется дважды (но не apple раз и orange один раз), количественно определить отдельно:

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

Хорошее решение. Похоже, у нас были разные интерпретации желаемого результата. Обратите внимание, что вы можете использовать '{2}', так как вы все равно получите TRUE, даже если «яблоко» появляется более чем в 2 раза. – Jota

+0

Да, на самом деле у меня было это, чтобы соответствовать другим способом и переключил его. Вы правы в '{2,}' с 'grepl'; Думаю, верхняя граница бесполезна с «grepl». – alistaire

+0

Есть ли способ, чтобы положить {2}, чтобы покрыть весь список? Как и в случае, для меня не имеет значения, если какой-либо один термин появляется дважды, но если только два в целом делают? – Matthew

1

Вы можете попробовать регулярное выражение, которое явно ищет шаблон снова, как (?: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