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

iidaさんのトモダチの日記。 今週も投票をしましたか?

14004716 journal
人工知能

yasuokaの日記: Unidic2UDと中古和文UniDicによる『源氏物語』の係り受け解析

日記 by yasuoka

思うところあって、UniDic2UD中古和文UniDicで『源氏物語』の係り受け解析を試してみることにした。まずは、最新版のUniDic2UDを、辞書や言語モデルも一緒にインストール。

% pip3 install 'unidic2ud>=1.1.4'
% python3 -m unidic2ud download.unidic wabun
% python3 -m unidic2ud download.udpipe japanese-gsd

インストールできたら、とりあえず「いづれの御時にか、女御、更衣あまたさぶらひたまひけるなかに、いとやむごとなき際にはあらぬが、すぐれて時めきたまふありけり。」を係り受け解析してみよう。

% python3
>>> import unidic2ud
>>> wabun=unidic2ud.load("wabun")
>>> s=wabun("いづれの御時にか、女御、更衣あまたさぶらひたまひけるなかに、いとやむごとなき際にはあらぬが、すぐれて時めきたまふありけり。")
>>> print(s)
# text = いづれの御時にか、女御、更衣あまたさぶらひたまひけるなかに、いとやむごとなき際にはあらぬが、すぐれて時めきたまふありけり。
1    いづれ    何れ    PRON    代名詞    _    4    nmod    _    SpaceAfter=No|Translit=イヅレ
2    の    の    ADP    助詞-格助詞    _    1    case    _    SpaceAfter=No|Translit=ノ
3    御    御    NOUN    接頭辞    _    4    compound    _    SpaceAfter=No|Translit=オオン
4    時    時    NOUN    名詞-普通名詞-副詞可能    _    23    obl    _    SpaceAfter=No|Translit=トキ
5    に    に    ADP    助詞-格助詞    _    4    case    _    SpaceAfter=No|Translit=ニ
6    か    か    ADP    助詞-係助詞    _    4    case    _    SpaceAfter=No|Translit=カ
7    、    、    PUNCT    補助記号-読点    _    4    punct    _    SpaceAfter=No
8    女御    女御    NOUN    名詞-普通名詞-一般    _    13    obl    _    SpaceAfter=No|Translit=ニョウゴ
9    、    、    PUNCT    補助記号-読点    _    8    punct    _    SpaceAfter=No
10    更衣    更衣    NOUN    名詞-普通名詞-サ変可能    _    11    compound    _    SpaceAfter=No|Translit=コウイ
11    あまた    数多    NOUN    名詞-普通名詞-一般    _    12    obl    _    SpaceAfter=No|Translit=アマタ
12    さぶらひ    侍う    VERB    動詞-一般    _    13    advcl    _    SpaceAfter=No|Translit=サブラヒ
13    たまひ    給う    VERB    動詞-非自立可能    _    15    acl    _    SpaceAfter=No|Translit=タマヒ
14    ける    けり    AUX    助動詞    _    13    aux    _    SpaceAfter=No|Translit=ケル
15    なか    中    NOUN    名詞-普通名詞-副詞可能    _    23    iobj    _    SpaceAfter=No|Translit=ナカ
16    に    に    ADP    助詞-格助詞    _    15    case    _    SpaceAfter=No|Translit=ニ
17    、    、    PUNCT    補助記号-読点    _    15    punct    _    SpaceAfter=No
18    いと    いと    ADV    副詞    _    23    advmod    _    SpaceAfter=No|Translit=イト
19    やむごとなき    やんごとない    ADJ    形容詞-一般    _    20    amod    _    SpaceAfter=No|Translit=ヤムゴトナキ
20    際    際    NOUN    名詞-普通名詞-一般    _    23    iobj    _    SpaceAfter=No|Translit=キワ
21    に    に    ADP    助詞-格助詞    _    20    case    _    SpaceAfter=No|Translit=ニ
22    は    は    ADP    助詞-係助詞    _    20    case    _    SpaceAfter=No|Translit=ハ
23    あら    有る    VERB    動詞-非自立可能    _    32    advcl    _    SpaceAfter=No|Translit=アラ
24    ぬ    ず    AUX    助動詞    _    23    aux    _    SpaceAfter=No|Translit=ヌ
25    が    が    ADP    助詞-格助詞    _    23    case    _    SpaceAfter=No|Translit=ガ
26    、    、    PUNCT    補助記号-読点    _    23    punct    _    SpaceAfter=No
27    すぐれ    優れる    VERB    動詞-一般    _    32    advcl    _    SpaceAfter=No|Translit=スグレ
28    て    て    SCONJ    助詞-接続助詞    _    27    mark    _    SpaceAfter=No|Translit=テ
29    時    時    NOUN    名詞-普通名詞-副詞可能    _    32    obl    _    SpaceAfter=No|Translit=トキ
30    めき    めく    PART    接尾辞-動詞的    _    29    mark    _    SpaceAfter=No|Translit=メキ
31    たまふ    給う    VERB    動詞-非自立可能    _    32    advcl    _    SpaceAfter=No|Translit=タマフ
32    あり    有る    VERB    動詞-非自立可能    _    0    root    _    SpaceAfter=No|Translit=アリ
33    けり    けり    AUX    助動詞    _    32    aux    _    SpaceAfter=No|Translit=ケリ
34    。    。    PUNCT    補助記号-句点    _    32    punct    _    SpaceAfter=No

