Исправить цикл, чтобы получить пару слов из xml data.frame - PullRequest
0 голосов
/ 22 февраля 2019

Я хотел бы получить слова в парах и другие теги в парах из XML.Каждая запись xml содержит теги для пары слов, и я хотел бы получить их в виде пары в конце цикла и сохранить их в tabeladomenowa, но sth неверен с циклом.Результат цикла tabelatekstowa в порядке, он содержит все теги из всех данных xml

orth base              ctag     ukb.X1  ukb.X2 ukb.X3 ukb.X4  ukb.X5
1   co   co              comp       <NA>    <NA>   <NA>   <NA>    <NA>
2 jest  być fin:sg:ter:imperf      być.9  40:cst          <NA>    <NA>

, но tabeladomenowa должен выглядеть следующим образом:

co jest  comp fin:sg:ter:imperf <NA> być.9
to mo    conj subst:sg:nom:f    <NA> molibden.1 

Данные XML для цикла ниже:

[[1]] [1] "
<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n
<!DOCTYPE chunkList     SYSTEM \"ccl.dtd\">\n
<chunkList>\n
  <chunk id=\ "ch1\" type=\ "p\">\n
    <sentence id=\ "s1\">\n
      <tok>\n
        <orth>co</orth>\n
        <lex disamb=\ "1\">
          <base>co</base>
          <ctag>comp</ctag>
        </lex>\n </tok>\n
      <tok>\n
        <orth>jest</orth>\n
        <lex disamb=\ "1\">
          <base>być</base>
          <ctag>fin:sg:ter:imperf</ctag>
        </lex>\n
        <prop key=\ "polarity\">0</prop>\n
        <prop key=\ "sense:ukb:syns_id\">250920</prop>\n
        <prop key=\ "sense:ukb:syns_rank\">250920/2923.1281788674 50321/2713.8513986922 250912/2338.6212907775 55138/2113.4485195055 299/1982.0080773263 250925/1857.8172639385 57004/1844.2295105295 250545/1719.7556893073 250899/1689.1818347671 250918/1687.5592215575</prop>\n
        <prop key=\
          "sense:ukb:unitsstr\">być.9(40:cst)</prop>\n </tok>\n </sentence>\n </chunk>\n</chunkList>\n" 
[[2]] [1] "
<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n
<!DOCTYPE chunkList SYSTEM \"ccl.dtd\">\n
<chunkList>\n
  <chunk id=\ "ch1\" type=\ "p\">\n
    <sentence id=\ "s1\">\n
      <tok>\n
        <orth>to</orth>\n
        <lex disamb=\ "1\">
          <base>to</base>
          <ctag>conj</ctag>
        </lex>\n </tok>\n
      <tok>\n
        <orth>mo</orth>\n
        <lex disamb=\ "1\">
          <base>MO</base>
          <ctag>subst:sg:nom:f</ctag>
        </lex>\n
        <prop key=\ "polarity\">0</prop>\n
        <prop key=\ "sense:ukb:syns_id\">32404</prop>\n
        <prop key=\ "sense:ukb:syns_rank\">32404/19991.5487685294</prop>\n
        <prop key=\ "sense:ukb:unitsstr\">molibden.1(24:sbst) Mo.1(24:sbst)</prop>\n </tok>\n
      <ns/>\n
      <tok>\n
        <orth>?</orth>\n
        <lex disamb=\ "1\">
          <base>?</base>
          <ctag>interp</ctag>
        </lex>\n </tok>\n
      <ns/>\n
      <tok>\n
        <orth>e</orth>\n
        <lex disamb=\ "1\">
          <base>e</base>
          <ctag>interj</ctag>
        </lex>\n </tok>\n </sentence>\n </chunk>\n</chunkList>\n"

Цикл основан на ответе на предыдущий вопрос ..

for(tekstxml in tabelka$lemma) {
  toks<-xml_find_all(read_xml(tekstxml), ".//tok")
  orth<-sapply(toks, function(x){xml_text(xml_find_first(x, ".//orth"))})
  base<-sapply(toks, function(x){xml_text(xml_find_first(x, ".//base"))})
  ctag<-sapply(toks, function(x){xml_text(xml_find_first(x, ".//ctag"))})
  ukb<-sapply(toks, function(x) { 
      nodes<-xml_find_all(x, ".//prop")
      #find node with wanted key
      domeny<-nodes[xml_attr(nodes, "key" )=="sense:ukb:unitsstr"]
      #extract text
      domeny<-xml_text(domeny)
      #return NA if node is empty.
      ifelse(is.character(domeny), domeny, NA)
  })
  ukb <- data.frame(do.call('rbind.na', stringr::str_split(as.character(ukb),"[ ()]")))
  tabelatekstowa <- rbind(tabelatekstowa, data.frame(orth,base,ctag,ukb))
  wyr <- NULL
  met <- NULL
  wyrorth <- paste(orth[1],orth[2],sep = " ")
  lematy <- paste(base[1],base[2],sep = " ")
  metafora <- paste(ukb[2],ukb[1], sep = " TO ")
  konstrukcja <- paste(ctag[1],ctag[2],sep = " ")
  tabeladomenowa <- rbind(tabeladomenowa, data.frame(wyrorth,lematy, konstrukcja,metafora))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...