パスワードを忘れた? アカウント作成

yasuokaさんのトモダチの日記みんなの日記も見てね。 最新から新しい日記やタレこみを確認できますよ。

14970299 journal
Google

yasuokaの日記: AllenNLPの係り受け解析モデルをdeplacyに繫ぐには

日記 by yasuoka

AllenNLPの係り受け解析モデルを、Google Colaboratoryで動かしてみた。

!pip install -U allennlp allennlp-models urllib3
from allennlp.predictors.predictor import Predictor
predictor=Predictor.from_path("https://storage.googleapis.com/allennlp-public-models/biaffine-dependency-parser-ptb-2020.04.06.tar.gz")
doc=predictor.predict("I saw a horse yesterday which had no name.")
print(doc)

「I saw a horse yesterday which had no name.」を係り受け解析してみたところ、私(安岡孝一)の手元では以下の結果が得られた。

{'arc_loss': 0.47957390546798706, 'tag_loss': 0.23244254291057587, 'loss': 0.7120164632797241, 'words': ['I', 'saw', 'a', 'horse', 'yesterday', 'which', 'had', 'no', 'name', '.'], 'pos': ['PRON', 'VERB', 'DET', 'NOUN', 'NOUN', 'DET', 'AUX', 'DET', 'NOUN', 'PUNCT'], 'predicted_dependencies': ['root', 'dep', 'dep', 'dep', 'dep', 'nsubj', 'dep', 'dep', 'dobj', 'punct'], 'predicted_heads': [0, 1, 4, 2, 2, 7, 2, 9, 7, 2], 'hierplane_tree': {'text': 'I saw a horse yesterday which had no name .', 'root': {'word': 'I', 'nodeType': 'root', 'attributes': ['PRON'], 'link': 'root', 'spans': [{'start': 0, 'end': 2}], 'children': [{'word': 'saw', 'nodeType': 'dep', 'attributes': ['VERB'], 'link': 'dep', 'spans': [{'start': 2, 'end': 6}], 'children': [{'word': 'horse', 'nodeType': 'dep', 'attributes': ['NOUN'], 'link': 'dep', 'spans': [{'start': 8, 'end': 14}], 'children': [{'word': 'a', 'nodeType': 'dep', 'attributes': ['DET'], 'link': 'dep', 'spans': [{'start': 6, 'end': 8}]}]}, {'word': 'yesterday', 'nodeType': 'dep', 'attributes': ['NOUN'], 'link': 'dep', 'spans': [{'start': 14, 'end': 24}]}, {'word': 'had', 'nodeType': 'dep', 'attributes': ['AUX'], 'link': 'dep', 'spans': [{'start': 30, 'end': 34}], 'children': [{'word': 'which', 'nodeType': 'nsubj', 'attributes': ['DET'], 'link': 'nsubj', 'spans': [{'start': 24, 'end': 30}]}, {'word': 'name', 'nodeType': 'dobj', 'attributes': ['NOUN'], 'link': 'dobj', 'spans': [{'start': 37, 'end': 42}], 'children': [{'word': 'no', 'nodeType': 'dep', 'attributes': ['DET'], 'link': 'dep', 'spans': [{'start': 34, 'end': 37}]}]}]}, {'word': '.', 'nodeType': 'punct', 'attributes': ['PUNCT'], 'link': 'punct', 'spans': [{'start': 42, 'end': 44}]}]}]}, 'nodeTypeToStyle': {'root': ['color5', 'strong'], 'dep': ['color5', 'strong'], 'nsubj': ['color1'], 'nsubjpass': ['color1'], 'csubj': ['color1'], 'csubjpass': ['color1'], 'pobj': ['color2'], 'dobj': ['color2'], 'iobj': ['color2'], 'mark': ['color2'], 'pcomp': ['color2'], 'xcomp': ['color2'], 'ccomp': ['color2'], 'acomp': ['color2'], 'aux': ['color3'], 'cop': ['color3'], 'det': ['color3'], 'conj': ['color3'], 'cc': ['color3'], 'prep': ['color3'], 'number': ['color3'], 'possesive': ['color3'], 'poss': ['color3'], 'discourse': ['color3'], 'expletive': ['color3'], 'prt': ['color3'], 'advcl': ['color3'], 'mod': ['color4'], 'amod': ['color4'], 'tmod': ['color4'], 'quantmod': ['color4'], 'npadvmod': ['color4'], 'infmod': ['color4'], 'advmod': ['color4'], 'appos': ['color4'], 'nn': ['color4'], 'neg': ['color0'], 'punct': ['color0']}, 'linkToPosition': {'nsubj': 'left', 'nsubjpass': 'left', 'csubj': 'left', 'csubjpass': 'left', 'pobj': 'right', 'dobj': 'right', 'iobj': 'right', 'pcomp': 'right', 'xcomp': 'right', 'ccomp': 'right', 'acomp': 'right'}}}