うーん、形態素解析(単語切り・品詞付与・活用形の正規化)は、ちゃんと出来てるのだけど、係り受け解析がイマイチだ。私(安岡孝一)なりにざっと直してみよう。

>>> s[4].head=32
>>> s[8].head,s[8].deprel=12,"nsubj"
>>> s[10].head,s[10].deprel=8,"conj"
>>> s[15].head,s[15].deprel=32,"obl"
>>> s[18].head=19
>>> s[20].deprel="nsubj"
>>> s[23].head=31
>>> s[25].deprel="mark"
>>> s[27].head=31
>>> s[29].head=31
>>> s[31].deprel="csubj"
>>> print(s)
1    いづれ    何れ    PRON    代名詞    _    4    nmod    _    SpaceAfter=No|Translit=イヅレ
2    の    の    ADP    助詞-格助詞    _    1    case    _    SpaceAfter=No|Translit=ノ
3    御    御    NOUN    接頭辞    _    4    compound    _    SpaceAfter=No|Translit=オオン
4    時    時    NOUN    名詞-普通名詞-副詞可能    _    32    obl    _    SpaceAfter=No|Translit=トキ
5    に    に    ADP    助詞-格助詞    _    4    case    _    SpaceAfter=No|Translit=ニ
6    か    か    ADP    助詞-係助詞    _    4    case    _    SpaceAfter=No|Translit=カ
7    、    、    PUNCT    補助記号-読点    _    4    punct    _    SpaceAfter=No
8    女御    女御    NOUN    名詞-普通名詞-一般    _    12    nsubj    _    SpaceAfter=No|Translit=ニョウゴ
9    、    、    PUNCT    補助記号-読点    _    8    punct    _    SpaceAfter=No
10    更衣    更衣    NOUN    名詞-普通名詞-サ変可能    _    8    conj    _    SpaceAfter=No|Translit=コウイ
11    あまた    数多    NOUN    名詞-普通名詞-一般    _    12    obl    _    SpaceAfter=No|Translit=アマタ
12    さぶらひ    侍う    VERB    動詞-一般    _    13    advcl    _    SpaceAfter=No|Translit=サブラヒ
13    たまひ    給う    VERB    動詞-非自立可能    _    15    acl    _    SpaceAfter=No|Translit=タマヒ
14    ける    けり    AUX    助動詞    _    13    aux    _    SpaceAfter=No|Translit=ケル
15    なか    中    NOUN    名詞-普通名詞-副詞可能    _    32    obl    _    SpaceAfter=No|Translit=ナカ
16    に    に    ADP    助詞-格助詞    _    15    case    _    SpaceAfter=No|Translit=ニ
17    、    、    PUNCT    補助記号-読点    _    15    punct    _    SpaceAfter=No
18    いと    いと    ADV    副詞    _    19    advmod    _    SpaceAfter=No|Translit=イト
19    やむごとなき    やんごとない    ADJ    形容詞-一般    _    20    amod    _    SpaceAfter=No|Translit=ヤムゴトナキ
20    際    際    NOUN    名詞-普通名詞-一般    _    23    nsubj    _    SpaceAfter=No|Translit=キワ
21    に    に    ADP    助詞-格助詞    _    20    case    _    SpaceAfter=No|Translit=ニ
22    は    は    ADP    助詞-係助詞    _    20    case    _    SpaceAfter=No|Translit=ハ
23    あら    有る    VERB    動詞-非自立可能    _    31    advcl    _    SpaceAfter=No|Translit=アラ
24    ぬ    ず    AUX    助動詞    _    23    aux    _    SpaceAfter=No|Translit=ヌ
25    が    が    ADP    助詞-格助詞    _    23    mark    _    SpaceAfter=No|Translit=ガ
26    、    、    PUNCT    補助記号-読点    _    23    punct    _    SpaceAfter=No
27    すぐれ    優れる    VERB    動詞-一般    _    31    advcl    _    SpaceAfter=No|Translit=スグレ
28    て    て    SCONJ    助詞-接続助詞    _    27    mark    _    SpaceAfter=No|Translit=テ
29    時    時    NOUN    名詞-普通名詞-副詞可能    _    31    obl    _    SpaceAfter=No|Translit=トキ
30    めき    めく    PART    接尾辞-動詞的    _    29    mark    _    SpaceAfter=No|Translit=メキ
31    たまふ    給う    VERB    動詞-非自立可能    _    32    csubj    _    SpaceAfter=No|Translit=タマフ
32    あり    有る    VERB    動詞-非自立可能    _    0    root    _    SpaceAfter=No|Translit=アリ
33    けり    けり    AUX    助動詞    _    32    aux    _    SpaceAfter=No|Translit=ケリ
34    。    。    PUNCT    補助記号-句点    _    32    punct    _    SpaceAfter=No

