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

soltioxさんのトモダチの日記。 過去1週間(やそれより前)のストーリは、ストーリアーカイブで確認できますよ。

15427359 journal
日本

yasuokaの日記: 子の名づけにおける平仮名又は片仮名と三代戸籍禁止の原則 1

日記 by yasuoka

ネットサーフィンしていたところ、ダ・ヴィンチニュースで『自分と同じ漢字でも読み方が違えば子どもの名前にできる?』(2021年9月7日)という問題を見つけた。

【問い】日本では、親と同じ名前を子どもにつけることは原則認められていないが、母が「幸子(さちこ)」、子どもが「幸子(ゆきこ)」のように、読み方が違えば認められる。

もちろん答は「×」(cf.名古屋高等裁判所[昭和38年(ラ)第128号]昭和38年11月9日決定、『高等裁判所民事判例集』第16巻第8号664~669頁)だが、解説に妙なことが書かれていた。

【解説】人名に使える漢字は、戸籍法の施行規則で定められている。現在は常用漢字2136字に加え、人名用漢字は863字。2015(平成27)年に巫女の「巫」、2017(平成29)年に渾身(こんしん)の「渾」が加わった。この範囲内で子どもの名前をつけるわけだが、常用漢字の中にはよくない意味を持つものもある。難解なもの、卑猥(ひわい)な意味の場合は「命名権の乱用」と判断され、認められない場合もあるのだ。ところで、海外では子どもに自分と同じ名前をつけ、親には「シニア」、子には「ジュニア」などと付記して区別したりもするが、日本では子に親と同じ名前をつけられるのか。同じ戸籍内で、親と同じ名前を子どもにつけることは原則、認められていない。同じ戸籍内だと、兄弟、祖父母と孫の関係でもつけられないわけだ。また、母が「幸子(さちこ)」、子どもが「幸子(ゆきこ)」のように、読み方が違っても、漢字が同じならばこれも認められない。

「この範囲内で子どもの名前をつける」とあるが、これらの漢字に加えて、片仮名又は平仮名も認められている(戸籍法施行規則第六十条)。また、「同じ戸籍内で」「祖父母と孫の関係」とあるが、三代戸籍禁止の原則によって「祖父母と孫」は同じ戸籍には入らない。現在の戸籍法第六条を見てみよう。

第六条 戸籍は、市町村の区域内に本籍を定める一の夫婦及びこれと氏を同じくする子ごとに、これを編製する。ただし、日本人でない者(以下「外国人」という。)と婚姻をした者又は配偶者がない者について新たに戸籍を編製するときは、その者及びこれと氏を同じくする子ごとに、これを編製する。

つまり、婚姻の時点で新たな戸籍を編製するので、祖父母と孫は同じ戸籍に入らない。ヤヤコシイのは私生児の場合で、この場合は、母子の戸籍を新たに編製するか、ケースによっては、母を祖父母の戸籍に残す形で子のみの単独戸籍を編製する。さらにヤヤコシイのは、祖父母が孫を特別養子縁組する場合だが、この場合は子の単独戸籍の編製が先行して、命名が先におこなわれるので、極端な話、祖父母のどちらかと同じ名であっても構わない。「祖父母と孫」が問題になるケースは、現在の戸籍法では有り得ないはずなのだが、それとも、私(安岡孝一)が何か見落としてるのかしら?

15426680 journal
人工知能

yasuokaの日記: 「実験を行っています」をUniDic2UDはどう解析するのか

日記 by yasuoka

「実験を行っています」という文を、UniDic2UDがどう解析するのか、ちょっと確かめてみた。まずは、最新版にアップデート。

$ pip3 install -U unidic2ud

アップデートできたら、コマンドラインでダイレクトに解析してみよう。

$ echo 実験を行っています | unidic2ud
# sent_id = 1
# text = 実験を行っています
1    実験    実験    NOUN    名詞-普通名詞-サ変可能    _    3    obj    _    SpaceAfter=No
2    を    を    ADP    助詞-格助詞    _    1    case    _    SpaceAfter=No
3    行っ    行う    VERB    動詞-一般    _    0    root    _    SpaceAfter=No
4    て    て    SCONJ    助詞-接続助詞    _    3    mark    _    SpaceAfter=No
5    い    居る    AUX    動詞-非自立可能    _    3    aux    _    SpaceAfter=No
6    ます    ます    AUX    助動詞    _    3    aux    _    SpacesAfter=\n

私(安岡孝一)の見る限り、ちゃんと「行う」に解析しているように見える。まあ、係り受けのフィードバックがあるから、このぐらいは読めてほしいところだけど。

15425383 journal
人工知能

yasuokaの日記: rinna/japanese-roberta-baseのトークナイザをRemBertTokenizerFastで置き換えるには

日記 by yasuoka

