Заменить все элементы в списке в текстовом файле

Я пытаюсь создать обучающие данные для средства поиска имен openNLP и буду признателен за любую помощь, которую вы можете предложить.

Если бы у меня был такой текстовый файл:

Pierre Vinken, 61 years old, will join the board as a nonexecutive director Nov. 29. 
John Smith is chairman of Elsevier N.V., the Dutch publishing group.

и список имен во втором файле, например:

Pierre Vinken
John Smith

Будет ли способ найти все упоминания имен в текстовом файле и соответствующим образом пометить их в файле, чтобы создать обучающие данные, чтобы файл теперь читался так:

<START:CEO> Pierre Vinken <END>, 61 years old, will join the board as a nonexecutive director Nov. 29. 
<START:CEO> John Smith <END> is chairman of Elsevier N.V., the Dutch publishing group.

Обратите внимание, что я знаю, что потребуются другие шаги предварительной обработки, чтобы сделать файл пригодным для обучения, например принудительное размещение данных в одном предложении в строке.

Я был бы признателен за решение в Notepad++ или R, но при необходимости у меня также есть доступ к инструментам оболочки. Спасибо!


person Gus    schedule 25.02.2015    source источник


Ответы (1)


Вот подход, использующий qdapRegex (который я поддерживаю). Здесь используется база gsub (с использованием группового подхода), и qdapRegex не нужен, но мне нравится простота использования для group и pastex (здесь я также показываю, как использовать чистую базу). Это делает одно регулярное выражение не нужным для mgsub. Это может быть медленнее, так как использует fixed = FALSE, тогда как mgsub использует fixed = TRUE.

x1<-"Pierre Vinken, 61 years old, will join the board as a nonexecutive director Nov. 29. John Smith is chairman of Elsevier N.V., the Dutch publishing group."
y1<-c("Pierre Vinken", "John Smith")

## pacman used to load and if missing install qdapRegex
if (!require("pacman")) install.packages("pacman")
pacman::p_load(qdapRegex)

gsub(pastex(group(y1)), "<START:CEO> \\1 <END>", x1, perl=TRUE)

## [1] "<START:CEO> Pierre Vinken <END>, 61 years old, will join the board as a nonexecutive director Nov. 29. <START:CEO>  <END> is chairman of Elsevier N.V., the Dutch publishing group."

Чистая база

gsub(paste(sprintf("(%s)", y1), collapse="|"), 
    "<START:CEO> \\1 <END>", x1, perl=TRUE)
person Tyler Rinker    schedule 28.02.2015