何となく結果が変だ。とりあえず、deplacyに繫いでみよう。

!pip install -U deplacy allennlp allennlp-models urllib3
from allennlp.predictors.predictor import Predictor
predictor=Predictor.from_path("https://storage.googleapis.com/allennlp-public-models/biaffine-dependency-parser-ptb-2020.04.06.tar.gz")
def nlp(t):
  s=predictor.predict(t)
  return "\n".join(["\t".join([str(i+1),w,"_",p,p,"_",str(h),d,"_","_"]) for i,(w,p,h,d) in enumerate(zip(s["words"],s["pos"],s["predicted_heads"],s["predicted_dependencies"]))])+"\n\n"
doc=nlp("I saw a horse yesterday which had no name.")
import deplacy
deplacy.render(doc)

私の手元では、以下の結果が得られた。

I         PRON  ═══════════╗ root
saw       VERB  ═══╗═╗═╗═╗<╝ dep
a         DET   <╗ ║ ║ ║ ║   dep
horse     NOUN  ═╝<╝ ║ ║ ║   dep
yesterday NOUN  <════╝ ║ ║   dep
which     DET   <════╗ ║ ║   nsubj
had       AUX   ═══╗═╝<╝ ║   dep
no        DET   <╗ ║     ║   dep
name      NOUN  ═╝<╝     ║   dobj
.         PUNCT <════════╝   punct

解析結果を見る限り、係り受けタグがdepばかりで、正直なところ使い物にならない。うーん、どこかインストール方法か、あるいは使用法をミスってるのかしら?

14967555 journal
人工知能

yasuokaの日記: Turku-neural-parser-pipelineのフェロー語係り受け解析をGoogle Colaboratoryで動かす

日記 by yasuoka

Turku-neural-parser-pipeline言語モデルを眺めていたところ、フェロー語の言語モデルが含まれているのに気づいた。とりあえず、Google Colaboratory上でdeplacyに繋いでみよう。

!pip install deplacy ufal.udpipe configargparse tensorflow==1.12.2 torch==0.4.1 torchtext==0.3.1 torchvision==0.2.1
!test -d Turku-neural-parser-pipeline || git clone --depth=1 https://github.com/TurkuNLP/Turku-neural-parser-pipeline
!cd Turku-neural-parser-pipeline && git submodule update --init --recursive && test -d models_fo_oft || python fetch_models.py fo_oft
!cd Turku-neural-parser-pipeline/models_fo_oft/Data && test -f wiki.filtered.fo.vec || ln -s wiki.fo.vec wiki.filtered.fo.vec
import sys,subprocess
nlp=lambda t:subprocess.run([sys.executable,"full_pipeline_stream.py","--gpu","-1","--conf","models_fo_oft/pipelines.yaml"],cwd="Turku-neural-parser-pipeline",input=t,encoding="utf-8",stdout=subprocess.PIPE).stdout
doc=nlp("Ofta taka trøll góða manna børn.")
import deplacy
deplacy.render(doc)
deplacy.serve(doc,port=None)

tensorflowを1.12.2にバージョンダウンしないと動かないあたり、かなり昔のソフトウェアを思わせる。「Ofta taka trøll góða manna børn.」を係り受け解析してみたところ、私(安岡孝一)の手元では、以下の結果が得られた。

Ofta  ADV   <══════╗   advmod
taka  VERB  ═╗═══╗═╝═╗ root
trøll NOUN  <╝   ║   ║ obj
góða  ADV   <══╗ ║   ║ case
manna ADJ   <╗ ║ ║   ║ amod
børn  NOUN  ═╝═╝<╝   ║ obj
.     PUNCT <════════╝ punct