思うところあって、rinna/japanese-roberta-baseのトークナイザを、TransformersのRemBertTokenizerFastで置き換えてみた。T5Tokenizerはdo_lower_case=Trueを嫌っているし、まして[CLS]を付与したりしてくれないからだ。とりあえずGoogle Colaboratoryで、やってみよう。

!pip install 'transformers>=4.10.0' sentencepiece
from transformers import RemBertTokenizerFast,RobertaForMaskedLM
from transformers.file_utils import cached_path,hf_bucket_url
rinna="rinna/japanese-roberta-base"
tokenizer=RemBertTokenizerFast.from_pretrained(rinna,vocab_file=cached_path(hf_bucket_url(rinna,"spiece.model")))
model=RobertaForMaskedLM.from_pretrained(rinna)
tokenizer.do_lower_case=True
tokenizer.backend_tokenizer.pre_tokenizer.add_prefix_space=False
model.config.tokenizer_class="RemBertTokenizerFast"
tokenizer.save_pretrained("my.rinna.model")
model.save_pretrained("my.rinna.model")

うまくいけばmy.rinna.modelに新たなモデルが作られる。add_prefix_space=Falseすべきか迷ったのだが、これがTrueだと、[MASK]の直後に"_"を入れてくるのでウザイのだ。ちょっと使ってみよう。

import torch
from transformers import AutoTokenizer,AutoModelForMaskedLM
tokenizer=AutoTokenizer.from_pretrained("my.rinna.model")
model=AutoModelForMaskedLM.from_pretrained("my.rinna.model")
s=tokenizer("4年に1度[MASK]は開かれる。",return_offsets_mapping=True)
print(s)
ids=s["input_ids"]
mask=ids.index(tokenizer.mask_token_id)
tokens=tokenizer.convert_ids_to_tokens(ids)
print(tokens,mask)
inputs=torch.tensor([ids])
with torch.no_grad():
  outputs=model(inputs)
  pred=outputs[0][0,mask].topk(5)
for i,t in enumerate(tokenizer.convert_ids_to_tokens(pred.indices)):
  tokens[mask]=t
  print(i+1,tokens)

「4年に1度[MASK]は開かれる。」を穴埋めさせてみたところ、私(安岡孝一)の手元では以下の結果になった。

{'input_ids': [4, 37, 44, 24, 368, 6, 11, 21583, 8, 5], 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], 'offset_mapping': [(0, 0), (0, 1), (1, 3), (3, 4), (4, 5), (5, 11), (11, 12), (12, 16), (16, 17), (0, 0)]}
['[CLS]', '4', '年に', '1', '度', '[MASK]', 'は', '開かれる', '。', '[SEP]'] 5
1 ['[CLS]', '4', '年に', '1', '度', '大会', 'は', '開かれる', '。', '[SEP]']
2 ['[CLS]', '4', '年に', '1', '度', '株主総会', 'は', '開かれる', '。', '[SEP]']
3 ['[CLS]', '4', '年に', '1', '度', 'オールスターゲーム', 'は', '開かれる', '。', '[SEP]']
4 ['[CLS]', '4', '年に', '1', '度', 'オリンピック', 'は', '開かれる', '。', '[SEP]']
5 ['[CLS]', '4', '年に', '1', '度', 'アジア競技大会', 'は', '開かれる', '。', '[SEP]']

まあまあの結果だが、文末の[SEP]は無い方がいいのかもしれない。ただ、単語長がUniDicより長い部分があるので、トークナイザを置き換えてもSuPar-UniDicには適さないようだ。うーん、残念。

15423437 journal
人工知能

yasuokaの日記: 日本語・中国語・タイ語の係り受け解析モジュールesuparリリース(仮)

日記 by yasuoka

9月14日一昨日昨日の日記の手法を一まとめにして、esuparというpython3モジュールとしてリリース(仮)した。日本語と中国語(簡化字・繁体字および文言文/漢文)とタイ語の係り受け解析がおこなえる。Linux系OSなら

$ pip3 install esupar --user

一発でインストール可能なはずだ。インストールがうまくいったら、まずは「太郎は花子が読んでいる本を次郎に渡した」を係り受け解析してみよう。

$ python3
>>> import esupar
>>> nlp=esupar.load("ja")
>>> doc=nlp("太郎は花子が読んでいる本を次郎に渡した")
>>> print(doc)
1    太郎    _    PROPN    _    _    12    nsubj    _    SpaceAfter=No
2    は    _    ADP    _    _    1    case    _    SpaceAfter=No
3    花子    _    PROPN    _    _    5    nsubj    _    SpaceAfter=No
4    が    _    ADP    _    _    3    case    _    SpaceAfter=No
5    読ん    _    VERB    _    _    8    acl    _    SpaceAfter=No
6    で    _    SCONJ    _    _    5    mark    _    SpaceAfter=No
7    いる    _    AUX    _    _    5    aux    _    SpaceAfter=No
8    本    _    NOUN    _    _    12    obj    _    SpaceAfter=No
9    を    _    ADP    _    _    8    case    _    SpaceAfter=No
10    次郎    _    PROPN    _    _    12    obl    _    SpaceAfter=No
11    に    _    ADP    _    _    10    case    _    SpaceAfter=No
12    渡し    _    VERB    _    _    0    root    _    SpaceAfter=No
13    た    _    AUX    _    _    12    aux    _    _

