在带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 . &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>
/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
    ,但破折号并不总是在那里!诸如
    aidsprobleem
    之类的单词也应该排除在外。输出中的第二行没有leftContext,因为在数据中,它前面没有任何内容

    我希望我已经明确了我需要什么。我最感兴趣的是排除在句子中找不到单词的行(不区分大小写)


    我尝试应用下面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
    ?查看它是否给您错误或警告?
    gsub(“-”,c(“aids”,“aids”),“some-text”)
    ,vs
    gsub(“-”,“aids”,“some-text”)
    @tospig第一个给出错误:参数“replacement”的长度大于1,并且只有第一个元素将被使用。我的点是“警告”与“错误”不同。我的示例试图演示您传递的是向量(长度大于1)替换长度为1的内容。“警告”告诉您操作“有效”,但仅使用向量的第一个元素。您分配给e$leftContext的行实际上应该是句子。leftContext包含单词的所有剩余内容(例如。*Vorig jaar stierven 3 miljoen mensen aan*)。其次,我需要它动态工作,即对所有单词(从文件名派生)。换句话说,我不能像那样定义
    模式。
    。最后,当我测试这个时,我没有得到[2]作为输出。请查看我的编辑,在水平线下。我没有成功地创建这个动态。而且,这个正则表达式不是更简单吗?
    (word |^word | word$)
    @BramVanroy,我在正则表达式中添加了
    *
    ,以便稍后在
    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