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

yasuokaさんのトモダチの日記みんなの日記も見てね。 スラドのTwitterでストーリをフォローしよう。

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亦將有以利吾國乎")

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

13981776 journal
人工知能

yasuokaの日記: 英語係り受け解析エンジンとしてのspacy_udpipe

日記 by yasuoka

ネットサーフィンしていたところ、spacy_udpipeというpython3ライブラリを見つけたので、試してみることにした。UDPipeの各言語モデルをpythonでラップして、spaCyから使えるようにしたライブラリのようだ。まずはpip3とpython3でインストール。

% pip3 install spacy_udpipe
% python3
>>> import spacy_udpipe
>>> spacy_udpipe.download("en")
>>> quit()

あちこちから、色んなものをダウンロードしてくるので、かなり時間がかかるのだが、これで、UDPipeの英語english-partut-ud-2.4モデルが、python3から使えるようになったはずである。試しに「He sat down with smiling face」を係り受け解析してみよう。

% python3
>>> import spacy_udpipe
>>> en=spacy_udpipe.load("en")
>>> s=en("He sat down with smiling face")
>>> print("".join("\t".join([str(t.i+1),t.orth_,t.lemma_,t.pos_,t.tag_,"_",str(0 if t.head==t else t.head.i+1),t.dep_,"_","_" if t.whitespace_ else "SpaceAfter=No"])+"\n" for t in s))
1    He    he    PRON    PE    _    2    nsubj    _    _
2    sat    sat    VERB    V    _    0    ROOT    _    _
3    down    down    ADV    B    _    2    advmod    _    _
4    with    with    ADP    E    _    5    mark    _    _
5    smiling    smiling    VERB    V    _    2    advcl    _    _
6    face    face    NOUN    S    _    5    obj    _    SpaceAfter=No

「CoNLL-U SVG Editor」で可視化すると、こんな感じROOTが大文字なのを除いては、ちゃんとUniversal Dependencies準拠の係り受け解析がおこなえている。ただ、英語の形態素解析としては、LEMMA(第3フィールド)がちゃんと解析できておらず、たとえばsatが原形のsitになってないのが、私(安岡孝一)個人としては微妙に不満だ。spaCyのen_core_web_smモデルと較べると、まあ一長一短なのだが、さて、どっちを使うべきだろう。

13979957 journal
日本

yasuokaの日記: 大漢和番号14404は本当にU+2339Fなのか 2

日記 by yasuoka

大漢和番号14404「⿰月𡬶」を眺めていたのだが、何とも得体の知れない漢字だ。姓に使う漢字らしいのだが、私(安岡孝一)自身は実際の用例を見たことがない。この漢字が、戸籍統一文字162110を経由して、文字情報基盤MJ037911に収録されたのはいいのだが、そこでU+2339F「𣎟」と統合されてしまっている。ツクリが「𡬶」と「尋」で微妙に違っているのだが、本当に統合してしまっていいんだろうか。うーむ。

13976489 journal
人工知能

yasuokaの日記: 韓国語の係り受け解析エンジンとしてのStanfordNLP

日記 by yasuoka

一昨日の日記の続きだが、StanfordNLPでも、ko_gsdモデルを使った韓国語の係り受け解析がおこなえる。とりあえずpip3とpython3で、StanfordNLPとko_gsdモデルをインストールしよう。

% pip3 install stanfordnlp
% python3
>>> import stanfordnlp
>>> stanfordnlp.download("ko_gsd")
>>> quit()

色んなものを取ってくるので、かなりインストールに時間がかかるのだが、これでStanfordNLPのko_gsdモデルを使える。うまくいったら、一昨日と同じく「그래서 그들은 바다로 갔다.」を、係り受け解析してみよう。

% python3
>>> import stanfordnlp
>>> ko=stanfordnlp.Pipeline(lang="ko",treebank="ko_gsd")
>>> s=ko("그래서 그들은 바다로 갔다.")
>>> print(s.conll_file.conll_as_string())
1    그래서    그래서    ADV    MAJ    _    4    advmod    _    _
2    그들은    그+들+은    PRON    NP+XSN+JX    _    4    nsubj    _    _
3    바다로    바다+로    ADV    NNG+JKB    _    4    obl    _    _
4    갔다    가+았+다    VERB    VV+EP+EF    _    0    root    _    _
5    .    .    PUNCT    SF    _    4    punct    _    _

SVGで可視化すると、こんな感じUDPipeと性能的には大差ない気がするので、あとはインストールの手間をどう考えるかだろう。

13974819 journal
人工知能

yasuokaの日記: 韓国語の係り受け解析エンジンとしてのUDPipe

