昨日の記事で検討した宮古諸語の簡易音素表記をもとに『南琉球宮古方言調査報告書』(国立国語研究所, 2012年8月)の基礎語彙aデータを単語ベクトル化し、各郵便番号「方言」単語ベクトルのハミング距離をnetworkxのspectral_layoutで3D可視化してみた。Google Colaboratoryだと、こんな感じ。
!pip install networkx plotly
import os,glob,numpy,networkx
from plotly.express import scatter_3d
url="https://github.com/KoichiYasuoka/UD-Miyakoan"
m=os.path.basename(url)
!test -d {m} || git clone --depth=1 {url}
d={}
for f in glob.glob(m+"/LEMMA/*.txt"):
with open(f,"r",encoding="utf-8") as r:
b=os.path.splitext(os.path.basename(f))[0]
for s in r:
t=s.strip().split()
if t[4].startswith("南琉球宮古方言調査報告書(2012)基礎語彙a") and t[1].find("+")<0:
if t[0] in d:
d[t[0]].append(b)
else:
d[t[0]]=[b]
d={k:v for k,v in d.items() if len(v)>100}
w={j:i for i,j in enumerate(set(sum([v for k,v in d.items()],[])))}
m=numpy.zeros((len(d),len(w)))
for i,k in enumerate(sorted(d)):
for j in d[k]:
m[i,w[j]]=1.0
e=numpy.array([numpy.sum(numpy.abs(m-m[i]),axis=1) for i in range(len(d))])
g=networkx.Graph()
for i in range(len(d)):
g.add_node(i)
for j in range(i):
g.add_edge(i,j,weight=1/max(e[i,j],0.5))
c=networkx.spectral_layout(g,dim=3)
p=numpy.array([c[i] for i in range(len(d))])
f=scatter_3d(x=p[:,0],y=p[:,1],z=p[:,2],text=[k[4:] for k in sorted(d)],opacity=0.5,labels={"x":"","y":"","z":""},width=1600,height=1600)
q={"tickfont":{"color":"white"}}
f.update_scenes(xaxis=q,yaxis=q,zaxis=q)
f.show()
郵便番号の下4桁とともに、私(安岡孝一)の手元では、以下の3D図が出力された。
この12ヶ所では、イキマ語〔906-0421池間〕が、ダントツで離れているのがわかる。イラヴ語は、906-0503伊良部が3D図奥にあって多少は離れているものの、906-0505国仲ほど遠いわけではない。北ミャーク語は、906-0002狩俣と906-0003島尻が、906-0004大浦を含めたグループを構成している、と見て大丈夫そうだ。西ミャーク語は、906-0306来間と906-0304上地がそれぞれに離れているものの、906-0305与那覇が東ミャーク語〔906-0101保良・906-0108砂川〕に紛れ込んでいる。中ミャーク語〔906-0015久貝〕は、これらと少し距離をおいているようだ。
こういう形で単語ベクトルのハミング距離を可視化する限りにおいては、宮古諸語の各「方言」は樹形図や等語線で描き切れるようなものではなく、いわゆる「分岐」と「交雑」を繰り返してきたのだろうと思われる。うーん、ウカㇺ語・南ミャーク語・タラマ語も、3D図に何とか入れておきたいのだけど、さて、どうすればいいかな。