11ヶ所も手で直したのだが、まあ、これなら納得が行く。この結果を見る限り、japanese-gsdを中古和文の係り受け解析に使うのは、やはり多少無理があって、もう少しチューニングなり何なり、研究の余地があるということだ。ちなみに、最新版のUniDic2UDでは

>>> f=open("trial.svg","w")
>>> f.write(s.to_svg())
>>> f.close()

でSVGを出力できるように改良したので、ぜひSVGによる可視化を楽しんでほしい。

14004202 journal
中国

yasuokaの日記: 「令和」の文切り・形態素解析エンジンとしての甲言Jiayan

日記 by yasuoka

ネットサーフィンしていたところ、甲言Jiayanという古典中国語(漢文)解析ツールを見つけた。白文の単語切り・品詞付与・文切りが可能らしい。ただ、インストールがちょっと手間だったりする。まずは、Google Driveからjiayan_model.zipという言語モデルをダウンロードしつつ

% pip3 install https://github.com/kpu/kenlm/archive/master.zip
% pip3 install jiayan

で、python3モジュールをインストールする。その後、jiayan_model.zipのダウンロードが終わったら

% python3
>>> import zipfile
>>> with zipfile.ZipFile("jiayan_models.zip") as z:
...   z.extractall(members=["jiayan_models/jiayan.klm","jiayan_models/cut_model","jiayan_models/pos_model","jiayan_models/punc_model"])
...
>>> quit()

でモデルを展開して、インストール完了。とりあえず、令和の元ネタを文切りさせてみよう。

% python3
>>> reiwa="天平二年正月十三日萃于帥老之宅申宴會也于時初春令月氣淑風和梅披鏡前之粉蘭薰珮後之香加以曙嶺移雲松掛羅而傾盖夕岫結霧鳥封縠而迷林庭舞新蝶空歸故鴈於是盖天促膝飛觴忘言一室之裏開衿煙霞之外淡然自放快然自足若非翰苑何以攄情詩紀落梅之篇古今夫何異矣宜賦園梅聊成短詠"
>>> import jiayan
>>> lm=jiayan.load_lm("jiayan_models/jiayan.klm")
>>> sentencizer=jiayan.CRFSentencizer(lm)
>>> sentencizer.load("jiayan_models/cut_model")
>>> d=sentencizer.sentencize(reiwa)
>>> print(d)
['天平二年正月十三日萃于帥', '老之宅', '申宴會也', '于時初春令', '月氣淑風和梅', '披鏡前之粉', '蘭薰珮後之香', '加以曙嶺移雲', '松掛羅而傾', '盖夕岫結', '霧鳥封縠', '而迷林庭', '舞新蝶空歸故鴈', '於是盖天促膝', '飛觴忘言', '一室之裏', '開衿煙霞之外', '淡然自放', '快然自足', '若非翰苑', '何以攄情', '詩紀落梅之篇', '古今夫何異矣', '宜賦園梅', '聊成短詠']

うーむ、最後の方は何とか切れてるものの、前半がかなりアヤシイ。続いて、単語切りと品詞付与も見てみよう。

