diff --git a/README.md b/README.md new file mode 100644 index 0000000..d31c876 --- /dev/null +++ b/README.md @@ -0,0 +1,145 @@ +# Verzamelen van nieuwsberichten + +## Bronnen: verzamelen + +Elke directory waarvan de naam met een hoofdletter begint is voor een +enkele nieuwsbron. + +De onverwerkte berichten worden opgeslagen in een subdirectory +jaar/maand/dag voor NieuwsNL en in subdirectory jaar/weeknummer voor de +overige bronnen. + +Het formaat van de data verschilt per bron. Soms is er voor elk bericht +alleen een XML-bestand (`*.xml`), een fragment afkomstig uit de +RSS-feed, waar heel de tekst en alle gegevens al in staan. Wanneer de +RSS-feed niet de complete tekst bevat, dan worden de HTML-pagina's van +nieuwe berichten gedownload, en wordt daar de tekst uit gehaald. Dan +krijg je bestanden zoals `*.json` en/of `*.txt`. + +Als er fouten bij het verzamelen zijn dan zijn er bestanden op `*.err` +en mogelijk `*.html`. + +Gewoonlijk als er iets mis gaat probeert de software een uur later +dezelfde berichten weer te verwerken. Om dat te voorkomen kunnen +bestanden handmatig hernoemd worden van `*.err` naar `*.skip`. Voor +berichten van een type waarvan bekend is dat ze geen tekst bevatten +worden automatisch bestanden op `*.skip` gemaakt. + +## Verwerking + +Elke dag voor NieuwsNL en alleen op dinsdag voor de overige bronnen +worden de teksten verwerkt. De teksten worden omgezet naar +getokeniseerde zinnen met labels, door Alpino geparst, en voorzien van +metadata. + +Dit gebeurt door de scripts `txt2corpus.sh` van elke bron. De scripts +variëren per bron omdat het formaat waarin de teksten aanwezig zijn +verschillen per bron. + +De resultaten staan in de subdirectory's `corpus` van elke bron. + +## Analyse + +Op woensdag worden de geparste zinnen van de afgelopen week geanalyseerd. +(De data voor NieuwsNL worden hierbij samengevoegd in één week.) Er +worden queries uitgevoerd, tellingen gedaan, ranglijsten gemaakt. Voor +sommige queries wordt een top 20 samengesteld van meest voorkomende +items die nog niet eerder in de top 20 stonden. + +Voor de analyse worden bronnen samengevoegd in onderdelen: algemeen, +amsterdam, groningen, literatuur, vlaanderen. De resultaten worden +bij elkaar opgeslagen in directory `data`. + +Uit de analyse worden de data gehaald die nodig zijn voor de +webapp, en opgeslagen als json, in subdirectory `data/json`. + +Dit alles gebeurt door het script `collect.sh` + +Je kunt de analyse ook handmatig doen, met het script `query.sh` + + +## Uitvoering + +Alles gebeurt vanuit cron. Foutmeldingen en waarschuwingen worden per +mail verstuurd door cron. + +### crontab van p209327@colossus + +Is `/net/corpora` schrijfbaar? + +``` +# m h dom mon dow command +2 * * * * /net/aistaff/kleiweg/services/nfs/test.sh +``` + +Berichten verzamelen + +``` +# m h dom mon dow command +3 * * * * /net/corpora/nlnieuws/AT5/at5 +4 * * * * /net/corpora/nlnieuws/BuurtAdam/buurtadam +5 * * * * /net/corpora/nlnieuws/BuurtGrn/buurtgrn +6 * * * * /net/corpora/nlnieuws/GG/gg +7 * * * * /net/corpora/nlnieuws/HLN/hln +8 * * * * /net/corpora/nlnieuws/LitNL/litnl +9 * * * * /net/corpora/nlnieuws/NieuwsNL/nieuwsnl +10 * * * * /net/corpora/nlnieuws/NOS/nos +11 * * * * /net/corpora/nlnieuws/NU/nu +12 * * * * /net/corpora/nlnieuws/Oog/oog +13 * * * * /net/corpora/nlnieuws/Parool/parool +14 * * * * /net/corpora/nlnieuws/RO/ro +15 * * * * /net/corpora/nlnieuws/RTVNoord/rtvnoord +16 * * * * /net/corpora/nlnieuws/Sargasso/sargasso +17 * * * * /net/corpora/nlnieuws/Sikkom/sikkom +18 * * * * /net/corpora/nlnieuws/Tzum/tzum +19 * * * * /net/corpora/nlnieuws/VRT/vrt +``` + +Nieuws verwerken: tekst omzetten naar zinnen, parsen, metadata toevoegen + +NieuwsNL elke dag, overigen alleen op dinsdag + +``` +# m h dom mon dow command +0 1 * * 2 /net/corpora/nlnieuws/AT5/txt2corpus.sh +0 1 * * 2 /net/corpora/nlnieuws/BuurtAdam/txt2corpus.sh +0 1 * * 2 /net/corpora/nlnieuws/BuurtGrn/txt2corpus.sh +0 1 * * 2 /net/corpora/nlnieuws/GG/txt2corpus.sh +0 1 * * 2 /net/corpora/nlnieuws/HLN/txt2corpus.sh +0 1 * * 2 /net/corpora/nlnieuws/LitNL/txt2corpus.sh +0 1 * * * /net/corpora/nlnieuws/NieuwsNL/txt2corpus.sh +0 1 * * 2 /net/corpora/nlnieuws/NOS/txt2corpus.sh +0 1 * * 2 /net/corpora/nlnieuws/NU/txt2corpus.sh +0 1 * * 2 /net/corpora/nlnieuws/Oog/txt2corpus.sh +0 1 * * 2 /net/corpora/nlnieuws/Parool/txt2corpus.sh +0 1 * * 2 /net/corpora/nlnieuws/RO/txt2corpus.sh +0 1 * * 2 /net/corpora/nlnieuws/RTVNoord/txt2corpus.sh +0 1 * * 2 /net/corpora/nlnieuws/Sargasso/txt2corpus.sh +0 1 * * 2 /net/corpora/nlnieuws/Sikkom/txt2corpus.sh +0 1 * * 2 /net/corpora/nlnieuws/Tzum/txt2corpus.sh +0 1 * * 2 /net/corpora/nlnieuws/VRT/txt2corpus.sh +``` + +Ging alles goed: zo niet, dan kunnen er nog lockfile zijn + +``` +# m h dom mon dow command +50 0 * * * find /net/corpora/nlnieuws -name lock +``` + +Op woensdag alles verzamelen: queries uitvoeren, data die nodig is voor +webapp omzetten naar json + +``` +# m h dom mon dow command +0 1 * * 3 /net/corpora/nlnieuws/collect.sh +``` + +### crontab van f109308@colossus + +Json-bestanden voor de webapp overzetten naar het webplatform + +``` +# m h dom mon dow command +30 0-23/4 * * * rsync -e 'ssh -F /net/aistaff/alfa/.ssh/config' -a --no-g /net/corpora/nlnieuws/data/json/ webalfa:/home/www/f109308/site/wvdm/data +``` diff --git a/namen.sh b/query.sh similarity index 99% rename from namen.sh rename to query.sh index ff2fadf..cac0a71 100755 --- a/namen.sh +++ b/query.sh @@ -15,7 +15,7 @@ gebruik: 1 : nieuwe namen 2 : nieuwe woorden 3 : nieuwe woorden met postag en lemma - 4 : bestaaande locaties + 4 : bestaande locaties 5 : bestaande personen 6 : bestaande organisaties 7 : bestaande andere namen diff --git a/woord-van-de-maand.txt b/woord-van-de-maand.txt deleted file mode 100644 index d7f4b9b..0000000 --- a/woord-van-de-maand.txt +++ /dev/null @@ -1,232 +0,0 @@ -Vragen: - -- hoe data range selecteren (bv alles van maart 2026) - -- website met lijstjes top-N (20?) - - nieuwe namen - - wel of niet onderverdelen naar categorie? - - nieuwe woorden - - met postag - - bestaande namen - - personen - - plaatsen - - organisaties - - misc - -- queries worden nog beetje aangepast denk ik - -"nieuw": nu: niet in Alpino, later (ook): niet in top-N van vorige maand. - - -find /net/corpora/nlnieuws/ -name '*data.dz' | xargs alto fp:'//node[((@cat="mwu" and node[@pt="spec"]) or (@pt and @*="eigen" and not(@rel="mwp"))) and not(@his="normal") and not(@his_1="decap" or @his_1="0")]' tt:%w |sort | uniq -c |sort -nr | head -n 20 - -"nieuwe namen" - - 445 Straat van Hormuz - 433 Jetten - 309 AI - 301 Høiby - 250 Odido - 190 Zelensky - 174 Rob Jetten - 153 VRT NWS - 134 Jeffrey Epstein - 130 Anthropic - 125 Schulting - 115 GroenLinks-PvdA - 109 TikTok - 106 Xandra Velzeboer - 106 Kyiv - 106 JA21 - 104 Starmer - 98 Marius Borg Høiby - 95 Revolutionaire Garde - 94 Jens van 't Wout - - -"nieuwe woorden": - -find /net/corpora/nlnieuws/ -name '*data.dz' | xargs alto fp:'//node[@his and not(@rel="mwp" or @cat="mwu") and not(@his="normal" or @his="name" or @his="prefix_name" or @his_1="decap" or @his_1="0" or @his="skip" or @his="robust_skip" or @his="w_dia" or @his="wo_dia" or @his="within_word_conjunct")]' tt:%w |sort | uniq -c |sort -nr |head -n 20 - - 150 Trump-regering - 141 coalitieakkoord - 126 zeestraat - 122 Golfregio - 107 massastart - 96 Amerikaans-Israëlische - 92 ballistische - 90 datalek - 85 kabinet-Jetten - 82 lng - 74 droneaanval - 68 vergeldingsaanvallen - 61 tussenronde - 59 Iranoorlog - 58 vrijgave - 56 speelzand - 55 regering-Trump - 54 sprintrace - 54 ploegenachtervolging - -liever met postag en lemma erbij: - -find /net/corpora/nlnieuws/ -name '*data.dz' | xargs alto fp:'//node[@his and not(@rel="mwp" or @cat="mwu") and not(@his="normal" or @his="name" or @his="prefix_name" or @his_1="decap" or @his_1="0" or @his="skip" or @his="robust_skip" or @his="w_dia" or @his="wo_dia" or @his="within_word_conjunct")]' tt:"%w \t %l \t %P" |sort | uniq -c |sort -nr |head -n 20 - - 150 Trump-regering Trump_regering N(soort,ev,basis,zijd,stan) - 141 coalitieakkoord coalitie_akkoord N(soort,ev,basis,onz,stan) - 126 zeestraat zee_straat N(soort,ev,basis,zijd,stan) - 121 Golfregio Golf_regio N(soort,ev,basis,zijd,stan) - 107 massastart massa_start N(soort,ev,basis,zijd,stan) - 96 Amerikaans-Israëlische Amerikaans_Israëlisch ADJ(prenom,basis,met-e,stan) - 90 datalek data_lek N(soort,ev,basis,onz,stan) - 90 ballistische ballistisch ADJ(prenom,basis,met-e,stan) - 82 lng lng N(soort,ev,basis,onz,stan) - 74 droneaanval drone_aanval N(soort,ev,basis,zijd,stan) - 72 kabinet-Jetten kabinet-Jetten N(soort,ev,basis,onz,stan) - 66 vergeldingsaanvallen vergelding_aanval N(soort,mv,basis) - 61 tussenronde tussen_ronde N(soort,ev,basis,zijd,stan) - 59 Iranoorlog Iran_oorlog N(soort,ev,basis,zijd,stan) - 56 speelzand speel_zand N(soort,ev,basis,onz,stan) - 55 regering-Trump regering_Trump N(soort,ev,basis,zijd,stan) - 54 vrijgave vrij_gave N(soort,ev,basis,zijd,stan) - 54 sprintrace sprint_race N(soort,ev,basis,zijd,stan) - 54 ploegenachtervolging ploeg_achtervolging N(soort,ev,basis,zijd,stan) - 53 staatsmedia staat_medium N(soort,mv,basis) - -"bestaande locaties": - -find /net/corpora/nlnieuws/ -name '*data.dz' | xargs alto fp:'//node[(@neclass="LOC" and @his="normal" and not(@rel="mwp")) or (@cat="mwu" and node[@pt="spec" and @neclass="LOC"] and @his="normal")]' tt:%l |sort | uniq -c |sort -nr | head -n 20 - - - 3910 Iran - 2180 Nederland - 1929 VS - 1610 Israël - 1218 Midden-Oosten - 1128 Oekraïne - 942 Verenigde Staten - 874 Rusland - 823 Amsterdam - 776 Europa - 668 DEN HAAG - 563 België - 555 China - 445 Milaan - 429 Frankrijk - 389 Duitsland - 380 Brussel - 374 Dubai - 368 Libanon - 364 Groningen - -"bestaande personen": - -find /net/corpora/nlnieuws/ -name '*data.dz' | xargs alto fp:'//node[(@neclass="PER" and @his="normal" and not(@rel="mwp")) or (@cat="mwu" and node[@pt="spec" and @neclass="PER"] and @his="normal")]' tt:%l |sort | uniq -c |sort -nr | head -n 20 - - 1812 Trump - 531 Donald Trump - 327 Khamenei - 309 Epstein - 267 Verstappen - 229 Andrew - 208 Máxima - 187 Ali Khamenei - 161 Orbán - 146 Trumps - 133 Mette-Marit - 133 Keijzer - 126 Willem-Alexander - 126 Kok - 122 Charles - 118 Stolz - 113 Harald - 111 Poetin - 97 Van Persie - 94 Wilders - - - -"bestaande organisaties": - -find /net/corpora/nlnieuws/ -name '*data.dz' | xargs alto fp:'//node[(@neclass="ORG" and @his="normal" and not(@rel="mwp")) or (@cat="mwu" and node[@pt="spec" and @neclass="ORG"] and @his="normal")]' tt:%l |sort | uniq -c |sort -nr | head -n 20 - - - - 2575 ANP - 547 Ajax - 449 Instagram - 421 EU - 357 Defensie - 349 Feyenoord - 348 D66 - 346 VVD - 329 PSV - 305 Hezbollah - 303 Tweede Kamer - 303 NEC - 296 AZ - 265 CDA - 263 OM - 237 NU.nl - 232 NOS - 231 BBC - 224 Kamer - 219 Openbaar Ministerie - - -"bestaande andere namen (boeken, films, events, .. )": - -find /net/corpora/nlnieuws/ -name '*data.dz' | xargs alto fp:'//node[(@neclass="MISC" and @his="normal" and not(@rel="mwp")) or (@cat="mwu" and node[@pt="spec" and @neclass="MISC"] and @his="normal")]' tt:%l |sort | uniq -c |sort -nr | head -n 20 - - - 361 Spelen - 289 Olympische Spelen - 278 Eredivisie - 244 X - 222 Winterspelen - 177 Champions League - 147 Formule 1 - 143 Premier League - 137 X. - 112 Oscars - 102 Grand Prix - 100 Paralympische Spelen - 90 Facebook - 78 Eurovisie Songfestival - 76 WhatsApp - 75 Parijs-Nice - 70 Tweede Wereldoorlog - 67 Oscar - 66 The New York Times - 62 AEX-index - - - - - - -/* deze misschien niet? */ -"nieuwe adjectieven, deelwoorden en werkwoorden": - -find /net/corpora/nlnieuws/ -name '*data.dz' | xargs alto fp:'//node[@pt and @his and not(../@his="normal" or @rel="mwp" or ../@his="name" or ../@his_1="decap") and not(@his="normal" or @his="name" or @his="skip" or @his="robust_skip" or @his="w_dia" or @his="wo_dia" or @his="decap" or @his="within_word_conjunct") and not(@pt="n") ]' tt:"%w %P" |sort | uniq -c |sort -nr |head -n 20 - - 96 Amerikaans-Israëlische ADJ(prenom,basis,met-e,stan) - 90 ballistische ADJ(prenom,basis,met-e,stan) - 41 radicaal-rechtse ADJ(prenom,basis,met-e,stan) - 29 Israëlisch-Amerikaanse ADJ(prenom,basis,met-e,stan) - 27 pro-Iraanse ADJ(prenom,basis,met-e,stan) - 25 Belarussische ADJ(prenom,basis,met-e,stan) - 22 radicaal-linkse ADJ(prenom,basis,met-e,stan) - 21 Omaanse ADJ(prenom,basis,met-e,stan) - 19 pro-Palestijnse ADJ(prenom,basis,met-e,stan) - 16 partijloze ADJ(prenom,basis,met-e,stan) - 15 Eindhovense ADJ(prenom,basis,met-e,stan) - 14 cybercriminele ADJ(prenom,basis,met-e,stan) - 14 bestverkochte WW(vd,prenom,met-e) - 12 onbevestigde WW(vd,prenom,met-e) - 12 kindgebonden WW(vd,prenom,zonder) - 12 AI-gegenereerde WW(vd,prenom,met-e) - 11 toekomstbestendig ADJ(vrij,basis,zonder) - 11 omhooggegaan WW(vd,vrij,zonder) - 11 Iraans-Koerdische ADJ(prenom,basis,met-e,stan) - 11 antifascistische ADJ(prenom,basis,met-e,stan)