日記 by yasuoka

思うところあって、韓国語の係り受け解析をUDPipeで試してみた。現時点のUDPipeには、韓国語向けにKorean-KaistとKorean-GSDの2つのモデルがあるのだが、私(安岡孝一)個人の感触としてはKorean-GSDの方が肌に合っている気がする。7月3日の日記で書いた「Chamame2UD.py」を使いまわして、試しに「그래서 그들은 바다로 갔다.」を係り受け解析してみよう。

% python -i Chamame2UD.py
>>> ko=UDPipe2UD("korean-gsd")
>>> s=ko("그래서 그들은 바다로 갔다.")
>>> s.browse()
>>> print(s)
# newdoc
# newpar
# sent_id = 1
# text = 그래서 그들은 바다로 갔다.
1    그래서    그래서    ADV    MAJ    _    4    advmod    _    _
2    그들은    그+들+은    PRON    NP+XSN+JX    _    4    nsubj    _    _
3    바다로    바다+로    ADV    NNG+JKB    _    4    obl    _    _
4    갔다    가+았+다    VERB    VV+EP+EF    _    0    root    _    SpaceAfter=No
5    .    .    PUNCT    SF    _    4    punct    _    SpaceAfter=No

うまくいけば、こんな感じのブラウザが立ち上がってくるはずだ。ただ、ヤヤコシイのは、XPOS(第5フィールド)が、Sejong Corporaの品詞タグを組み合わせたものになっている点だ。NP+XSN+JXは[pronoun]+[suffix (noun-derived)]+[particle (discourse)]に、NNG+JKBは[common noun]+[case marker (adverbial)]に、VV+EP+EFは[verb]+[ending (prefinal)]+[ending (final)]に、それぞれ頭の中で読み替えなきゃならない。このあたり、できればFEATS(第6フィールド)に反映させるべきだと思うのだけど、勝手にやったらマズイかなぁ。

13973452 journal
日記

yasuokaの日記: Z80における定数10の除算は、いったいどこまで速くなるのか 18

日記 by yasuoka

昨日の日記で書いた「Z80で、Bレジスタに0~99の整数が入っている時に、10で除算した商をHレジスタに、余りをAレジスタに返す」という問題だが、51/512≒1/10で商を先に求める方法において、上位4ビットと下位4ビットを逆転する、という途方もないアイデアをいただいた。ちょっと書いてみよう。

78      LD A,B
C6 20  ADD 20H
80     ADD B
80     ADD B
1F     RRA
4F      LD C,A
0F    RRCA
0F    RRCA
0F    RRCA
0F    RRCA
81     ADD C
3F     CCF
99     SBC C
E6 0F  AND 0FH
67      LD H,A
87     ADD A
87     ADD A
84     ADD H
2F     CPL
07    RLCA
88     ADC B

私(安岡孝一)自身、かなり興奮してしまって、うまく書けてるのかどうか自信がないのだが、ざっと23バイト90ステート。51/512は1/10より少し小さいので、ごらんの通り(B×51+32)/512で書いている。すごいなぁ、いったいどこまで速くなるんだろう。

13973095 journal
日記

yasuokaの日記: Re:Z80における定数10の除算は、商と余りのどちらを先に求めるべきか 2

日記 by yasuoka

一昨日の日記で書いた「Z80で、Bレジスタに0~99の整数が入っている時に、10で除算した商をHレジスタに、余りをAレジスタに返す」という問題だが、余りをDAAで先に求めて、その後に商を求める方法を、改良できてしまった。

78      LD A,B
0F    RRCA
0F    RRCA
0F    RRCA
27     DAA
87     ADD A
27     DAA
4F      LD C,A
78      LD A,B
E6 07  AND 07H
91     SUB C
27     DAA
E6 0F  AND 0FH
4F      LD C,A
90     SUB B
67      LD H,A
0F    RRCA
84     ADD H
E6 0F  AND 0FH
67      LD H,A
79      LD A,C

商を求める部分の演算順序を、微妙に入れ換えただけなのだが、24バイト93ステートといったところだろうか。さすがに私(安岡孝一)個人としては、このあたりが限界な気がするのだが、まだトンデモないアイデアが残されているかしら。

13970972 journal
日記

yasuokaの日記: Z80における定数10の除算は、商と余りのどちらを先に求めるべきか 5

日記 by yasuoka

ここ数日の日記(これこれこれ)で、Z80で100未満の数値を10で除算処理するというのに挑戦してみた。Bレジスタに0~99の整数が入っている時に、10で除算した商をHレジスタに、余りをAレジスタに返す、という問題なのだが、ここまでに私(安岡孝一)が検討した結果を、とりあえず、まとめておこうと思う。まずは、商を51/512で求めて、その後に余りを求める手法。