>>> tokenizer=jiayan.CharHMMTokenizer(lm)
>>> t=list(tokenizer.tokenize(reiwa))
>>> postagger=jiayan.CRFPOSTagger()
>>> postagger.load("jiayan_models/pos_model")
>>> p=postagger.postag(t)
>>> print(" ".join(i+"/"+j for i,j in zip(t,p)))
天平/n 二年/nt 正月/nt 十三/m 日/q 萃/v 于/p 帥/n 老/a 之/u 宅/n 申宴/v 會/n 也/d 于/p 時/n 初/nd 春/nt 令/v 月/n 氣/v 淑/v 風/n 和/c 梅/n 披/v 鏡/n 前/nd 之/u 粉/n 蘭薰/n 珮/v 後/n 之/u 香/n 加/v 以/p 曙/n 嶺/v 移/v 雲/n 松/v 掛/n 羅/v 而/c 傾/v 盖/v 夕/nt 岫/v 結/n 霧/v 鳥/n 封/v 縠/n 而/c 迷/v 林/n 庭/n 舞/v 新/a 蝶空/n 歸/n 故/c 鴈/v 於/n 是/v 盖天/v 促膝/v 飛/n 觴/v 忘言/v 一/m 室/n 之/u 裏/n 開/v 衿/n 煙/v 霞/n 之/u 外/nd 淡然/a 自/d 放/v 快然/n 自/r 足/a 若/c 非/d 翰苑/v 何/r 以/p 攄/v 情/n 詩/v 紀/v 落梅/n 之/u 篇/n 古今/n 夫/n 何/r 異/n 矣/u 宜/v 賦/v 園/v 梅/n 聊/v 成/v 短/a 詠/n

甲言Jiayanの品詞一覧と見比べると、「也」がadverbだったり、「和」や「故」がconjunctionだったり、「歸」や「於」や「夫」がnounだったり、私(安岡孝一)個人としては納得がいかない結果だ。さて、ここから係り受け解析に行きたくても、この精度だと苦しいかな…。

14000184 journal
日記

yasuokaの日記: Z80における2進→BCD変換 1

日記 by yasuoka

ネットサーフィンしていたところ、私(安岡孝一)の8月3日の日記の読者が、Z80で2進→BCD変換に挑戦しているのを見つけた。Bレジスタに0~99の整数が入っている時に、10で除算した商をAレジスタの上位4ビットに、余りをAレジスタの下位4ビットに返す、という問題である。私個人の直感としては、DAAを駆使する方が、読みやすくて速い気がする。

78      LD A,B
E6 78  AND 78H
0F    RRCA
0F    RRCA
0F    RRCA
27     DAA
87     ADD A
27     DAA
87     ADD A
27     DAA
87     ADD A
27     DAA
4F      LD C,A
78      LD A,B
E6 07  AND 07H
81     ADD C
27     DAA

7月30日の日記に示した方法の圧縮版だが、19バイト74ステートといったところだろうか。ただ、あまり細かい点を詰めてないので、もうちょっと高速化できるような気もする。何かいい方法ないかなぁ。

13999644 journal
日本

yasuokaの日記: 戸籍統一文字370600はU+2713Cではないのか 1

日記 by yasuoka

戸籍統一文字をざっと見ていたところ、370600に妙な字が収録されていることに気づいた。U+2713C「𧄼」に見えるのだが、下部の「登」が一画たりない。ただ、総画数が23になっているところを見ると、大漢和番号32592を作ろうとして、一画そぎ落してしまったようにも思われる。うーむ、こういうの、どうしたらいいんだろ?

13998656 journal
人工知能

yasuokaの日記: 「うなぎを浜松に食べに行く」は係り受け解析できるのか

日記 by yasuoka

私(安岡孝一)の6月22日の日記の読者から、「うなぎを浜松に食べに行く」は係り受け解析できるのか、という質問をいただいた。Catena Inseparability付きのUniversal Dependenciesで示すと、以下の通り。

# text = うなぎを浜松に食べに行く
# catena_inseparability = 7<5<1<3<6<2<4
1    うなぎ    うなぎ    NOUN    名詞-普通名詞-一般    _    5    obj    _    SpaceAfter=No
2    を    を    ADP    助詞-格助詞    _    1    case    _    SpaceAfter=No
3    浜松    浜松    PROPN    名詞-固有名詞-地名-一般    _    7    obl    _    SpaceAfter=No
4    に    に    ADP    助詞-格助詞    _    3    case    _    SpaceAfter=No
5    食べ    食べる    VERB    動詞-一般    _    7    advcl    _    SpaceAfter=No
6    に    に    ADP    助詞-格助詞    _    5    case    _    SpaceAfter=No
7    行く    行く    VERB    動詞-非自立可能    _    0    root    _    SpaceAfter=No

「UDPipe Visualizer with Immediate Catena Tree」で見ると、こんな感じ。係り受けに交差があるので、通常の構成素解析だと手ごわいかもしれないが、直接構成鎖解析なら喜ぶべき文例だろう。ただ、日本語の言語処理においては、構成鎖(catena)はおろか、依存文法(dependency grammar)すら、まだまだ研究されてない気がする。これだけAIが流行ってるのに、どうして日本語の文法解析に、もっともっと応用しないのかしら。

13992969 journal
人工知能

yasuokaの日記: 日本語形態素解析エンジンnagisaは古典中国語(漢文)を学習できるのか 2