# newdoc
# newpar
# sent_id = 1
# text = Ofta taka trøll góða manna børn.
1    Ofta    rót    ADV    _    Degree=Pos    2    advmod    _    _
2    taka    taka    VERB    _    VerbForm=Inf|Voice=Act    0    root    _    _
3    trøll    trøll    NOUN    _    Case=Nom|Definite=Ind|Gender=Com|Number=Sing    2    obj    _    _
4    góða    góður    ADV    _    _    6    case    _    _
5    manna    maður    ADJ    _    Case=Nom|Degree=Pos|Number=Plur    6    amod    _    _
6    børn    barn    NOUN    _    Case=Nom|Definite=Ind|Gender=Neut|Number=Plur    2    obj    _    SpaceAfter=No
7    .    .    PUNCT    _    _    2    punct    _    SpacesAfter=\n

SVGで可視化すると、こんな感じ。残念ながら「taka」=obj⇒「trøll」が解析ミスで、ここはobj(目的語)ではなくnsubj(主語)とすべきだろう。ただ、他の係り受け解析ツールは、どれもフェロー語はサポートしてないようなので、とりあえずはTurku-neural-parser-pipelineを使うしかないかな。

14967191 journal
アメリカ合衆国

yasuokaの日記: O. Henry『Springtime à la Carte』のタイプライターのモデルは何なのか

日記 by yasuoka

O. Henryの『Springtime à la Carte』(1906年)を読んでいて、このタイプライターのモデルとなったのは何だろう、という疑問が頭をよぎった。

"I'd know that cranky capital W 'way above the line that your typewriter makes anywhere in the world," said Franklin.
"Why, there's no W in dandelions," said Sarah, in surprise.

のくだりからすると、このタイプライターは大文字の「W」のアラインメントが狂っていて、行の上に飛び出るクセがあるようだ。一方、小文字の「w」については言及がないので、「W」と「w」が別の活字棒に乗っている可能性が高い。また、Sarahが打ち間違いに気づいていなかったことからすると、私(安岡孝一)個人としては、アップストライク式タイプライターが思い当たる。場所はニューヨークなので、「New Century Caligraph」か「Smith Premier No.2」あたりが、舞台および時期的にはイイセンだと思う。さらに、

Sarah sat down to her typewriter and slipped a card between the rollers.

という記述からすると、ダブル・ローラーらしいので「Smith Premier」系列ではなさそうだ。うーん、すると「New Century Caligraph」かなぁ。1918年に『Springtime à la Carte』は映画化された(らしい)ので、それも見てみたいなぁ。

14956436 journal
人工知能

yasuokaの日記: GLA (Gaelic Linguistic Analyser)でスコットランド・ゲール語の係り受け解析

日記 by yasuoka

ネットサーフィンしていたところ、GLA (Gaelic Linguistic Analyser)というツールを見つけた。ざっと読んでみたところ、curl一発でスコットランド・ゲール語の品詞付与や係り受け解析がおこなえるらしい。とりあえず、「Innsidh na geòidh as t-fhoghar e.」という文を、係り受け解析してみよう。

$ curl https://klc.vdu.lt/sgtoolkit/parser -d 'Innsidh na geòidh as t-fhoghar e.'
# newpar id = 1
# sent_id = 1
# text = Innsidh na geòidh as t- fhoghar e .
1    Innsidh    innis    VERB    V-f    Tense=Fut|VerbForm=Fin    0    root    _    _
2    na    na    DET    Tdpm    Definite=Def|PronType=Art    3    det    _    _
3    geòidh    gèadh    NOUN    Ncpmn    Case=Nom|Gender=Masc|Number=Plur    1    nsubj    _    _
4    as    as    ADP    Spa-s    _    6    case    _    _
5    t-    t-    PART    Uo    _    6    case    _    _
6    fhoghar    fhoghar    NOUN    Ncsmd    Case=Dat|Gender=Masc|Number=Sing    3    obl    _    _
7    e    e    PRON    Pp3sm    Gender=Masc|Number=Sing|Person=3|PronType=Prs    1    obj    _    _
8    .    .    PUNCT    Fe    _    1    punct    _    _

SVGで可視化すると、こんな感じ。「geòidh」=obl⇒「fhoghar」については、私(安岡孝一)自身は納得がいかない(「Innsidh」=obl⇒「fhoghar」にすべきだと思う)が、それを除けば非常に良い。スコットランド・ゲール語の解析は、StanzaUDPipeもイマイチ精度が上がらないので、GLAを使っていくべきかな。

