使用R在句子中查找单词,如果不存在:删除行

时间:2015-07-26 08:58:45

标签: r

前段时间我发布了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 . &gt;</sentence>
/home/nobackup/SONAR/COMPACT/WR-P-P-F/WR-P-P-F0000026.data.ids.xml:  <sentence>ID=&quot;1&quot;&gt;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 . &quot; &gt;</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=&quot;1&quot;&gt;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的句子中查找辅助工具。

1 个答案:

答案 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