日記 by yasuoka

ネットサーフィンしていたところ、nagisaという日本語形態素解析エンジンを見つけた。端的には、python3のdynetで、日本語の単語切りと品詞付与をおこなうエンジンなのだが、自前でUniversal Dependenciesから機械学習する方法も示されている。だとすると、UD_Classical_Chinese-Kyotoから古典中国語(漢文)を学習する、というのもアリなのではないかと思い、ちょっと試してみることにした。

% pip3 install nagisa
% git clone https://github.com/UniversalDependencies/UD_Classical_Chinese-Kyoto.git
% awk '{if(NF==10&&$1~/^[1-9][0-9]*$/)printf("%s\t%s\n",$2,$5);else if($0=="")printf("EOS\n")}' UD_Classical_Chinese-Kyoto/lzh_kyoto-ud-train.conllu > lzh_kyoto-ud-train.txt
% awk '{if(NF==10&&$1~/^[1-9][0-9]*$/)printf("%s\t%s\n",$2,$5);else if($0=="")printf("EOS\n")}' UD_Classical_Chinese-Kyoto/lzh_kyoto-ud-dev.conllu > lzh_kyoto-ud-dev.txt
% awk '{if(NF==10&&$1~/^[1-9][0-9]*$/)printf("%s\t%s\n",$2,$5);else if($0=="")printf("EOS\n")}' UD_Classical_Chinese-Kyoto/lzh_kyoto-ud-test.conllu > lzh_kyoto-ud-test.txt
% python3
>>> import nagisa
>>> nagisa.fit(train_file="lzh_kyoto-ud-train.txt",dev_file="lzh_kyoto-ud-dev.txt",test_file="lzh_kyoto-ud-test.txt",model_name="lzh_kyoto-nagisa")

Epoch   LR      Loss    Time_m  DevWS_f1        DevPOS_f1       TestWS_f1       TestPOS_f1
1       0.100   8.880   0.391   98.56           79.15           99.54           81.40
2       0.100   3.602   0.388   98.60           83.63           99.59           84.91
3       0.100   2.705   0.388   98.79           85.25           99.67           86.37
4       0.050   2.304   0.351   98.73           85.76           99.67           86.37
5       0.050   1.771   0.389   98.87           86.62           99.61           87.40
6       0.050   1.593   0.389   98.94           86.78           99.48           87.91
7       0.025   1.472   0.354   98.81           86.55           99.48           87.91
8       0.025   1.285   0.391   98.94           86.87           99.54           87.97
9       0.012   1.207   0.354   98.87           87.04           99.54           87.97
10      0.006   1.128   0.354   98.83           87.08           99.54           87.97

XPOS(第5フィールド)の機械学習でF1値が87.97だとすると、UDPipeの87.8%と比べても、まあ、遜色ない値だ。とりあえず「不入虎穴不得虎子」を、形態素解析してみよう。

>>> lzh=nagisa.Tagger(vocabs="lzh_kyoto-nagisa.vocabs",params="lzh_kyoto-nagisa.params",hp="lzh_kyoto-nagisa.hp").tagging
>>> s=lzh("不入虎穴不得虎子")
>>> print(s)
不/v,副詞,否定,無界 入/v,動詞,行為,移動 虎/n,名詞,主体,動物 穴/n,名詞,固定物,地形 不/v,副詞,否定,無界 得/v,動詞,行為,得失 虎/n,名詞,主体,動物 子/n,名詞,人,関係

一字ずつ全てが切られていて、品詞も妥当なようだ。次に「有兄子曰甫」を、形態素解析してみよう。

>>> s=lzh("有兄子曰甫")
>>> print(s)
有/v,動詞,存在,存在 兄子/n,名詞,主体,書物 曰/v,動詞,行為,伝達 甫/v,動詞,描写,態度

うーん、「甫」という人名を知らないのは、まあ仕方ないとしても、「兄」の「子」をひとまとめにして「n,名詞,主体,書物」だと思ってるのは、どういう勘違いなのだろう。ならば「若之何子之不言也」を、形態素解析してみよう。

>>> s=lzh("若之何子之不言也")
>>> print(s)
若/v,動詞,行為,分類 之/n,代名詞,人称,止格 何/n,代名詞,疑問,* 子/n,代名詞,人称,他 之/p,助詞,接続,属格 不/v,副詞,否定,無界 言/v,動詞,行為,伝達 也/p,助詞,句末,*

