-
Notifications
You must be signed in to change notification settings - Fork 0
/
paper2html.pl
executable file
·212 lines (190 loc) · 5.89 KB
/
paper2html.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
use strict;
use warnings;
use Dumpvalue;
use Math::Round;
use utf8;
binmode(STDIN, ":utf8");
binmode(STDOUT, ":utf8");
binmode(STDERR, ":utf8");
my $paperList = [];
my $affCount = {};
my $action;
my $buf;
my $paper;
my $lineno = 0;
while (<STDIN>) {
$lineno++;
chomp;
if (/^$/) {
$action = "CLEAR";
} elsif (/^\#/) {
$action = "NOOP";
} elsif (/^http/) {
unless ($action eq "AUTHOR") {
die "$lineno\tURL must follow AUTHOR";
}
$action = "URL";
$buf = $_;
} elsif (/^(LONG|SHORT|INDUSTRY|STUDENT|DEMO)$/) {
$action = "TYPE";
$buf = $_;
} elsif ($action eq "TYPE") {
$action = "TITLE";
$buf = $_;
} elsif ($action eq "TITLE") {
$action = "AUTHOR";
$buf = $_;
} elsif ($action eq "AUTHOR") {
$action = "AUTHOR";
$buf = $_;
} else {
die "$lineno\tunrecognized line";
}
if ($action eq "TYPE") {
if ($paper) {
die "previous paper";
}
$paper = { "type" => $buf, "authors" => [] }
} elsif ($action eq "TITLE") {
$paper->{"title"} = $buf;
} elsif ($action eq "AUTHOR") {
my @tmp = split(/\t/, $buf);
my $name = shift(@tmp);
push(@{$paper->{"authors"}}, { "name" => $name, "affiliation" => \@tmp });
} elsif ($action eq "URL") {
$paper->{"url"} = $buf;
} elsif ($action eq "CLEAR") {
if ($paper) {
push(@$paperList, $paper);
$paper = undef;
}
} elsif ($action eq "NOOP") {
} else {
die "unsupported operation";
}
}
if ($paper) {
if ($action eq "URL") {
push(@$paperList, $paper);
} else {
die "incomplete unit";
}
}
# Dumpvalue->new->dumpValue($paperList);
# exit;
foreach my $paper (@$paperList) {
my $L = scalar(@{$paper->{"authors"}});
if ($L <= 0) {
die "malformed paper";
}
for (my $i = 0; $i < $L; $i++) {
my $w;
if ($L == 1) {
$w = 1.0;
} elsif ($i == 0) {
$w = 0.5;
} else {
$w = 0.5 / ($L - 1);
}
if ($paper->{"type"} =~ /^(SHORT|INDUSTRY)$/) {
$w *= 0.75;
} elsif ($paper->{"type"} =~ /^(STUDENT|DEMO)$/) {
$w *= 0.5;
}
my $author = $paper->{authors}->[$i];
my $J = scalar(@{$author->{"affiliation"}});
foreach my $aff (@{$author->{"affiliation"}}) {
unless ($aff =~ /^\#/) {
$affCount->{$aff} += $w / $J;
}
}
}
}
# Dumpvalue->new->dumpValue($affCount);
my @sorted = sort { $affCount->{$b} <=> $affCount->{$a} or $a cmp $b } keys(%$affCount);
# foreach my $aff (@sorted) {
# printf("%s\t%.2f\n", $aff, nearest(0.01, $affCount->{$aff}));
# }
printf <<'__DOC_HEADER__';
<div class="container-fluid">
<h1>日本所属の言語処理トップカンファレンス論文 (2022年)</h1>
<div>
<p class="text-right">MURAWAKI Yugo</p>
<p class="text-right">Last Update: March 4, 2023.</p>
</div>
<div>
<p>
日本の組織を所属とする者が、2022年に言語処理のトップカンファレンスもしくはトップ論文誌で発表した論文一覧です (<a href="https://murawaki.org/misc/japan-nlp-2021.html">2021年版</a>、<a href="https://murawaki.org/misc/japan-nlp-2020.html">2020年版</a>、<a href="https://murawaki.org/misc/japan-nlp-2019.html">2019年版</a>、<a href="https://murawaki.org/misc/japan-nlp-2018.html">2018年版</a>、<a href="https://murawaki.org/misc/japan-nlp-2017.html">2017年版</a>、<a href="https://murawaki.org/misc/japan-nlp-2016.html">2016年版</a>) (<a href="http://phontron.com/misc/japan-nlp-2015.html">2015年版</a>、<a href="http://phontron.com/misc/japan-nlp-2014.html">2014年版</a>は Graham Neubig さん (NAIST、現 CMU) が作成)。
対象は TACL、ACL、NAACL、COLING、EMNLP です (Findings は除外)。Student/Demo 論文も含みます。
収集は手作業なので漏れがあるかもしれません。
データ・スクリプトは <a href="https://github.com/murawaki/japan-nlp/">GitHub</a> で公開しているのでご自由にお使いください。
</p>
方針:
<ul>
<li>full paper 1 本に対して、industry track/short paper は 0.75 本、student research workshop/system demonstration は 0.5 本換算。</li>
<li>所属は大学、研究所、企業くらいの単位で近似しています。実際の研究グループはそれよりも小さい単位の方が多いと思いますが、外部から客観的にそれを同定するのは難しいので。</li>
<li>著者が複数の場合は、第1著者に 0.5 を配分し、残りの 0.5 は以降の著者で等分。</li>
<li>1人の著者に複数の所属がある場合は等分。</li>
<li>所属は論文における著者の自己申告に機械的に従います。</li>
</ul>
</div>
__DOC_HEADER__
printf <<'__TABLE_HEADER__';
<div>
<h2>所属ごとの論文数</h2>
<table class="table table-bordered table-striped" style="width: auto;">
<thead>
<tr>
<th>数</th>
<th>所属</th>
</tr>
</thead>
<tbody>
__TABLE_HEADER__
foreach my $aff (@sorted) {
printf("<tr><td>%.2f</td><td>%s</td></tr>\n", nearest(0.01, $affCount->{$aff}), $aff);
}
printf <<'__TABLE_FOOTER__';
</tbody>
</table>
</div>
__TABLE_FOOTER__
printf <<'__TABLE_HEADER__';
<div>
<h2>論文</h2>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>種別</th>
<th>著者 (所属)</th>
<th>論文表題</th>
</tr>
</thead>
<tbody>
__TABLE_HEADER__
foreach my $paper (@$paperList) {
my @authors;
foreach my $author (@{$paper->{"authors"}}) {
my @affs;
for my $aff (@{$author->{affiliation}}) {
if ($aff =~ /^\#/) {
push(@affs, sprintf("<span style=\"color: grey;\">%s</span>", substr($aff, 1)));
} else {
push(@affs, $aff);
}
}
my $affiliations = join("; ", @affs);
push(@authors, sprintf("%s (%s)", $author->{name}, $affiliations));
}
my $authors = join("<br>", @authors);
printf("<tr><td style=\"vertical-align: middle;\">%s</td><td>%s</td><td style=\"vertical-align: middle;\"><a href=\"%s\">%s</a></td></tr>\n", $paper->{"type"}, $authors, $paper->{"url"}, $paper->{"title"});
}
printf <<'__TABLE_FOOTER__';
</tbody>
</table>
</div>
__TABLE_FOOTER__
printf <<'__DOC_FOOTER__';
</div>
__DOC_FOOTER__
1;