前段时间我发布了a question concerning the same project。我将从该问题中复制粘贴一些信息,以明确发生了什么。
我必须遍历目录中的所有文件,和通过每个文件的每一行。从这些行中,我提取构建我的数据帧所需的数据。每个文件名都是这样的。
airbag.WS-U-E-A.lst
.
是分隔符,.lst
是扩展名(可读为文本)。
每个文件包含每行数据,例如
adapter.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>
airbag.WS-U-E-A.lst
/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>
我的目标是创建一个如下所示的数据框:
filename | word | component | leftContext
-------------------------------------------------------------------------------------
adapter.WR-P-P-F.lst adapter WR-P-P-F Een aanpassingseenheid (
adapter.WR-P-P-F.lst adapter WR-P-P-F ID="1">Het toestel (
adapter.WR-P-P-F.lst adapter WR-P-P-F [...] tussen de sensor en de
airbag.WS-U-E-A.lst airbag WS-U-E-A ja voor den
airbag.WS-U-E-A.lst airbag WS-U-E-A Dobby , als ze valt heeft ze dan wel al ne
fileName:循环浏览文件并列出所有文件名
files <- list.files(pattern="*.lst", full.names=T, recursive=FALSE)
d <- data.frame(fileName = unname(sapply(files, basename)), stringsAsFactors = FALSE)
字:从文件名中提取:
d$word <- gsub("\\..+", "", d$fileName, perl=TRUE)
组件:从文件名中提取:
d$component <- gsub("^[^.]+.", "", d$fileName, perl=TRUE)
d$component <- gsub(".lst$", "", d$component, perl=TRUE)
leftContext:首先得到句子,然后提取左上下文。 See this question.
# New frame, creates e$sentence which holds the sentence
e <- do.call(rbind, lapply(files, function(x) {
data.frame(fileName = x, sentence = readLines(x, encoding="UTF-8"), stringsAsFactors = FALSE)
}))
# Merge two frames
df <- merge(d, e, by="fileName", all=TRUE)
# Get contexts
contexts <- strsplit(df$sentence, df$node)
df$leftContext <- sapply(contexts, `[`, 1)
有。现在我得到了我想要的结果!正如我在上面发布的那样。 然而,这就是问题所在。
在我的项目中,我只想要实际包含word
的句子。比方说我们将word
定义为适配器,但我只有以下句子:
Ik zie de adapters niet
Waar is de adapter-aansluiting?
Een aanpassing aan de adapter
输出应为:
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
}))
但公平地说,我不知道如何应用这个。以下是一些示例数据:
aids.WR-P-P-D.lst
/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>
aids.WR-P-P-E.lst
/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>
aids.WR-P-P-G.lst
/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
其他人与这个词完全匹配(在这种情况下,他们都跟着-sometext
,但破折号并不总是在那里!aidsprobleem
之类的词也应该被排除在外。输出中的第二行没有leftContext,因为在数据中,它没有任何内容。
我希望我已经明确了我需要的东西。我最感兴趣的是排除在句子中找不到单词的行(不区分大小写)。
我尝试在下面应用tospig的解决方案。 df
是我已经拥有的最终数据框,看起来像这样(仅仅是一个可视化示例):
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 [...]
然后我尝试删除node
中未找到sentence
的行(在本例中为1,3和6):
pattern <- c(" - .*","^- .*"," -$")
pattern <- gsub("-",df$node,pattern)
pattern <- paste0(pattern, collapse="|")
df1 <- df[grepl(pattern, df$sentence, ignore.case=TRUE),]
但是,gsub会出错:
在gsub中(“ - ”,df $ node,pattern):参数'replacement'的长度为&gt; 1,只使用第一个元素
这对我来说似乎合情合理:我告诉R,替换应该以每个单词为基础,例如只应在具有df $ node = aids的句子中查找辅助工具。
答案 0 :(得分:0)
从另一个角度来看我的(现已删除)之前的答案,
给出了最终数据框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
哪个给出了
end_date = date.split(' to ')[1]
IndexError: list index out of range