This commit is contained in:
Peter Kleiweg
2026-05-24 19:13:09 +02:00
parent 650a13eb4a
commit 9d82f11536
3 changed files with 146 additions and 233 deletions

145
README.md Normal file
View File

@@ -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
```

View File

@@ -15,7 +15,7 @@ gebruik:
1 : nieuwe namen 1 : nieuwe namen
2 : nieuwe woorden 2 : nieuwe woorden
3 : nieuwe woorden met postag en lemma 3 : nieuwe woorden met postag en lemma
4 : bestaaande locaties 4 : bestaande locaties
5 : bestaande personen 5 : bestaande personen
6 : bestaande organisaties 6 : bestaande organisaties
7 : bestaande andere namen 7 : bestaande andere namen

View File

@@ -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)