78      LD A,B
0F    RRCA
0F    RRCA
0F    RRCA
0F    RRCA
E6 0F  AND 0FH
3C     INC A
80     ADD B
4F      LD C,A
81     ADD C
81     ADD C
17     RLA
17     RLA
17     RLA
17     RLA
E6 0F  AND 0FH
67      LD H,A
87     ADD A
87     ADD A
84     ADD H
2F     CPL
07    RLCA
88     ADC B

25バイト98ステート、といったところだろうか。私個人としては、まずまずの速さだと思う。一方、余りをDAAで先に求めて、その後に商を求める方法。

78      LD A,B
0F    RRCA
0F    RRCA
0F    RRCA
27     DAA
87     ADD A
27     DAA
4F      LD C,A
78      LD A,B
E6 07  AND 07H
91     SUB C
27     DAA
E6 0F  AND 0FH
4F      LD C,A
78      LD A,B
91     SUB C
67      LD H,A
0F    RRCA
94     SUB H
94     SUB H
E6 0F  AND 0FH
67      LD H,A
79      LD A,C

26バイト101ステート、といったところだろうか。計算間違いでなければ、商を先に求める方が、ほんの少し早い気がする。ただ、この程度の差だと、ほんのひとチューニングで簡単にひっくり返る。何か、いいアイデア、ないかなぁ。

13969593 journal
日記

yasuokaの日記: Z80における定数10の除算の改良 1

日記 by yasuoka

昨日の日記で、Z80で100未満の数値を10で除算処理するというのに挑戦してみたのだが、よくよく考えてみたら、余りを先に計算する方が早い気がしてきた。Bレジスタに0~99の整数が入っている時に、10で除算した商をHレジスタに、余りをAレジスタに返す、という問題なのだが、DAAを駆使すれば楽に余りが求まる。

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

Bレジスタに入っている0~99の整数を、下位3ビットと上位4ビットに分けて、下位3ビットはそのまま、上位4ビットは-1/4倍(∵8-10=-2)しつつDAAで10の剰余を求め、合計をもう一度DAAしたわけである。これでAレジスタに余りが求まる。続いて、商を求めよう。

4F      LD C,A
78      LD A,B
91     SUB C
67      LD H,A
0F    RRCA
94     SUB H
94     SUB H
E6 0F  AND 0FH
67      LD H,A
79      LD A,C

Bレジスタから余りを引けば、得られる値は全て10の倍数になる。10=8+2をうまく使えば、商の計算は基本的にビット操作に落とせる。これでHレジスタに商が求まる。Aレジスタに余りを返す、という条件もちゃんと満たしてあるので、これで完璧だと思う。

ちなみにDAAを駆使すれば、10で割った商と余りを同時に計算できる方法もあるのだが、Aレジスタの上位4ビットが商に、下位4ビットが余りになってしまう。商をHレジスタに移すのが手間そうなので、あまり詳細を詰めていないのだが、うーん、これだと少し遅いかな。

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
4F      LD C,A
0F    RRCA
0F    RRCA
0F    RRCA
0F    RRCA
E6 0F  AND 0FH
67      LD H,A
79      LD A,C
E6 0F  AND 0FH

13969194 journal
日記

yasuokaの日記: Re:Z80における定数10の除算 1

日記 by yasuoka

昨日の日記で、Z80で100未満の数値を10で除算処理するというのに挑戦してみたのだが、見事にバグってしまった。Bレジスタに0~99の整数が入っている時に、10で除算した商をHレジスタに、余りをAレジスタに返す、という問題なのだが、1/10≒103/1024で商を求めるべく、再挑戦しようと思う。

78      LD A,B
2F     CPL
0F    RRCA
0F    RRCA
0F    RRCA
F6 E0   OR E0H
80     ADD B
0F    RRCA
0F    RRCA
E6 3F  AND 3FH
80     ADD B
80     ADD B
80     ADD B
17     RLA
17     RLA
17     RLA
17     RLA
E6 0F  AND 0FH
67      LD H,A

これで、今度こそHレジスタに商が求まるはずなので、あとは10倍してBレジスタから引けば、余りが求まる。

AF     XOR A
94     SUB H
87     ADD A
87     ADD A
94     SUB H
87     ADD A
80     ADD B

ただ、103/1024は、正直なところスジが良くない。何とかもう少し、手を抜く方法がないかなぁ。

typodupeerror

「科学者は100%安全だと保証できないものは動かしてはならない」、科学者「えっ」、プログラマ「えっ」

読み込み中...