14951606 journal
Google

yasuokaの日記: LINGUAKITのガリシア=ポルトガル語係り受け解析をGoogle Colaboratoryで動かす

日記 by yasuoka

ネットサーフィンしていたところ、サンティアゴ・デ・コンポステーラ大学のGrupo de Gramática do Españolが製作したLINGUAKITという文法解析ツールを見つけた。ガリシア語・ポルトガル語・スペイン語・英語に加え、ガリシア=ポルトガル語(ガリシア語とポルトガル語の共通祖語)まで解析できるらしい。とりあえず、Google Colaboratory上で、LINGUAKITのガリシア=ポルトガル語係り受け解析を試してみよう。

!test -d Linguakit || git clone --depth=1 https://github.com/citiususc/Linguakit
!test -x /usr/local/bin/linguakit || ( cd Linguakit && echo yes | make deps && make install )
!echo Rogo vos eu que nunca lhi faledes sen mi, ai filha fremosa. | linguakit dep histgz -conll

「Rogo vos eu que nunca lhi faledes sen mi, ai filha fremosa.」を係り受け解析してみたところ、私(安岡孝一)の手元では、以下の結果が得られた。

1    Rogo    rogar    VERB    0    <gender:0|lemma:rogar|mode:I|nomin:no|number:S|person:1|pos:0|tense:P|token:Rogo|type:M|>    ROOT    ROOT:0
2    vos    vos    PRO    1    <case:D|gender:C|lemma:vos|number:P|person:2|politeness:0|pos:1|possessor:0|token:vos|type:P|>    DobjR    DobjR:1
3    eu    eu    PRO    1    <case:N|gender:C|lemma:eu|number:S|person:1|politeness:0|pos:2|possessor:0|token:eu|type:P|>    DobjR    DobjR:1
4    que    que    CONJ    7    <lemma:que|pos:3|token:que|type:S|>    SpecL    SpecL:7
5    nunca    nunca    ADV    7    <lemma:nunca|pos:4|token:nunca|type:G|>    AdjnL    AdjnL:7
6    lhi    lhi    NOUN    7    <gender:0|lemma:lhi|number:0|person:3|pos:5|token:lhi|type:C|>    SubjL    SubjL:7
7    faledes    falar    VERB    1    <adsubj:yes|gender:0|lemma:falar|mode:S|nomin:no|number:P|person:2|pos:6|tense:P|token:faledes|type:M|>    DobjR    DobjR:1
8    sen    sen    PRP    7    <lemma:sen|pos:7|token:sen|type:P|>    CircR    CircR:7
9    mi    mi    NOUN    8    <gender:M|lemma:mi|number:S|person:3|pos:8|token:mi|type:C|>    Term    Term:8
10    ,    ,    Fc    _    <lemma:,|pos:9|token:,|>    _    _
11    ai    ai    NOUN    0    <gender:M|lemma:ai|number:S|person:3|pos:10|token:ai|type:C|>    ROOT    ROOT:0
12    filha    filho    ADJ    13    <degree:0|function:0|gender:F|lemma:filho|number:S|pos:11|token:filha|type:Q|>    AdjnL    AdjnL:13
13    fremosa    fremosa    NOUN    11    <gender:0|lemma:fremosa|number:0|person:3|pos:12|token:fremosa|type:C|>    AdjnR    AdjnR:11
14    .    .    SENT    _    <lemma:.|pos:13|token:.|>    _

deplacy風に表示すると、以下のような感じ。

Rogo    VERB ═╗═╗═══════╗ ROOT
vos     PRO  <╝ ║       ║ DobjR
eu      PRO  <══╝       ║ DobjR
que     CONJ <════════╗ ║ SpecL
nunca   ADV  <══════╗ ║ ║ AdjnL
lhi     NOUN <════╗ ║ ║ ║ SubjL
faledes VERB ═══╗═╝═╝═╝<╝ DobjR
sen     PRP  ═╗<╝         CircR
mi      NOUN <╝           Term
,       Fc
ai      NOUN ═══╗         ROOT
filha   ADJ  <╗ ║         AdjnL
fremosa NOUN ═╝<╝         AdjnR
.       SENT

