在带R的句子中查找单词,如果不在,则删除行
不久前我发了一封信。我将从那个问题中复制粘贴一些信息,以弄清发生了什么 我必须遍历目录中的所有文件,并遍历每个文件的每一行。我从这些行中提取构建数据帧所需的数据。每个文件名都是这样的在带R的句子中查找单词,如果不在,则删除行,r,R,不久前我发了一封信。我将从那个问题中复制粘贴一些信息,以弄清发生了什么 我必须遍历目录中的所有文件,并遍历每个文件的每一行。我从这些行中提取构建数据帧所需的数据。每个文件名都是这样的 airbag.WS-U-E-A.lst 是一个分隔符,.lst是扩展名(可读文本) 每个文件包含每行的数据,例如 适配器WR-p-p-F.lst /home/nobackup/SONAR/COMPACT/WR-P-P-F/WR-P-P-F0000026.data.ids.xml: <sentence>
airbag.WS-U-E-A.lst
是一个分隔符,.lst
是扩展名(可读文本)
每个文件包含每行的数据,例如
适配器WR-p-p-F.lst
/home/nobackup/SONAR/COMPACT/WR-P-P-F/WR-P-P-F0000026.data.ids.xml: <sentence>Een aanpassingseenheid ( adapter ) , aangebracht in een behuizing voornamelijk bestaande uit in- en uitvoereenheden , een koppeleenheid , een geheugeneenheid , een besturingseenheid ( met actieve en passieve elementen en monolitische geïntegreerde schakelingen ) en een elektrische voedingseenheid . ></sentence>
/home/nobackup/SONAR/COMPACT/WR-P-P-F/WR-P-P-F0000026.data.ids.xml: <sentence>ID="1">Het toestel ( adapter ) draagt zorg voor de overbrenging van gegevens , met een snelheid van 10 Mbps ( megabits per seconde ) , tussen meerdere automatische gegevensverwerkende machines in een digitaal netwerk . " ></sentence>
/home/nobackup/SONAR/COMPACT/WR-P-P-F/WR-P-P-F0000034.data.ids.xml: <sentence>Overwegende dat deze sensoren niet zijn ontworpen op de installatie van een gepantserde kabel ; dat de mogelijkheid moet worden geboden dat de gepantserde kabel niet verplicht wordt gesteld voor de aansluiting tussen de sensor en de adapter , maar alleen van de adapter naar het controleapparaat ; dat het bijgevolg noodzakelijk is de verordening dienovereenkomstig te wijzigen ;</sentence>
/home/nobackup/SONAR/COMPACT/WR-U-E-A/WR-U-E-A0000075.data.ids.xml: <sentence>ja voor den airbag op te pompen eh :p</sentence>
/home/nobackup/SONAR/COMPACT/WR-U-E-A/WR-U-E-A0000129.data.ids.xml: <sentence>Dobby , als ze valt heeft ze dan wel al ne airbag hee</sentence>
/home/nobackup/SONAR/COMPACT/WR-P-P-F/WR-P-P-D0000026.data.ids.xml: <sentence>Het aids-probleem ontstaat door mensen zonder vaste partner, legt de speciale editie uit.</sentence>
/home/nobackup/SONAR/COMPACT/WR-P-P-F/WR-P-P-D0000036.data.ids.xml: <sentence>Vorig jaar stierven 3 miljoen mensen aan aids en raakten er 5 miljoen besmet met hiv.</sentence>
/home/nobackup/SONAR/COMPACT/WR-P-P-F/WR-P-P-G0000134.data.ids.xml: <sentence>Veilige seks kan aids voorkomen.</sentence>
/home/nobackup/SONAR/COMPACT/WR-P-P-F/WR-P-P-G0000288.data.ids.xml: <sentence>Want naarmate de aids-epidemie in Zuid-Afrika en omliggende landen groeit, zoeken miljoenen besmette mensen steeds wanhopiger naar een geneesmiddel.</sentence>
- 文件名:通过循环文件并列出所有文件名
输出应为:files <- list.files(pattern="*.lst", full.names=T, recursive=FALSE) d <- data.frame(fileName = unname(sapply(files, basename)), stringsAsFactors = FALSE)
因为第一句不匹配(它包含一个尾随的filename | word | component | leftContext ------------------------------------------------------------------------------------- adapter.some-component.lst adapter some-component Een aanpassing aan de
),第二句也不匹配(它包含附加的s
)。所以我需要的是一个精确的单词匹配,但它应该不区分大小写 我想我需要在过程的早期删除不包含单词的行。可能在我们定义-aansluiting
的地方。我的看法是:e
其他单词与单词不完全匹配(在本例中,它们后面都是e <- do.call(rbind, lapply(files, function(x) { # if SENTENCE contains WORD (case insensitive) data.frame(fileName = x, sentence = readLines(x, encoding="UTF-8"), stringsAsFactors = FALSE) # endif }))
,但破折号并不总是在那里!诸如-sometext
之类的单词也应该排除在外。输出中的第二行没有leftContext,因为在数据中,它前面没有任何内容 我希望我已经明确了我需要什么。我最感兴趣的是排除在句子中找不到单词的行(不区分大小写)aidsprobleem
我尝试应用下面tospig的解决方案。
是我已经拥有的最后一个数据帧,它看起来像这样(只是一个视觉示例): 然后,我尝试删除在df
语句中找不到
节点的行(在本例中为1、3和6):
pattern从另一个角度来看我(现在已删除)之前的答案 给出最终数据帧的示例
e
t1 <- "Het aids-probleem ontstaat door mensen zonder vaste partner, legt de speciale editie uit" t2 <- "Vorig jaar stierven 3 miljoen mensen aan aids en raakten er 5 miljoen besmet met hiv" t3 <- "Zuid-Afrika heeft de meeste aids-gevallen ter wereld." t4 <- "Aids is geen pretje." t5 <- "Veilige seks kan aids voorkomen." t6 <- "Want naarmate de aids-epidemie in Zuid-Afrika en omliggende landen groeit" node <- rep("aids",6) t7 <- "Waar is de adapter-aansluiting?" t8 <- "Een aanpassing aan de adapter" node <- c(node, rep("adapter",2)) e <- data.frame(node = node, sentence = c(t1, t2, t3, t4, t5, t6, t7, t8), stringsAsFactors=FALSE)
您可以使用正则表达式获取包含您单词的句子的索引:word@lukeA不使用
也抓住我试图避免的案例?例如\\b
?查看它是否给您错误或警告?aids epidemie
,vsgsub(“-”,c(“aids”,“aids”),“some-text”)
@tospig第一个给出错误:参数“replacement”的长度大于1,并且只有第一个元素将被使用。我的点是“警告”与“错误”不同。我的示例试图演示您传递的是向量(长度大于1)替换长度为1的内容。“警告”告诉您操作“有效”,但仅使用向量的第一个元素。您分配给e$leftContext的行实际上应该是句子。leftContext包含单词的所有剩余内容(例如。*Vorig jaar stierven 3 miljoen mensen aan*)。其次,我需要它动态工作,即对所有单词(从文件名派生)。换句话说,我不能像那样定义gsub(“-”,“aids”,“some-text”)
。最后,当我测试这个时,我没有得到[2]作为输出。请查看我的编辑,在水平线下。我没有成功地创建这个动态。而且,这个正则表达式不是更简单吗?模式。
@BramVanroy,我在正则表达式中添加了(word |^word | word$)
,以便稍后在*
命令中使用。您可以在我的初始帖子中看到,我知道如何减去左侧上下文(sub
上下文)
filename | word | component | leftContext ------------------------------------------------------------------------------------- adapter.some-component.lst adapter some-component Een aanpassing aan de
e <- do.call(rbind, lapply(files, function(x) { # if SENTENCE contains WORD (case insensitive) data.frame(fileName = x, sentence = readLines(x, encoding="UTF-8"), stringsAsFactors = FALSE) # endif }))
/home/nobackup/SONAR/COMPACT/WR-P-P-F/WR-P-P-D0000026.data.ids.xml: <sentence>Het aids-probleem ontstaat door mensen zonder vaste partner, legt de speciale editie uit.</sentence> /home/nobackup/SONAR/COMPACT/WR-P-P-F/WR-P-P-D0000036.data.ids.xml: <sentence>Vorig jaar stierven 3 miljoen mensen aan aids en raakten er 5 miljoen besmet met hiv.</sentence>
/home/nobackup/SONAR/COMPACT/WR-P-P-F/WR-P-P-E0000002.data.ids.xml: <sentence>Zuid-Afrika heeft de meeste aids-gevallen ter wereld.</sentence> /home/nobackup/SONAR/COMPACT/WR-P-P-F/WR-P-P-E0000126.data.ids.xml: <sentence>Aids is geen pretje.</sentence>
/home/nobackup/SONAR/COMPACT/WR-P-P-F/WR-P-P-G0000134.data.ids.xml: <sentence>Veilige seks kan aids voorkomen.</sentence> /home/nobackup/SONAR/COMPACT/WR-P-P-F/WR-P-P-G0000288.data.ids.xml: <sentence>Want naarmate de aids-epidemie in Zuid-Afrika en omliggende landen groeit, zoeken miljoenen besmette mensen steeds wanhopiger naar een geneesmiddel.</sentence>
filename | word | component | leftContext ------------------------------------------------------------------------------------- aids.WR-P-P-D.lst aids WR-P-P-D Vorig jaar stierven 3 miljoen mensen aan aids.WR-P-P-E.lst aids WR-P-P-E aids.WR-P-P-G.lst aids WR-P-P-G Veilige seks kan
fileName | node | component | precedingWord | leftContext | sentence --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- aids.WR-P-P-D.lst aids WR-P-P-D Het Het Het aids-probleem ontstaat door mensen zonder vaste partner, [...] aids.WR-P-P-D.lst aids WR-P-P-D aan Vorig jaar stierven 3 miljoen mensen aan Vorig jaar stierven 3 miljoen mensen aan aids en raakten er 5 miljoen besmet met hiv. aids.WR-P-P-E.lst aids WR-P-P-E meeste Zuid-Afrika heeft de meeste Zuid-Afrika heeft de meeste aids-gevallen ter wereld. aids.WR-P-P-E.lst aids WR-P-P-E Aids is geen pretje. aids.WR-P-P-G.lst aids WR-P-P-G kan Veilige seks kan Veilige seks kan aids voorkomen. aids.WR-P-P-G.lst aids WR-P-P-G de Want naarmate de Want naarmate de aids-epidemie in Zuid-Afrika en omliggende landen groeit [...]
pattern <- c(" - .*","^- .*"," -$") pattern <- gsub("-",df$node,pattern) pattern <- paste0(pattern, collapse="|") df1 <- df[grepl(pattern, df$sentence, ignore.case=TRUE),]
t1 <- "Het aids-probleem ontstaat door mensen zonder vaste partner, legt de speciale editie uit" t2 <- "Vorig jaar stierven 3 miljoen mensen aan aids en raakten er 5 miljoen besmet met hiv" t3 <- "Zuid-Afrika heeft de meeste aids-gevallen ter wereld." t4 <- "Aids is geen pretje." t5 <- "Veilige seks kan aids voorkomen." t6 <- "Want naarmate de aids-epidemie in Zuid-Afrika en omliggende landen groeit" node <- rep("aids",6) t7 <- "Waar is de adapter-aansluiting?" t8 <- "Een aanpassing aan de adapter" node <- c(node, rep("adapter",2)) e <- data.frame(node = node, sentence = c(t1, t2, t3, t4, t5, t6, t7, t8), stringsAsFactors=FALSE)
## vector of regex e$pattern <- paste0(" ", e$node, " .*|^",e$node,".*| ", e$node, "$") ## create logical subset of rows matching the pattern e$log <- apply(e, 1, function(x) { grepl(x["pattern"],x["sentence"],ignore.case=TRUE) }) ## subset by 'TRUE' e <- e[e$log,] ## create leftContext e$leftContext <- apply(e, 1, function(x){ sub(x["pattern"], "", x["sentence"], ignore.case=TRUE) })
> e[,c("node","sentence","leftContext")] node sentence 2 aids Vorig jaar stierven 3 miljoen mensen aan aids en raakten er 5 miljoen besmet met hiv 4 aids Aids is geen pretje. 5 aids Veilige seks kan aids voorkomen. 8 adapter Een aanpassing aan de adapter leftContext 2 Vorig jaar stierven 3 miljoen mensen aan 4 5 Veilige seks kan 8 Een aanpassing aan de