さすがに「何」と「子」がちゃんと分かれていて、しかも「之」の品詞も見分けている。どうやら、品詞を階層処理していない(コンマに意味がない)ようなので、品詞の末尾にLEMMAやGlossを付けておく、といった小技は無理そうだ。とりあえずは「甫」を何とかすべく、外部辞書で人名を大量に教えこみたいところなのだが、 nagisa.fit dict_fileのフォーマットって、train_fileとかと同じなのかしら?

13992558 journal
人工知能

yasuokaの日記: spaCyと現代書き言葉UniDicで読む『吾輩は猫である』

日記 by yasuoka

一昨昨日にリリースしたunidic2udを改造して、spaCyの言語モジュールとして使えるようにしたところ、かなり高速化できてしまった。インストール方法は、以下の通り。

% pip3 install 'unidic2ud>=1.0.1'
% pip3 install 'spacy>=2.1.0'

さらなる高速化のために、現代書き言葉UniDicと、UDPipeのjapanese-gsdモデルも手元にダウンロードしておこう。

% python3 -m unidic2ud download.unidic gendai
% python3 -m unidic2ud download.udpipe japanese-gsd

インストールがうまくいったら、一昨日と同様に言語処理100本ノック2015の『吾輩は猫である』から、「バイオリンを始める」文、すなわち「バイオリン←obj─始める」という係り受けを、spaCyで探してみよう。

% python3
>>> import unidic2ud.spacy
>>> ja=unidic2ud.spacy.load("gendai")
>>> import urllib.request
>>> with urllib.request.urlopen("http://www.cl.ecei.tohoku.ac.jp/nlp100/data/neko.txt") as r:
...   q=r.read()
...
>>> doc=ja(q.decode("utf-8"))
>>> g=set(t.sent for t in doc if t.lemma_=="バイオリン" and t.dep_=="obj" and t.head.lemma_=="始める")
>>> print(g)
[「君はヴァイオリンをいつ頃から始めたのかい。]

私(安岡孝一)の手元の非力なマシンでも、係り受け解析も含め、5分たらずで目的の文が探せてしまう。Universal Dependenciesの形で係り受けを見るなら

>>> print(unidic2ud.spacy.to_conllu(g))
# text = 「君はヴァイオリンをいつ頃から始めたのかい。
1    「    「    PUNCT    補助記号-括弧開    _    2    punct    _    SpaceAfter=No
2    君    君    PRON    代名詞    _    8    nsubj    _    SpaceAfter=No|Translit=キミ
3    は    は    ADP    助詞-係助詞    _    2    case    _    SpaceAfter=No|Translit=ハ
4    ヴァイオリン    バイオリン    NOUN    名詞-普通名詞-一般    _    8    obj    _    SpaceAfter=No
5    を    を    ADP    助詞-格助詞    _    4    case    _    SpaceAfter=No|Translit=ヲ
6    いつ頃    何時頃    NOUN    名詞-普通名詞-副詞可能    _    8    obl    _    SpaceAfter=No|Translit=イツゴロ
7    から    から    ADP    助詞-格助詞    _    6    case    _    SpaceAfter=No|Translit=カラ
8    始め    始める    VERB    動詞-非自立可能    _    0    root    _    SpaceAfter=No|Translit=ハジメ
9    た    た    AUX    助動詞    _    8    aux    _    SpaceAfter=No|Translit=タ
10    の    の    ADP    助詞-準体助詞    _    8    case    _    SpaceAfter=No|Translit=ノ
11    か    か    PART    助詞-終助詞    _    8    mark    _    SpaceAfter=No|Translit=カ
12    い    い    PART    助詞-終助詞    _    8    mark    _    SpaceAfter=No|Translit=イ
13    。    。    PUNCT    補助記号-句点    _    8    punct    _    SpaceAfter=No

でOKだ。MeCabとUDPipeが高速な上に、spaCyもかなり高速なので、素晴らしく速い。さて、この方法で、古典中国語(漢文)向けudkanbunの方も、何とかspaCyモジュールにできないかな…。

13991083 journal
人工知能

yasuokaの日記: unidic2udと現代書き言葉UniDicで読む『吾輩は猫である』

日記 by yasuoka

昨日リリースした unidic2udの力量を見るべく、現代書き言葉UniDicとjapanese-gsdで『吾輩は猫である』を読んでみた。まずは、unidic2udのインストールと、辞書のダウンロード。

% pip3 install unidic2ud
% python3 -m unidic2ud download.unidic gendai
% python3 -m unidic2ud download.udpipe japanese-gsd

かなり時間がかかると思うが、インストールがうまくいったら、言語処理100本ノック2015の『吾輩は猫である』から、「バイオリンを始める」文、すなわち「バイオリン←obj─始める」という係り受けを、unidic2udで探してみよう。