タグが独特で、かなり読みにくい。ただ、「eu」はどう考えても「rogo」(rogarの一人称単数直接法現在)の主語なので、「Rogo」=DobjR⇒「eu」ではなく、「Rogo」=SubjR⇒「eu」となるべきだ。一方、「lhi」は「faledes」の目的語(あるいは間接目的語)なので、「lhi」⇐DobjL=「faledes」となるべきだと思う。まあ、まだ「プロトタイプ」らしいので、ガリシア=ポルトガル語の係り受け解析に関しては、精度が十分じゃないのかな。

14947373 journal
人工知能

yasuokaの日記: 古典中国語(漢文)係り受け解析エンジンとしてのUDPipe 2

日記 by yasuoka

UDPipe 2がやっとリリース(仮)された、との連絡をいただいた。ただし、現時点でのリリースはLINDATのREST APIだけで、UDPipe 2のプログラム本体や各言語モデルは、まだ公開されていない。それでも、とりあえず「不入虎穴不得虎子」を係り受け解析してみよう。

$ python3
>>> def nlp(t):
...   import urllib.request,urllib.parse,json
...   with urllib.request.urlopen("https://lindat.mff.cuni.cz/services/udpipe/api/process?model=lzh&tokenizer&tagger&parser&data="+urllib.parse.quote(t)) as r:
...     return json.loads(r.read())["result"]
...
>>> doc=nlp("不入虎穴不得虎子")
>>> print(doc)
# generator = UDPipe 2, https://lindat.mff.cuni.cz/services/udpipe
# udpipe_model = classical_chinese-kyoto-ud-2.6-200830
# udpipe_model_licence = CC BY-NC-SA
# newdoc
# newpar
# sent_id = 1
# text = 不入
1    不    不    ADV    v,副詞,否定,無界    Polarity=Neg    2    advmod    _    SpaceAfter=No
2    入    入    VERB    v,動詞,行為,移動    _    0    root    _    SpaceAfter=No

# sent_id = 2
# text = 虎穴
1    虎    虎    NOUN    n,名詞,主体,動物    _    0    root    _    SpaceAfter=No
2    穴    穴    NOUN    n,名詞,固定物,地形    Case=Loc    1    flat    _    SpaceAfter=No

# sent_id = 3
# text = 不得虎子
1    不    不    ADV    v,副詞,否定,無界    Polarity=Neg    2    advmod    _    SpaceAfter=No
2    得    得    VERB    v,動詞,行為,得失    _    0    root    _    SpaceAfter=No
3    虎    虎    NOUN    n,名詞,主体,動物    _    4    nmod    _    SpaceAfter=No
4    子    子    NOUN    n,名詞,人,関係    _    2    obj    _    SpaceAfter=No

うーん、「不入」と「虎穴」を別の文だと判定してしまっていて、少し残念だ。文切り機能をOFFにしてみよう。

>>> def nlp(t):
...   import urllib.request,urllib.parse,json
...   with urllib.request.urlopen("https://lindat.mff.cuni.cz/services/udpipe/api/process?model=lzh&tokenizer=presegmented&tagger&parser&data="+urllib.parse.quote(t)) as r:
...     return json.loads(r.read())["result"]
...
>>> doc=nlp("不入虎穴不得虎子")
>>> print(doc)
# generator = UDPipe 2, https://lindat.mff.cuni.cz/services/udpipe
# udpipe_model = classical_chinese-kyoto-ud-2.6-200830
# udpipe_model_licence = CC BY-NC-SA
# newdoc
# newpar
# sent_id = 1
# text = 不入虎穴不得虎子
1    不    不    ADV    v,副詞,否定,無界    Polarity=Neg    2    advmod    _    SpaceAfter=No
2    入    入    VERB    v,動詞,行為,移動    _    0    root    _    SpaceAfter=No
3    虎    虎    NOUN    n,名詞,主体,動物    _    4    nmod    _    SpaceAfter=No
4    穴    穴    NOUN    n,名詞,固定物,地形    Case=Loc    2    obj    _    SpaceAfter=No
5    不    不    ADV    v,副詞,否定,無界    Polarity=Neg    6    advmod    _    SpaceAfter=No
6    得    得    VERB    v,動詞,行為,得失    _    2    parataxis    _    SpaceAfter=No
7    虎    虎    NOUN    n,名詞,主体,動物    _    8    nmod    _    SpaceAfter=No
8    子    子    NOUN    n,名詞,人,関係    _    6    obj    _    SpaceAfter=No

