quanteda / readtext

an R package for reading text files
https://readtext.quanteda.io
120 stars 28 forks source link

Separator for XML-Elements #93

Closed Astelix closed 7 years ago

Astelix commented 7 years ago

readtext should give the user a way to separate XML-Elements in the generated Output.

Example:

library(readtext) txt <- readtext("tvsubtitles.xml", text = "//tt:body")

Input Data: Wir haben exklusive Neuigkeiten</tt:span> im Fall Anis Amri.</tt:span> </tt:p> Die lassen Zweifel zu,</tt:span> ob das, was der Innenminister</tt:span> </tt:p> uns bisher dazu gesagt hat,</tt:span> tatsächlich stimmt.</tt:span> </tt:p> Ich habe den Eindruck aus NRW,</tt:span> dass alle Sicherheitsbehörden,</tt:span> </tt:p> auch die, die im Gemeinsamen</tt:span> Terrorabwehrzentrum</tt:span> </tt:p> zusammengearbeitet haben,</tt:span> alles an rechtlichen Möglichkeiten</tt:span> </tt:p> ausgeschöpft haben,</tt:span> um Anis Amri zu beobachten,</tt:span> </tt:p> abzuhören und</tt:span> möglicherweise in Haft zu bringen.</tt:span> </tt:p> Alle rechtlichen Möglichkeiten</tt:span> ausgeschöpft? Wirklich?</tt:span> </tt:p> Im Fall Anis Amri gibt es</tt:span> inzwischen täglich neue Details.</tt:span> </tt:p> Und immer mehr Zweifel,</tt:span> ob die Behörden alles getan haben,</tt:span> </tt:p> was in ihrer Macht stand,</tt:span> um Anis Amri aufzuhalten</tt:span> </tt:p> und das Attentat auf den Berliner</tt:span> Weihnachts-Markt zu verhindern.</tt:span> </tt:p> Immer größer wird der Druck</tt:span> auf NRW-Innenminister Jäger.</tt:span> </tt:p> Recherchen zeigen: Behörden in NRW</tt:span> haben entscheidende Chancen vertan,</tt:span> </tt:p> Anis Amri zu stoppen.</tt:span> </tt:p> Sie hatten ihn schon.</tt:span> </tt:p> Hier in Ravensburg</tt:span> </tt:p> kommt Anis Amri am Samstag,</tt:span> den 30.06.2016 ins Gefängnis.</tt:span> </tt:p> Polizisten greifen ihn zuvor</tt:span>

Result txt$text (Problems with bold markup):

"Wir haben exklusive Neuigkeitenim Fall Anis Amri.Die lassen Zweifel zu,ob das, was der Innenministeruns bisher dazu gesagt hat,tatsächlich stimmt.Ich habe den Eindruck aus NRW,dass alle Sicherheitsbehörden,auch die, die im GemeinsamenTerrorabwehrzentrumzusammengearbeitet haben,alles an rechtlichen Möglichkeitenausgeschöpft haben,um Anis Amri zu beobachten,abzuhören undmöglicherweise in Haft zu bringen.Alle rechtlichen Möglichkeitenausgeschöpft? Wirklich?Im Fall Anis Amri gibt esinzwischen täglich neue Details.Und immer mehr Zweifel,ob die Behörden alles getan haben,was in ihrer Macht stand,um Anis Amri aufzuhaltenund das Attentat auf den BerlinerWeihnachts-Markt zu verhindern.Immer größer wird der Druckauf NRW-Innenminister Jäger.Recherchen zeigen: Behörden in NRWhaben entscheidende Chancen vertan,Anis Amri zu stoppen.Sie hatten ihn schon.Hier in Ravensburgkommt Anis Amri am Samstag,den 30.06.2016 ins Gefängnis.Polizisten greifen ihn zuvorin einem Fernbus nach Zürich auf.Amri hat ...

Typical Problem:

dass alle Sicherheitsbehörden,auch die, die im GemeinsamenTerrorabwehrzentrumzusammengearbeitet haben

kbenoit commented 7 years ago

OK, here is the reproducible problem:


require(readtext)
rt <- readtext("http://kenbenoit.net/files/20170426_WDR_Aktuelle_Stunde.zip",
               text_field = "//tt:body")
substring(rt$text, 1, 200)
                                                                                                                                                                                                         # 1 
# "Aktuelle Stunde26.04.2017Wir begrüßen Siezur Live-UntertitelungRegierung geht weiter hartgegen mutmaßliche Gülen-Anhängervor, festgenommen wurdenmehr als 1.000 Menschen.Umfragewerte sehen sie unter 6%" 
adamobeng commented 7 years ago

Concatenating all the text contained in descendant nodes is an XPath feature, which does not allow including a separator, unfortunately.

To work around this, I've added a collapse argument in branch feature/xpath_separator, which will be available in the CRAN release. Note that you have to both specify a separator with collapse and an XPath which returns each node's text individually:

> rt <- readtext("http://kenbenoit.net/files/20170426_WDR_Aktuelle_Stunde.zip",
+                               text_field = "//tt:body//*/text()", collapse = ' ')
> substring(rt$text, 1, 200)
[1] "Aktuelle Stunde 26.04.2017 Wir begrüßen Sie zur Live-Untertitelung Regierung geht weiter hart gegen mutmaßliche Gülen-Anhänger vor, festgenommen wurden mehr als 1.000 Menschen. Umfragewerte sehen sie "
>
Astelix commented 7 years ago

That is useful. Without readtext normally I use the XML package to do webscraping and to rearrange the elements of xml/thml in a similiar way.