% python3
>>> import unidic2ud,urllib.request
>>> from itertools import takewhile
>>> ja=unidic2ud.load("gendai")
>>> with urllib.request.urlopen("http://www.cl.ecei.tohoku.ac.jp/nlp100/data/neko.txt") as r:
...   q=r.read()
...
>>> ud=ja(q.decode("utf-8"))
>>> f=[i for i,t in enumerate(ud) if t.lemma=="バイオリン" and t.deprel=="obj" and t.head.lemma=="始める"]
>>> g=[[ud[j] for j in takewhile(lambda j:j-ud[j].id==i,range(i+1,len(ud)))] for i in set(i-ud[i].id for i in f)]
>>> s=unidic2ud.UDPipeEntry("".join("# text = "+"".join(t.form if "SpaceAfter=No" in t.misc else t.form+" " for t in h)+"\n"+"".join(str(t)+"\n" for t in h)+"\n" for h in g))
>>> print(s)
# text = 「君はヴァイオリンをいつ頃から始めたのかい。
1    「    「    PUNCT    補助記号-括弧開    _    2    punct    _    SpaceAfter=No
2    君    君    PRON    代名詞    _    8    nsubj    _    SpaceAfter=No|Translit=キミ
3    は    は    ADP    助詞-係助詞    _    2    case    _    SpaceAfter=No|Translit=ハ
4    ヴァイオリン    バイオリン    NOUN    名詞-普通名詞-一般    _    8    obj    _    SpaceAfter=No
5    を    を    ADP    助詞-格助詞    _    4    case    _    SpaceAfter=No|Translit=ヲ
6    いつ頃    何時頃    NOUN    名詞-普通名詞-副詞可能    _    8    obl    _    SpaceAfter=No|Translit=イツゴロ
7    から    から    ADP    助詞-格助詞    _    6    case    _    SpaceAfter=No|Translit=カラ
8    始め    始める    VERB    動詞-非自立可能    _    0    root    _    SpaceAfter=No|Translit=ハジメ
9    た    た    AUX    助動詞    _    8    aux    _    SpaceAfter=No|Translit=タ
10    の    の    ADP    助詞-準体助詞    _    8    case    _    SpaceAfter=No|Translit=ノ
11    か    か    PART    助詞-終助詞    _    8    mark    _    SpaceAfter=No|Translit=カ
12    い    い    PART    助詞-終助詞    _    8    mark    _    SpaceAfter=No|Translit=イ
13    。    。    PUNCT    補助記号-句点    _    8    punct    _    SpaceAfter=No

非常にコンパクトに書ける上に、辞書をダウンロードしていれば、かなり高速に動作するはずだ。結果として見つかるのは、“「君はヴァイオリンをいつ頃から始めたのかい。”の一文で、「CoNLL-U SVG Editor」で見ると、 こんな感じ。 ちゃんと「ヴァイオリン←obj─始め」という係り受けを、『吾輩は猫である』約10000文200000語の中から見つけている。スピードの点でも、GiNZAStanfordNLPに遜色ないようだ。問題は、セットアップ時の辞書ダウンロードにかかる時間かな。

13990281 journal
人工知能

yasuokaの日記: 現代・古典日本語の形態素解析・係り受け解析のためのunidic2ud

日記 by yasuoka

私(安岡孝一)の8月21日の日記で公開したudkanbunを改造して、UniDicのMeCab辞書と、UDPipeのjapanese-gsdモデルが読めるようにした。これをさらにChamame2UD.pyと機能統合して、手元に辞書がある場合はローカルで高速に、ない場合はWeb APIを叩くことで低速に、動作するよう書き直してみた。unidic2udというpython3モジュールとして、PyPIからリリースしたので、ぜひ使ってみてほしい。インストールは、とりあえずは

% pip3 install unidic2ud

一発でいけるはずである。使い方も簡単で、たとえば「笑顔で彼は座った」という文を、現代書き言葉UniDicで解析するなら

% python3
>>> import unidic2ud
>>> ja=unidic2ud.load("gendai")
>>> s=ja("笑顔で彼は座った")
>>> print(s)
# text = 笑顔で彼は座った
1    笑顔    笑顔    NOUN    名詞-普通名詞-一般    _    5    obl    _    SpaceAfter=No|Translit=エガオ
2    で    で    ADP    助詞-格助詞    _    1    case    _    SpaceAfter=No|Translit=デ
3    彼    彼    PRON    代名詞    _    5    nsubj    _    SpaceAfter=No|Translit=カレ
4    は    は    ADP    助詞-係助詞    _    3    case    _    SpaceAfter=No|Translit=ハ
5    座っ    座る    VERB    動詞-一般    _    0    root    _    SpaceAfter=No|Translit=スワッ
6    た    た    AUX    助動詞    _    5    aux    _    SpaceAfter=No|Translit=タ