SVGで可視化すると、こんな感じ。「入」=parataxis⇒「得」も含め、係り受け解析は完璧だ。文切り機能を除けば、UDPipe 2の古典中国語(漢文)係り受け解析は、かなり性能が高いようだ。早く、プログラム本体や各言語モデルが、リリースされるといいな。

14642027 journal
人工知能

yasuokaの日記: Re: 変体漢文をUniDic品詞で表すことができるか

日記 by yasuoka

昨日の日記の続きだが、「汝者我見欺」をUniDic品詞のUniversal Dependenciesで表すことはできるだろうか。

1    汝    汝    PRON    代名詞    _    5    nsubj:pass    _    SpaceAfter=No
2    者    は    ADP    助詞-係助詞    _    1    case    _    SpaceAfter=No
3    我    我    PRON    代名詞    _    5    obl    _    SpaceAfter=No
4    見    れる    AUX    助動詞    _    5    aux    _    SpaceAfter=No
5    欺    欺く    VERB    動詞-一般    _    0    root    _    SpaceAfter=No

係り受け関係については、2018年2月14日の日記を踏襲した。UniDic品詞であれば、「者」を「助詞-係助詞」にできる点がうれしい。ふーむ、やはり変体漢文は、UniDic品詞の方が合うのかしら。

14616130 journal
人工知能

yasuokaの日記: 変体漢文をUniDic品詞で表すことができるか

日記 by yasuoka

昨日の日記の続きだが、変体漢文が中古日本語の一種だとして、UniDic品詞によるUniversal Dependenciesで表すことはできるだろうか。『吾妻鏡』の「二品以銀作猫被宛贈物」で、少し考えてみよう。

1    二品    二品    NOUN    名詞-普通名詞-一般    _    6    nsubj    _    SpaceAfter=No
2    以    持つ    VERB    動詞-一般    _    6    advcl    _    SpaceAfter=No
3    銀作    銀作    NOUN    名詞-普通名詞-一般    _    4    nmod    _    SpaceAfter=No
4    猫    猫    NOUN    名詞-普通名詞-一般    _    2    obj    _    SpaceAfter=No
5    被    られる    AUX    助動詞    _    6    aux    _    SpaceAfter=No
6    宛    当てる    VERB    動詞-一般    _    0    root    _    SpaceAfter=No
7    贈物    贈り物    NOUN    名詞-普通名詞-一般    _    6    obl    _    SpaceAfter=No

「二品」「銀作」「贈物」を1語とみなすべきかどうか、ちょっと悩んだのだが、そこさえ割り切れば、あとは、私(安岡孝一)個人としては、思いのほかスンナリ書けた。うーむ、変体漢文専用の品詞体系を作るより、UniDic品詞を借りた方がいいのかな。

14543558 journal
日本

yasuokaの日記: 変体漢文の言語コードはojpなのか

日記 by yasuoka

ISO 639-3の言語コードojp「Old Japanese」が、いったいどういう言語を対象としているのか、微妙に気になった。Multitreeのojpのページは、7~10世紀の日本語を想定しているらしいが、書写言語としてのojpがどういうものなのか、記述がない。

ojpの「Old Japanese」が、いわゆる「古文」だとして、さて、そこに変体漢文は含まれているのだろうか。こういうの、いったい誰に聞いたらいいんだろ?

14483513 journal
日本

yasuokaの日記: 全国1896市区町村のデジタル戸籍化が完了 115

日記 by yasuoka

御蔵島村の電算戸籍が本日(9月28日)無事に稼働した、との御連絡をいただいた。これで、全国1896市区町村のデジタル戸籍化が完了したことになる。私(安岡孝一)個人としても非常にうれしく、関係各位には感謝の意を申し上げる。

ただ、戸籍のデジタル化を完全に完了させるためには、各市区町村に1~2%ほど残っている改製不適合簿(いわゆる紙戸籍の事故簿)を、何とかデジタル化しないといけない。デジタル化できない理由の一つだった氏名の漢字については、まあまあ文字コード化の見通しがついてきたが、変体仮名については恐ろしく手ごわい。戸籍デジタルシステムの稼働に向け、もう少し私自身も頑張ってみようと思う。

typodupeerror

計算機科学者とは、壊れていないものを修理する人々のことである

読み込み中...