>>> import deplacy
>>> deplacy.render(doc,Japanese=True)
太郎 PROPN ═╗<════════╗ nsubj(主語)
は   ADP   <╝         ║ case(格表示)
花子 PROPN ═╗<══╗     ║ nsubj(主語)
が   ADP   <╝   ║     ║ case(格表示)
読ん VERB  ═╗═╗═╝<╗   ║ acl(連体修飾節)
で   SCONJ <╝ ║   ║   ║ mark(標識)
いる AUX   <══╝   ║   ║ aux(動詞補助成分)
本   NOUN  ═╗═════╝<╗ ║ obj(目的語)
を   ADP   <╝       ║ ║ case(格表示)
次郎 PROPN ═╗<╗     ║ ║ obl(斜格補語)
に   ADP   <╝ ║     ║ ║ case(格表示)
渡し VERB  ═╗═╝═════╝═╝ root(親)
た   AUX   <╝           aux(動詞補助成分)

esupar.loadのパラメータは、"ja"が日本語、"zh"が現代中国語、"lzh"が古典中国語、"th"がタイ語だったりする。まだまだチューニングが不十分なので、解析精度はイマイチだが、ぜひ試しに使ってみてほしい。

15422438 journal
中国

yasuokaの日記: chinese-bert-wwm-ext-uposによる現代中国語の係り受け解析

日記 by yasuoka

昨日の日記の手法をchinese-bert-wwm-ext-uposに適用して、現代中国語の係り受け解析モデルを試作してみた。Google Colaboratoryで動かしてみよう。

!pip install 'transformers>=4.7.0' 'supar>=1.1.1' 'deplacy>=2.0.1'
from transformers import AutoModelForTokenClassification,AutoTokenizer,TokenClassificationPipeline
from transformers.file_utils import cached_path,hf_bucket_url
from supar import Parser
brt="KoichiYasuoka/chinese-bert-wwm-ext-upos"
mdl=AutoModelForTokenClassification.from_pretrained(brt)
tkz=AutoTokenizer.from_pretrained(brt)
pos=TokenClassificationPipeline(model=mdl,tokenizer=tkz,aggregation_strategy="simple")
prs=Parser.load(cached_path(hf_bucket_url(brt,"supar.model")))
def nlp(s):
  d=pos(s)
  e=prs.predict([[t["word"].replace(" ","") for t in d]])
  e.sentences[0].values[3]=tuple([t["entity_group"] for t in d])
  e.sentences[0].values[9]=tuple(["SpaceAfter=No" if t["end"]==u["start"] else "_" for t,u in zip(d,d[1:])]+["_"])
  return e
doc=nlp("下雨天和星期一总是让我沮丧")
import deplacy
deplacy.render(doc)
deplacy.serve(doc,port=None)

「下雨天和星期一总是让我沮丧」を係り受け解析してみたところ、私(安岡孝一)の手元では以下の結果になった。

下雨 NOUN  <╗       compound
天   PART  ═╝═╗═╗<╗ nsubj
和   CCONJ <╗ ║ ║ ║ cc
星期 NOUN  ═╝<╝ ║ ║ conj
一   NUM   <════╝ ║ nummod
总   ADV   <════╗ ║ advmod
是让 VERB  ═══╗═╝═╝ root
我   PRON  <╗ ║     nsubj
沮丧 ADJ   ═╝<╝     ccomp

1    下雨    _    NOUN    _    _    2    compound    _    SpaceAfter=No
2    天    _    PART    _    _    7    nsubj    _    SpaceAfter=No
3    和    _    CCONJ    _    _    4    cc    _    SpaceAfter=No
4    星期    _    NOUN    _    _    2    conj    _    SpaceAfter=No
5    一    _    NUM    _    _    2    nummod    _    SpaceAfter=No
6    总    _    ADV    _    _    7    advmod    _    SpaceAfter=No
7    是让    _    VERB    _    _    0    root    _    SpaceAfter=No
8    我    _    PRON    _    _    9    nsubj    _    SpaceAfter=No
9    沮丧    _    ADJ    _    _    7    ccomp    _    _

SVGで可視化すると、こんな感じ。「天」=nummod⇒「一」はどう考えても変で、「星期」=nummod⇒「一」とすべきだろう。また、「我」⇐nsubj=「沮丧」は「是让」=obj⇒「我」とした上で、「是让」=ccomp⇒「沮丧」をxcompにしたいところだ。うーん、このあたり、どうすれば精度を上げられるかな。

typodupeerror

海軍に入るくらいなら海賊になった方がいい -- Steven Paul Jobs

読み込み中...