Ich musste kürzlich einige HTML-Elementstatistiken erstellen. Ich habe ein Webkorpus mit 600.000 Seiten aus dem Jahr 2009 heruntergeladen und die folgenden Statistiken für die Anzahl der Verwendungen der Tags in diesem Korpus erhalten, die auf 1000 begrenzt sind.
a 39923975
td 29707781
br 17266040
div 15644761
tr 15340012
img 13539744
Option 9319944
li 8531300
Spannweite 7573226
Tabelle 5999791
Schriftart 5329688
b 4419975
S. 3762731
Eingabe 3413040
Skript 3368258
stark 1855448
meta 1809099
Link 1262896
ul 1246231
Std. 712094
Formular 703914
dd 521143
i 503215
Mitte 483503
h2 477122
Titel 446862
Körper 445094
Kopf 436058
HTML 435397
h3 400073
393534
em 363613
dt 363085
Etikett 342376
h1 318542
Wählen Sie 311449
Stil 292716
tbody 275069
nobr 251825
klein 242097
Noscript 227474
u 227338
Bereich 221226
param 204798
h4 162877
dl 142403
iframe 126827
o 86064
sup 72331
h5 64141
Feldsatz 55447
Textbereich 54044
Objekt 53226
51864 einbetten
zitiere 47406
scr 47050
tt 45748
groß 44210
optgroup 43329
blockquote 42869
Basis 42147
Karte 41401
col 40191
wbr 36995
Legende 32738
d 29939
ol 28879
Thead 27083
Abstandhalter 26848
vor 26118
h6 24766
s 24510
Taste 23417
Code 21190
rdf 20960
abbr 20356
Akronym 20186
w 16818
noindex 14038
dfn 12974
Festzelt 11350
v 11165
Streik 10522
Adresse 9725
Beschreibung 9058
sc 8677
Bildunterschrift 8633
st1 8374
Colgroup 8191
Artikel 8090
Pubdate 7160
Schicht 6156
Sub 5634
ins 5433
Kategorie 5106
Guid 4936
Dokument 4678
del 4639
Rahmen 4548
dc 4323
Bild 4306
var 3729
Variable 3292
Fuß 3282
x 3120
xs 2963
Zeroboard 2870
js 2825
ilayer 2823
Frameset 2738
Medien 2669
rx 2658
Autor 2581
c 2563
h 2227
ifr 2213
xml 2134
m 2007
csobj 1972
n 1948
Set 1872
l 1870
erlaubt 1848
Samp 1767
Menü 1738
erfordert 1732
Noframes 1714
z 1686
diese 1655
q 1638
t 1629
f 1622
Inhalt 1612
Lizenz 1533
links 1501
srch 1488
kbd 1482
sfels 1466
hs 1438
Abs. 1434
Kommentare 1394
Änderungsbilder 1393
Liste 1362
aktinisch 1358
Aktion 1352
Skype 1338
Myarr 1337
Index 1283
blip 1279
scri 1262
mlp 1205
e 1199
URL 1199
Basisschrift 1167
Kanal 1153
wenn 1152
u1 1151
g 1137
xsl 1137
wörtlich 1108
RSS 1105
itemtemplate 1053
j 1036
blinken 1022
len 1018
ID 1001
1000 ausrichten
Hier sind ausgewählte Tags aus HTML5 und anderen, die weniger häufig sind.
bdo 425
Zitat 123
Zeit 61
Markierung 23
bdi 5
Methodik
Ich habe nichts Besonderes ausprobiert. Ich habe gerade den ganzen Korpus (2,4 GB gezippt) genommen und ihn durch Perl laufen lassen
gzip -c web200904.gz | perl extractTags.pl
wo das Perl-Skript tut
use strict;
my %tags = ();
my $count = 0;
sub emit() {
foreach my $key (keys(%tags)) {
print "$key:$tags{$key}\n";
}
%tags = ();
$count = 0;
}
sub count($) {
my $tagname = $_[0];
$tagname = "\L$tagname";
$tags{$tagname} += 1;
if (++$count >= 1000000) {
emit();
}
return "";
}
while (<STDIN>) {
s/<([a-zA-Z][a-zA-Z0-9-]*)/count($1)/ge
}
emit();
Ich habe dann die Ausgabe mit einem Python-Skript zusammengefasst.
import re
f = open('/tmp/tagCounts', 'r')
counts = {}
pattern = re.compile(r'^([^:]+):([0-9]+)\n?$')
while True:
line = f.readline()
if not line: break
match = pattern.match(line)
if match:
name, count = match.groups()
count = int(count)
counts[name] = counts.get(name, 0) + count
counts = counts.items()
counts.sort(lambda a, b: cmp(b[1], a[1]) or cmp(a[0], b[0]))
for (name, count) in counts:
print "%s%s%d" % (name, ' ' * (max(1, (40 - len(name)))), count)
Vorsichtsmaßnahmen
Dieses Skript verwendet eine sehr einfache Heuristik, um nach Tags zu suchen, wird jedoch in einigen Kontexten durch ein '<' gefolgt von einem Wort verwirrt:
- Vergleiche in JS oder CSS:
<script>if (x<notatag) ...
- Kommentiert out tags:
<!-- <notatag> -->
,
- Nicht-Tag - Inhalt in
<title>
, <textarea>
, <noscript>
oder ähnliche Elemente.