昨日の人文科学とコンピュータでも話したとおり、現時点で青空文庫ModernBERTは、以下の6つがリリースにこぎつけている。
国語研長単位UDによる係り受け解析という視点から見た場合、これら6つのモデルのうちいちばん精度が高いのは、🄻 modernbert-large-japanese-wikipediaである。上三角行列アルゴリズムによる係り受け解析モデルの精度を比較してみよう。Google Colaboratory (GPU版)だと、こんな感じ。
!pip install transformers triton
models=[
"KoichiYasuoka/modernbert-small-japanese-aozora-ud-triangular",
"KoichiYasuoka/modernbert-base-japanese-aozora-ud-triangular",
"KoichiYasuoka/modernbert-large-japanese-aozora-ud-triangular",
"KoichiYasuoka/modernbert-small-japanese-wikipedia-ud-triangular",
"KoichiYasuoka/modernbert-base-japanese-wikipedia-ud-triangular",
"KoichiYasuoka/modernbert-large-japanese-wikipedia-ud-triangular"
]
import os,sys,subprocess
url="https://github.com/UniversalDependencies/UD_Japanese-GSDLUW"
f=os.path.join(os.path.basename(url),"ja_gsdluw-ud-test.conllu")
os.system(f"test -f {f} || git clone --depth=1 {url}")
url="https://universaldependencies.org/conll18/conll18_ud_eval.py"
c=os.path.basename(url)
os.system(f"test -f {c} || curl -LO {url}")
with open(f,"r",encoding="utf-8") as r:
s=[t[8:].strip() for t in r if t.startswith("# text =")]
for mdl in models:
from transformers import pipeline
nlp=pipeline("universal-dependencies",mdl,trust_remote_code=True,
aggregation_strategy="simple",device=0)
with open("result.conllu","w",encoding="utf-8") as w:
for t in s:
w.write(nlp(t))
p=subprocess.run([sys.executable,c,"-v",f,"result.conllu"],
encoding="utf-8",stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
os.system(f"mkdir -p result/{mdl}")
with open(f"result/{mdl}/result.txt","w",encoding="utf-8") as w:
print(f"\n*** {mdl}",p.stdout,sep="\n",file=w)
!( cd result && cat `find {" ".join(models)} -name result.txt` )
私(安岡孝一)の手元では、以下の結果が出力された。
*** KoichiYasuoka/modernbert-small-japanese-aozora-ud-triangular
Metric | Precision | Recall | F1 Score | AligndAcc
-----------+-----------+-----------+-----------+-----------
Tokens | 96.60 | 96.55 | 96.58 |
Sentences | 100.00 | 100.00 | 100.00 |
Words | 96.60 | 96.55 | 96.58 |
UPOS | 92.40 | 92.35 | 92.37 | 95.65
XPOS | 0.00 | 0.00 | 0.00 | 0.00
UFeats | 96.56 | 96.51 | 96.54 | 99.96
AllTags | 0.00 | 0.00 | 0.00 | 0.00
Lemmas | 0.00 | 0.00 | 0.00 | 0.00
UAS | 85.74 | 85.69 | 85.72 | 88.76
LAS | 83.66 | 83.61 | 83.64 | 86.60
CLAS | 74.31 | 74.06 | 74.18 | 78.02
MLAS | 68.58 | 68.35 | 68.46 | 72.00
BLEX | 0.00 | 0.00 | 0.00 | 0.00
*** KoichiYasuoka/modernbert-base-japanese-aozora-ud-triangular
Metric | Precision | Recall | F1 Score | AligndAcc
-----------+-----------+-----------+-----------+-----------
Tokens | 97.11 | 97.28 | 97.19 |
Sentences | 100.00 | 100.00 | 100.00 |
Words | 97.11 | 97.28 | 97.19 |
UPOS | 94.46 | 94.62 | 94.54 | 97.27
XPOS | 0.00 | 0.00 | 0.00 | 0.00
UFeats | 97.09 | 97.26 | 97.17 | 99.98
AllTags | 0.00 | 0.00 | 0.00 | 0.00
Lemmas | 0.00 | 0.00 | 0.00 | 0.00
UAS | 87.56 | 87.71 | 87.63 | 90.16
LAS | 86.12 | 86.27 | 86.19 | 88.68
CLAS | 77.98 | 78.34 | 78.16 | 81.70
MLAS | 74.14 | 74.48 | 74.31 | 77.67
BLEX | 0.00 | 0.00 | 0.00 | 0.00
*** KoichiYasuoka/modernbert-large-japanese-aozora-ud-triangular
Metric | Precision | Recall | F1 Score | AligndAcc
-----------+-----------+-----------+-----------+-----------
Tokens | 96.89 | 97.15 | 97.02 |
Sentences | 100.00 | 100.00 | 100.00 |
Words | 96.89 | 97.15 | 97.02 |
UPOS | 94.48 | 94.74 | 94.61 | 97.51
XPOS | 0.00 | 0.00 | 0.00 | 0.00
UFeats | 96.88 | 97.14 | 97.01 | 99.99
AllTags | 0.00 | 0.00 | 0.00 | 0.00
Lemmas | 0.00 | 0.00 | 0.00 | 0.00
UAS | 87.34 | 87.57 | 87.45 | 90.14
LAS | 86.02 | 86.25 | 86.13 | 88.78
CLAS | 77.16 | 77.71 | 77.43 | 81.33
MLAS | 73.46 | 73.97 | 73.71 | 77.43
BLEX | 0.00 | 0.00 | 0.00 | 0.00
*** KoichiYasuoka/modernbert-small-japanese-wikipedia-ud-triangular
Metric | Precision | Recall | F1 Score | AligndAcc
-----------+-----------+-----------+-----------+-----------
Tokens | 97.55 | 97.71 | 97.63 |
Sentences | 100.00 | 100.00 | 100.00 |
Words | 97.55 | 97.71 | 97.63 |
UPOS | 95.16 | 95.31 | 95.23 | 97.55
XPOS | 0.00 | 0.00 | 0.00 | 0.00
UFeats | 97.53 | 97.69 | 97.61 | 99.98
AllTags | 0.00 | 0.00 | 0.00 | 0.00
Lemmas | 0.00 | 0.00 | 0.00 | 0.00
UAS | 88.76 | 88.90 | 88.83 | 90.99
LAS | 87.24 | 87.38 | 87.31 | 89.43
CLAS | 79.34 | 79.62 | 79.48 | 82.41
MLAS | 75.66 | 75.93 | 75.79 | 78.59
BLEX | 0.00 | 0.00 | 0.00 | 0.00
*** KoichiYasuoka/modernbert-base-japanese-wikipedia-ud-triangular
Metric | Precision | Recall | F1 Score | AligndAcc
-----------+-----------+-----------+-----------+-----------
Tokens | 97.67 | 97.88 | 97.78 |
Sentences | 100.00 | 100.00 | 100.00 |
Words | 97.67 | 97.88 | 97.78 |
UPOS | 96.00 | 96.20 | 96.10 | 98.29
XPOS | 0.00 | 0.00 | 0.00 | 0.00
UFeats | 97.67 | 97.88 | 97.78 | 100.00
AllTags | 0.00 | 0.00 | 0.00 | 0.00
Lemmas | 0.00 | 0.00 | 0.00 | 0.00
UAS | 89.93 | 90.12 | 90.03 | 92.07
LAS | 88.82 | 89.01 | 88.92 | 90.94
CLAS | 81.57 | 82.06 | 81.81 | 84.79
MLAS | 78.54 | 79.00 | 78.77 | 81.64
BLEX | 0.00 | 0.00 | 0.00 | 0.00
*** KoichiYasuoka/modernbert-large-japanese-wikipedia-ud-triangular
Metric | Precision | Recall | F1 Score | AligndAcc
-----------+-----------+-----------+-----------+-----------
Tokens | 98.22 | 98.27 | 98.25 |
Sentences | 100.00 | 100.00 | 100.00 |
Words | 98.22 | 98.27 | 98.25 |
UPOS | 96.92 | 96.98 | 96.95 | 98.68
XPOS | 0.00 | 0.00 | 0.00 | 0.00
UFeats | 98.21 | 98.26 | 98.24 | 99.99
AllTags | 0.00 | 0.00 | 0.00 | 0.00
Lemmas | 0.00 | 0.00 | 0.00 | 0.00
UAS | 91.53 | 91.58 | 91.55 | 93.19
LAS | 90.69 | 90.75 | 90.72 | 92.34
CLAS | 84.15 | 84.52 | 84.33 | 86.76
MLAS | 81.76 | 82.12 | 81.94 | 84.31
BLEX | 0.00 | 0.00 | 0.00 | 0.00
UPOS/LAS/MLASを表の形にしてみよう。
青空文庫モデル | +Wikipediaモデル | ||
---|---|---|---|
Ⓢ | 92.37/83.64/68.46 | 🅂 | 95.23/87.31/75.79 |
Ⓑ | 94.54/86.19/74.31 | 🄱 | 96.10/88.92/78.77 |
Ⓛ | 94.61/86.13/73.71 | 🄻 | 96.95/90.72/81.94 |
ちなみに、ja_gsdluw-ud-test.conlluでいちばん長い文は「一方、東海地方北陸地方以東の東日本は、比較的広い沖積平野に恵まれていた上に、太平洋側を中心に低開発状態の洪積台地や河岸段丘面の農地開発の余地が大きく、日本海側を中心に扇状地でも開発の余地が広く存在したため、江戸時代に至っても、急峻な山地の傾斜面を切り開いて棚田をつくるまでに至らなかったところが多く、棚田はあまりつくられないか、つくられた場合でも畔や土手は傾斜が緩やかな土盛りとなり、西日本とは対照的な棚田風景となった。」だが、goeswith
による単語組み上げだと126×126の上三角行列に乗りきらず、解析が崩壊してしまう。Google Colaboratoryで試してみよう。
!pip install transformers triton deplacy
from transformers import pipeline
nlp=pipeline("universal-dependencies","KoichiYasuoka/modernbert-large-japanese-wikipedia-ud-triangular",trust_remote_code=True)
doc=nlp("一方、東海地方北陸地方以東の東日本は、比較的広い沖積平野に恵まれていた上に、太平洋側を中心に低開発状態の洪積台地や河岸段丘面の農地開発の余地が大きく、日本海側を中心に扇状地でも開発の余地が広く存在したため、江戸時代に至っても、急峻な山地の傾斜面を切り開いて棚田をつくるまでに至らなかったところが多く、棚田はあまりつくられないか、つくられた場合でも畔や土手は傾斜が緩やかな土盛りとなり、西日本とは対照的な棚田風景となった。")
import deplacy
deplacy.serve(doc,port=None)
私の手元では、以下の結果が出力された。
# text = 一方、東海地方北陸地方以東の東日本は、比較的広い沖積平野に恵まれていた上に、太平洋側を中心に低開発状態の洪積台地や河岸段丘面の農地開発の余地が大きく、日本海側を中心に扇状地でも開発の余地が広く存在したため、江戸時代に至っても、急峻な山地の傾斜面を切り開いて棚田をつくるまでに至らなかったところが多く、棚田はあまりつくられないか、つくられた場合でも畔や土手は傾斜が緩やかな土盛りとなり、西日本とは対照的な棚田風景となった。
1 一 _ CCONJ _ _ 28 cc _ SpaceAfter=No
2 方 _ X _ _ 1 goeswith _ SpaceAfter=No
3 、 _ PUNCT _ _ 1 punct _ SpaceAfter=No
4 東海 _ NOUN _ _ 14 nmod _ SpaceAfter=No
5 地 _ X _ _ 4 goeswith _ SpaceAfter=No
6 方 _ X _ _ 4 goeswith _ SpaceAfter=No
7 北 _ X _ _ 4 goeswith _ SpaceAfter=No
8 陸 _ X _ _ 4 goeswith _ SpaceAfter=No
9 地 _ X _ _ 4 goeswith _ SpaceAfter=No
10 方 _ SYM _ _ 4 compound _ SpaceAfter=No
11 以 _ NOUN _ _ 91 obl _ SpaceAfter=No
12 東 _ X _ _ 11 goeswith _ SpaceAfter=No
13 の _ ADP _ _ 7 case _ SpaceAfter=No
14 東 _ PROPN _ _ 28 nsubj _ SpaceAfter=No
15 日本 _ X _ _ 14 goeswith _ SpaceAfter=No
16 は _ ADP _ _ 14 case _ SpaceAfter=No
17 、 _ PUNCT _ _ 14 punct _ SpaceAfter=No
18 比 _ ADV _ _ 21 advmod _ SpaceAfter=No
19 較 _ X _ _ 18 goeswith _ SpaceAfter=No
20 的 _ X _ _ 18 goeswith _ SpaceAfter=No
21 広 _ ADJ _ _ 23 acl _ SpaceAfter=No
22 い _ X _ _ 21 goeswith _ SpaceAfter=No
23 沖 _ NOUN _ _ 28 obl _ SpaceAfter=No
24 積 _ X _ _ 23 goeswith _ SpaceAfter=No
25 平 _ X _ _ 23 goeswith _ SpaceAfter=No
26 野 _ X _ _ 23 goeswith _ SpaceAfter=No
27 に _ ADP _ _ 23 case _ SpaceAfter=No
28 恵まれ _ VERB _ _ 67 advcl _ SpaceAfter=No
29 て _ AUX _ _ 28 aux _ SpaceAfter=No
30 い _ X _ _ 29 goeswith _ SpaceAfter=No
31 た _ AUX _ _ 28 aux _ SpaceAfter=No
32 上 _ SCONJ _ _ 28 mark _ SpaceAfter=No
33 に _ X _ _ 32 goeswith _ SpaceAfter=No
34 、 _ PUNCT _ _ 28 punct _ SpaceAfter=No
35 太 _ NOUN _ _ 40 obj _ SpaceAfter=No
36 平 _ X _ _ 35 goeswith _ SpaceAfter=No
37 洋 _ X _ _ 35 goeswith _ SpaceAfter=No
38 側 _ X _ _ 35 goeswith _ SpaceAfter=No
39 を _ ADP _ _ 35 case _ SpaceAfter=No
40 中 _ NOUN _ _ 67 obl _ SpaceAfter=No
41 心 _ X _ _ 40 goeswith _ SpaceAfter=No
42 に _ ADP _ _ 40 case _ SpaceAfter=No
43 低 _ NOUN _ _ 49 nmod _ SpaceAfter=No
44 開 _ X _ _ 43 goeswith _ SpaceAfter=No
45 発 _ X _ _ 43 goeswith _ SpaceAfter=No
46 状 _ X _ _ 43 goeswith _ SpaceAfter=No
47 態 _ X _ _ 43 goeswith _ SpaceAfter=No
48 の _ ADP _ _ 43 case _ SpaceAfter=No
49 洪 _ NOUN _ _ 54 nmod _ SpaceAfter=No
50 積 _ X _ _ 49 goeswith _ SpaceAfter=No
51 台 _ X _ _ 49 goeswith _ SpaceAfter=No
52 地 _ X _ _ 49 goeswith _ SpaceAfter=No
53 や _ ADP _ _ 49 case _ SpaceAfter=No
54 河岸 _ NOUN _ _ 59 nmod _ SpaceAfter=No
55 段 _ X _ _ 54 goeswith _ SpaceAfter=No
56 丘 _ X _ _ 54 goeswith _ SpaceAfter=No
57 面 _ X _ _ 54 goeswith _ SpaceAfter=No
58 の _ ADP _ _ 54 case _ SpaceAfter=No
59 農 _ NOUN _ _ 64 nmod _ SpaceAfter=No
60 地 _ X _ _ 59 goeswith _ SpaceAfter=No
61 開 _ X _ _ 59 goeswith _ SpaceAfter=No
62 発 _ X _ _ 59 goeswith _ SpaceAfter=No
63 の _ ADP _ _ 59 case _ SpaceAfter=No
64 余 _ NOUN _ _ 67 nsubj _ SpaceAfter=No
65 地 _ X _ _ 64 goeswith _ SpaceAfter=No
66 が _ ADP _ _ 64 case _ SpaceAfter=No
67 大 _ ADJ _ _ 91 advcl _ SpaceAfter=No
68 き _ X _ _ 67 goeswith _ SpaceAfter=No
69 く _ X _ _ 67 goeswith _ SpaceAfter=No
70 、 _ PUNCT _ _ 67 punct _ SpaceAfter=No
71 日本 _ NOUN _ _ 75 obj _ SpaceAfter=No
72 海 _ X _ _ 71 goeswith _ SpaceAfter=No
73 側 _ X _ _ 71 goeswith _ SpaceAfter=No
74 を _ ADP _ _ 71 case _ SpaceAfter=No
75 中 _ NOUN _ _ 91 obl _ SpaceAfter=No
76 心 _ X _ _ 75 goeswith _ SpaceAfter=No
77 に _ ADP _ _ 75 case _ SpaceAfter=No
78 扇 _ NOUN _ _ 91 obl _ SpaceAfter=No
79 状 _ X _ _ 78 goeswith _ SpaceAfter=No
80 地 _ X _ _ 78 goeswith _ SpaceAfter=No
81 で _ ADP _ _ 78 case _ SpaceAfter=No
82 も _ ADP _ _ 78 case _ SpaceAfter=No
83 開 _ NOUN _ _ 86 nmod _ SpaceAfter=No
84 発 _ X _ _ 83 goeswith _ SpaceAfter=No
85 の _ ADP _ _ 83 case _ SpaceAfter=No
86 余 _ NOUN _ _ 91 nsubj _ SpaceAfter=No
87 地 _ X _ _ 86 goeswith _ SpaceAfter=No
88 が _ ADP _ _ 86 case _ SpaceAfter=No
89 広 _ ADJ _ _ 91 advcl _ SpaceAfter=No
90 く _ X _ _ 89 goeswith _ SpaceAfter=No
91 存 _ VERB _ _ 95 acl _ SpaceAfter=No
92 在 _ X _ _ 91 goeswith _ SpaceAfter=No
93 し _ X _ _ 91 goeswith _ SpaceAfter=No
94 た _ AUX _ _ 91 aux _ SpaceAfter=No
95 ため _ NOUN _ _ 115 obl _ SpaceAfter=No
96 、 _ PUNCT _ _ 95 punct _ SpaceAfter=No
97 江戸 _ NOUN _ _ 101 obl _ SpaceAfter=No
98 時 _ X _ _ 97 goeswith _ SpaceAfter=No
99 代 _ X _ _ 97 goeswith _ SpaceAfter=No
100 に _ ADP _ _ 97 case _ SpaceAfter=No
101 至っ _ VERB _ _ 125 advcl _ SpaceAfter=No
102 て _ SCONJ _ _ 101 mark _ SpaceAfter=No
103 も _ ADP _ _ 101 case _ SpaceAfter=No
104 、 _ PUNCT _ _ 101 punct _ SpaceAfter=No
105 急 _ ADJ _ _ 108 acl _ SpaceAfter=No
106 峻 _ X _ _ 105 goeswith _ SpaceAfter=No
107 な _ AUX _ _ 105 aux _ SpaceAfter=No
108 山 _ NOUN _ _ 111 nmod _ SpaceAfter=No
109 地 _ X _ _ 108 goeswith _ SpaceAfter=No
110 の _ ADP _ _ 108 case _ SpaceAfter=No
111 傾 _ NOUN _ _ 115 obj _ SpaceAfter=No
112 斜 _ X _ _ 111 goeswith _ SpaceAfter=No
113 面 _ X _ _ 111 goeswith _ SpaceAfter=No
114 を _ ADP _ _ 111 case _ SpaceAfter=No
115 切り開 _ VERB _ _ 125 advcl _ SpaceAfter=No
116 い _ X _ _ 115 goeswith _ SpaceAfter=No
117 て _ SCONJ _ _ 115 mark _ SpaceAfter=No
118 棚 _ NOUN _ _ 121 obj _ SpaceAfter=No
119 田 _ X _ _ 118 goeswith _ SpaceAfter=No
120 を _ ADP _ _ 118 case _ SpaceAfter=No
121 つくる _ VERB _ _ 125 advcl _ SpaceAfter=No
122 ま _ PART _ _ 121 mark _ SpaceAfter=No
123 で _ X _ _ 122 goeswith _ SpaceAfter=No
124 に _ ADP _ _ 121 case _ SpaceAfter=No
125 至ら _ VERB _ _ 128 acl _ SpaceAfter=No
126 なかっ _ AUX _ Polarity=Neg 125 aux _ SpaceAfter=No
127 た _ AUX _ _ 125 aux _ SpaceAfter=No
128 ところ _ NOUN _ _ 130 nsubj _ SpaceAfter=No
129 が _ ADP _ _ 128 case _ SpaceAfter=No
130 多 _ ADJ _ _ 139 advcl _ SpaceAfter=No
131 く _ X _ _ 130 goeswith _ SpaceAfter=No
132 、 _ PUNCT _ _ 130 punct _ SpaceAfter=No
133 棚 _ NOUN _ _ 139 nsubj _ SpaceAfter=No
134 田 _ X _ _ 133 goeswith _ SpaceAfter=No
135 は _ ADP _ _ 133 case _ SpaceAfter=No
136 あ _ ADV _ _ 139 advmod _ SpaceAfter=No
137 ま _ X _ _ 136 goeswith _ SpaceAfter=No
138 り _ X _ _ 136 goeswith _ SpaceAfter=No
139 つくら _ VERB _ _ 148 acl _ SpaceAfter=No
140 れ _ AUX _ _ 139 aux _ SpaceAfter=No
141 な _ AUX _ Polarity=Neg 139 aux _ SpaceAfter=No
142 い _ X _ _ 141 goeswith _ SpaceAfter=No
143 か _ PART _ _ 139 mark _ SpaceAfter=No
144 、 _ PUNCT _ _ 139 punct _ SpaceAfter=No
145 つくら _ VERB _ _ 148 acl _ SpaceAfter=No
146 れ _ AUX _ _ 145 aux _ SpaceAfter=No
147 た _ AUX _ _ 145 aux _ SpaceAfter=No
148 場 _ NOUN _ _ 167 obl _ SpaceAfter=No
149 合 _ X _ _ 148 goeswith _ SpaceAfter=No
150 で _ ADP _ _ 148 case _ SpaceAfter=No
151 も _ ADP _ _ 148 case _ SpaceAfter=No
152 畔 _ NOUN _ _ 154 nmod _ SpaceAfter=No
153 や _ ADP _ _ 152 case _ SpaceAfter=No
154 土 _ NOUN _ _ 167 nsubj:outer _ SpaceAfter=No
155 手 _ X _ _ 154 goeswith _ SpaceAfter=No
156 は _ ADP _ _ 154 case _ SpaceAfter=No
157 傾 _ NOUN _ _ 167 nsubj _ SpaceAfter=No
158 斜 _ X _ _ 157 goeswith _ SpaceAfter=No
159 が _ ADP _ _ 157 case _ SpaceAfter=No
160 緩 _ ADJ _ _ 164 acl _ SpaceAfter=No
161 や _ X _ _ 160 goeswith _ SpaceAfter=No
162 か _ X _ _ 160 goeswith _ SpaceAfter=No
163 な _ AUX _ _ 160 aux _ SpaceAfter=No
164 土 _ NOUN _ _ 167 obl _ SpaceAfter=No
165 盛り _ X _ _ 164 goeswith _ SpaceAfter=No
166 と _ ADP _ _ 164 case _ SpaceAfter=No
167 な _ VERB _ _ 183 advcl _ SpaceAfter=No
168 り _ X _ _ 167 goeswith _ SpaceAfter=No
169 、 _ PUNCT _ _ 167 punct _ SpaceAfter=No
170 西 _ PROPN _ _ 183 obl _ SpaceAfter=No
171 日本 _ X _ _ 170 goeswith _ SpaceAfter=No
172 と _ ADP _ _ 170 case _ SpaceAfter=No
173 は _ ADP _ _ 170 case _ SpaceAfter=No
174 対 _ ADJ _ _ 178 acl _ SpaceAfter=No
175 照 _ X _ _ 174 goeswith _ SpaceAfter=No
176 的 _ X _ _ 174 goeswith _ SpaceAfter=No
177 な _ AUX _ _ 174 aux _ SpaceAfter=No
178 棚 _ NOUN _ _ 183 obl _ SpaceAfter=No
179 田 _ X _ _ 178 goeswith _ SpaceAfter=No
180 風 _ X _ _ 178 goeswith _ SpaceAfter=No
181 景 _ X _ _ 178 goeswith _ SpaceAfter=No
182 と _ ADP _ _ 178 case _ SpaceAfter=No
183 な _ VERB _ _ 0 root _ SpaceAfter=No
184 っ _ X _ _ 183 goeswith _ SpaceAfter=No
185 た _ AUX _ _ 183 aux _ SpaceAfter=No
186 。 _ PUNCT _ _ 183 punct _ SpaceAfter=No
「東海地方北陸地方以東の東日本は」のあたりが完全に崩壊してしまっていて、痛々しい。まだまだアルゴリズムを工夫する必要があるのだけど、さて、どうしたらいいかな。