で、OKである。使えるUniDicに関しては、オプション一覧を見てほしい。また、UniDicやUDPipeモデルのダウンロードに関しては

% python3 -m unidic2ud download.unidic gendai
% python3 -m unidic2ud download.udpipe japanese-gsd

というインターフェースを準備しておいたので、各辞書ごとに簡単にダウンロードできるはずだが、かなり時間がかかるのが難点だ。ちなみに、必要なUniDicを手元にダウンロードしておいた場合は、MeCabインターフェースもダイレクトに使えるよう実装したので、たとえば

% python3
>>> import unidic2ud
>>> ja=unidic2ud.load("gendai")
>>> m=ja.mecab("笑顔で彼は座った")
>>> print(m)
笑顔    名詞,普通名詞,一般,,,,エガオ,笑顔,笑顔,エガオ,笑顔,エガオ,和,,,,,,,体,エガオ,エガオ,エガオ,エガオ,1,C1,,1028326907060736,3741
で    助詞,格助詞,,,,,デ,で,で,デ,で,デ,和,,,,,,,格助,デ,デ,デ,デ,,動詞%F2@0,名詞%F1,,7014343053025792,25518
彼    代名詞,,,,,,カレ,彼,彼,カレ,彼,カレ,和,,,,,,,体,カレ,カレ,カレ,カレ,1,,,2014863681528320,7330
は    助詞,係助詞,,,,,ハ,は,は,ワ,は,ワ,和,,,,,,,係助,ハ,ハ,ハ,ハ,,動詞%F2@0,名詞%F1,形容詞%F2@-1,,8059703733133824,29321
座っ    動詞,一般,,,五段-ラ行,連用形-促音便,スワル,座る,座っ,スワッ,座る,スワル,和,,,,,,,用,スワッ,スワル,スワッ,スワル,0,C2,,5377170306376324,19562
た    助動詞,,,,助動詞-タ,終止形-一般,タ,た,た,タ,た,タ,和,,,,,,,助動,タ,タ,タ,タ,,動詞%F2@1,形容詞%F4@-2,,5948916285711019,21642
EOS

も可能になる。MeCabインターフェースでは、入力文から改行コードが剝ぎ取られる癖があるが、ぜひ試してみてほしい。

13985904 journal
人工知能

yasuokaの日記: 古典中国語(漢文)の形態素解析・係り受け解析のためのudkanbun

日記 by yasuoka

思うところあって、古典中国語(漢文)の形態素解析・係り受け解析をUniversal Dependenciesでおこなうpython3モジュールudkanbunを、PyPIからリリースした。UDPipe・MeCab用の言語モデルを、モジュールに含めておいたので

% pip3 install udkanbun

一発でインストールできるはずである。使い方も簡単で、たとえば「不入虎穴不得虎子」を形態素解析・係り受け解析するには

% python3
>>> import udkanbun
>>> lzh=udkanbun.load()
>>> s=lzh("不入虎穴不得虎子")
>>> print(s)
# text = 不入虎穴不得虎子
1    不    不    ADV    v,副詞,否定,無界    Polarity=Neg    2    advmod    _    Gloss=not|SpaceAfter=No
2    入    入    VERB    v,動詞,行為,移動    _    0    root    _    Gloss=enter|SpaceAfter=No
3    虎    虎    NOUN    n,名詞,主体,動物    _    4    nmod    _    Gloss=tiger|SpaceAfter=No
4    穴    穴    NOUN    n,名詞,固定物,地形    Case=Loc    2    obj    _    Gloss=cave|SpaceAfter=No
5    不    不    ADV    v,副詞,否定,無界    Polarity=Neg    6    advmod    _    Gloss=not|SpaceAfter=No
6    得    得    VERB    v,動詞,行為,得失    _    2    parataxis    _    Gloss=get|SpaceAfter=No
7    虎    虎    NOUN    n,名詞,主体,動物    _    8    nmod    _    Gloss=tiger|SpaceAfter=No
8    子    子    NOUN    n,名詞,人,関係    _    6    obj    _    Gloss=child|SpaceAfter=No

でOKである。なお、複数の文を一度に解析したい場合は

>>> s=lzh("孟子見梁惠王\n王曰\n叟不遠千里而來\n亦將有以利吾國乎")

という風に、改行コードで区切ってやれば大丈夫だ。私(安岡孝一)の共同研究班のページで、これまでバラバラに配布していたものを、エイヤっとひとまとめにしたので、ぜひ使ってみてほしい。

typodupeerror

未知のハックに一心不乱に取り組んだ結果、私は自然の法則を変えてしまった -- あるハッカー

読み込み中...