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

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

14993221 journal
Google

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

日記 by yasuoka

私(安岡孝一)の10月25日の日記の読者から、AllenNLPの英語係り受けモデルはbiaffine-dependency-parser-ptb-2020.04.06.tar.gzよりbiaffine-dependency-parser-ptb-2020.04.01.tar.gzの方が性能がいい、との情報をいただいた。早速、Google Colaboratoryで動かしてみよう。

!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.01.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)
deplacy.serve(doc,port=None)

「I saw a horse yesterday which had no name.」を係り受け解析してみたところ、私の手元では以下の結果になった。

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

1    I    _    PRON    PRON    _    2    nsubj    _    _
2    saw    _    VERB    VERB    _    0    root    _    _
3    a    _    DET    DET    _    4    det    _    _
4    horse    _    NOUN    NOUN    _    6    nsubj    _    _
5    yesterday    _    NOUN    NOUN    _    2    tmod    _    _
6    which    _    DET    DET    _    7    aux    _    _
7    had    _    AUX    AUX    _    2    ccomp    _    _
8    no    _    DET    DET    _    9    advmod    _    _
9    name    _    NOUN    NOUN    _    7    dobj    _    _
10    .    _    PUNCT    PUNCT    _    2    punct    _    _

SVGで可視化すると、こんな感じ。正直に言って、あまり読めてない。まあ、AllenNLPを使った英語の係り受け解析なら、Camphr-Udifyの方が性能がいいので、そっちを使うべきかな。

14992057 journal
日記

yasuokaの日記: JIS X 0221:2020の附属書JAと附属書JB

日記 by yasuoka

JIS X 0221が本日(11月20日)付けで、無事、改正されたとの連絡をいただいた。今回の改正は、ISO/IEC 10646:2017およびAmendments 1&2:2019に対応するためのものだが、附属書JAに手が入った上に、附属書JBが追加されている。附属書JA(参考)は「日本文字関連部分集合用図形文字の組」で

  • BASIC JAPANESE
  • JIS2004 IDEOGRAPHICS EXTENSION
  • JAPANESE IDEOGRAPHICS SUPPLEMENT
  • JAPANESE CORE KANJI
  • MOJI-JOHO-KIBAN IDEOGRAPHS-2016
  • JAPANESE NON IDEOGRAPHICS EXTENSION
  • COMMON JAPANESE

の7つの組と

  • JAPANESE NON IDEOGRAPHICS SUPPLEMENT

が示されている。JIS X 0221:2014に比べると、「JAPANESE CORE KANJI」と「MOJI-JOHO-KIBAN IDEOGRAPHS-2016」が増えているので、参照の際には注意されたい。

附属書JB(参考)は「元号“令和”の合字」で、U+32FF「㋿」SQUARE ERA NAME REIWAを追加している。ただし、附属書JAの「COMMON JAPANESE」には、U+32FFは追加されていない。色々ヤヤコシイ点があって、このあたりは必ずしも整合性が取れていないので、こちらも関係諸氏は注意されたい。

14990230 journal
人工知能

yasuokaの日記: COMBO-pytorchのポーランド語係り受け解析をGoogle Colaboratoryで動かす

日記 by yasuoka

COMBO-pytorchのポーランド語モデルにHerBERTを適用してみた、との連絡をいただいた。とりあえず、Google Colaboratoryでdeplacyに繫いでみよう。

!pip install 'deplacy>=1.8.3' COMBO@git+https://github.com/ipipan/combo
import combo.predict
nlp=combo.predict.SemanticMultitaskPredictor.from_pretrained("polish-herbert-large")
doc=nlp("Wcale nie chcemy zdobywać kosmosu, chcemy tylko rozszerzyć Ziemię do jego granic.")
import deplacy
deplacy.render(doc)
deplacy.serve(doc,port=None)

「Wcale nie chcemy zdobywać kosmosu, chcemy tylko rozszerzyć Ziemię do jego granic.」を係り受け解析してみたところ、私(安岡孝一)の手元では以下の結果になった。

Wcale      ADV   <══════╗         advmod
nie        PART  <════╗ ║         advmod:neg
chcemy     VERB  ═══╗═╝═╝═════╗═╗ root
zdobywać   VERB  ═╗<╝         ║ ║ xcomp
kosmosu    NOUN  <╝           ║ ║ obj
,          PUNCT <══════════╗ ║ ║ punct
chcemy     VERB  ═════════╗═╝<╝ ║ conj
tylko      PART  <══════╗ ║     ║ advmod:emph
rozszerzyć VERB  ═╗═══╗═╝<╝     ║ xcomp
Ziemię     PROPN <╝   ║         ║ obj
do         ADP   <══╗ ║         ║ case
jego       PRON  <╗ ║ ║         ║ nmod
granic     NOUN  ═╝═╝<╝         ║ obl
.          PUNCT <══════════════╝ punct

1    Wcale    wcale    ADV    adv    _    3    advmod    _    _
2    nie    nie    PART    part    Polarity=Neg    3    advmod:neg    _    _
3    chcemy    chcieć    VERB    fin:pl:pri:imperf    Aspect=Imp|Mood=Ind|Number=Plur|Person=1|Tense=Pres|VerbForm=Fin|Voice=Act    0    root    _    _
4    zdobywać    zdobywać    VERB    inf:imperf    Aspect=Imp|VerbForm=Inf|Voice=Act    3    xcomp    _    _
5    kosmosu    kosmos    NOUN    subst:sg:gen:m3    Animacy=Inan|Case=Gen|Gender=Masc|Number=Sing    4    obj    _    _
6    ,    ,    PUNCT    interp    PunctType=Comm    7    punct    _    _
7    chcemy    chcieć    VERB    fin:pl:pri:imperf    Aspect=Imp|Mood=Ind|Number=Plur|Person=1|Tense=Pres|VerbForm=Fin|Voice=Act    3    conj    _    _
8    tylko    tylko    PART    part    _    9    advmod:emph    _    _
9    rozszerzyć    rozszerzyć    VERB    inf:perf    Aspect=Perf|VerbForm=Inf|Voice=Act    7    xcomp    _    _
10    Ziemię    Ziemia    PROPN    subst:sg:acc:f    Case=Acc|Gender=Fem|Number=Sing    9    obj    _    _
11    do    do    ADP    prep:gen    AdpType=Prep    13    case    _    _
12    jego    on    PRON    ppron3:sg:gen:m3:ter:akc:npraep    Animacy=Inan|Case=Gen|Gender=Masc|Number=Sing|Person=3|PrepCase=Npr|PronType=Prs|Variant=Long    13    nmod    _    _
13    granic    granica    NOUN    subst:pl:gen:f    Case=Gen|Gender=Fem|Number=Plur    9    obl    _    _
14    .    .    PUNCT    interp    PunctType=Peri    3    punct    _    _

SVGで可視化すると、こんな感じ。ほぼ完璧だと思う。旧版のCOMBOと違い、ちゃんとトークナイザ(単語切り)も内蔵しているので、非常に使いやすくなっているのだが、ただ、インストールに時間がかかり過ぎる。サポートしている言語も、現時点ではチェコ語・英語・ドイツ語・ハンガリー語・ポーランド語・ロシア語の6つだけなので、もうちょっと言語数が増えてから、乗り換えようかな。

14987080 journal
人工知能

yasuokaの日記: Universal Dependencies 2.7がリリース

日記 by yasuoka

Universal Dependencies 2.7が無事にリリースされた、との連絡をいただいた。Universal Dependencies 2.7は、104の言語にまたがるツリーバンクで、多言語の係り受け解析に用いることができる。半年前のUniversal Dependencies 2.6と較べて、トゥピナンバ語・アクンツ語・アプリニャ語・ムンドゥルク語・ハーンサール語・ナーイーン語・ソウ語・マン島ゲール語・チュクチ語・古テュルク語・アラビア語南レヴァント方言・トルコドイツ語が増えており、ブラジルやイランの少数言語が追加されたのが特徴的である。また、アイスランド語については、98万語にのぼる係り受けコーパスが一気に追加されており、今後の係り受け解析エンジンの開発が楽しみだ。

ちなみに、私(安岡孝一)の率いるグループが製作中の古典中国語(漢文)ツリーバンクは、これまでの『孟子』『論語』『禮記』に加えて、『十八史略』を(一部)リリースした。ぜひ使ってみてほしい。

14986634 journal
人工知能

yasuokaの日記: オランダ語係り受け解析モジュールspaCy-Alpino仮リリース

日記 by yasuoka

一昨日昨日の日記で紹介したAlpinoだが、Universal Dependenciesへの変換をlassy2udに分担させた上でspaCyと繋ぎ、spaCy-Alpinoというpython3モジュールとして仮リリースした。ただ、Alpinoのインストールは非常に時間がかかるので、とりあえずはWebAPIも使えるようにしておいた。この結果、spaCy-Alpinoのインストールは簡単で

$ pip3 install spacy_alpino --user

一発でOKだ。ただ、Cygwinの場合は

$ pip3.7 install spacy_alpino --no-build-isolation

としてほしい。インストールがうまくいったら、昨日と同様「Toch houd ik ze vast, ondanks alles, omdat ik nog steeds aan de innerlijke goedheid van den mens geloof.」を係り受け解析してみよう。

$ python3
>>> import spacy_alpino
>>> nlp=spacy_alpino.load()
>>> doc=nlp("Toch houd ik ze vast, ondanks alles, omdat ik nog steeds aan de innerlijke goedheid van den mens geloof.")
>>> import deplacy
>>> deplacy.render(doc)
Toch       ADV   <══════════════════════╗         advmod
houd       VERB  ═╗═╗═╗═══════════════╗═╝═╗═╗═╗═╗ ROOT
ik         PRON   ║<╝ ║               ║   ║ ║ ║ ║ nsubj
ze         PRON   ║<══╝               ║   ║ ║ ║ ║ obj
vast       ADJ   <╝                   ║   ║ ║ ║ ║ compound:prt
,          PUNCT <════════════════════║═══╝ ║ ║ ║ punct
ondanks    ADP   <╗                   ║     ║ ║ ║ case
alles      PRON  ═╝<══════════════════║═════╝ ║ ║ obl
,          PUNCT <════════════════════║═══════╝ ║ punct
omdat      SCONJ <══════════════════╗ ║         ║ mark
ik         PRON  <════════════════╗ ║ ║         ║ nsubj
nog        ADV   <╗               ║ ║ ║         ║ advmod
steeds     ADV   ═╝<════════════╗ ║ ║ ║         ║ advmod
aan        ADP   <══════════╗   ║ ║ ║ ║         ║ case
de         DET   <════════╗ ║   ║ ║ ║ ║         ║ det
innerlijke ADJ   <══════╗ ║ ║   ║ ║ ║ ║         ║ amod
goedheid   NOUN  ═════╗═╝═╝═╝<╗ ║ ║ ║ ║         ║ obl
van        ADP   <══╗ ║       ║ ║ ║ ║ ║         ║ case
den        DET   <╗ ║ ║       ║ ║ ║ ║ ║         ║ det
mens       NOUN  ═╝═╝<╝       ║ ║ ║ ║ ║         ║ nmod
geloof     VERB  ═════════════╝═╝═╝═╝<╝         ║ advcl
.          PUNCT <══════════════════════════════╝ punct

とりあえず、うまくいっているようだ。なお、Google Colaboratoryにデモページも作っておいたので、そちらもぜひ試してほしい。

14985785 journal
人工知能

yasuokaの日記: Alpino+lassy2udのオランダ語係り受け解析をGoogle Colaboratoryで動かす

日記 by yasuoka

昨日の日記で紹介したAlpinoだが、Universal Dependenciesへの変換をlassy2udに分担させることにしてみた。とりあえず、Google Colaboratoryで動かしてみよう。

!sudo apt install xqilla
!test -f Alpino.tar.gz || curl -L https://www.let.rug.nl/vannoord/alp/Alpino/versions/binary/latest.tar.gz -o Alpino.tar.gz
!test -d Alpino || tar xzf Alpino.tar.gz
!test -d lassy2ud || git clone --depth=1 https://github.com/gossebouma/lassy2ud
!rm -f lassy2ud/[1-9]*.xml
!echo Toch houd ik ze vast, ondanks alles, omdat ik nog steeds aan de innerlijke goedheid van den mens geloof. | Alpino/Tokenization/tokenize.sh | Alpino/bin/Alpino -flag treebank lassy2ud end_hook=xml -parse
!( echo '<collection>' ; ls -v1 lassy2ud/[1-9]*.xml | sed 's?^lassy2ud/\(.*\)$?<doc href="\1"/>?' ; echo '</collection>' ) > lassy2ud/all.xml
!xqilla -v DIR all.xml -v LIB no -v MODE conll -v ENHANCED yes lassy2ud/universal_dependencies.xq

「Toch houd ik ze vast, ondanks alles, omdat ik nog steeds aan de innerlijke goedheid van den mens geloof.」を係り受け解析してみたところ、私(安岡孝一)の手元では以下の結果になった。

# source = 1.xml
# sent_id = 1
# text = Toch houd ik ze vast , ondanks alles , omdat ik nog steeds aan de innerlijke goedheid van den mens geloof .
1    Toch    toch    ADV    BW    _    2    advmod    2:advmod    _
2    houd    vast_houden    VERB    WW|pv|tgw|ev    Number=Sing|Tense=Pres|VerbForm=Fin    0    root    0:root    _
3    ik    ik    PRON    VNW|pers|pron|nomin|vol|1|ev    Case=Nom|Person=1|PronType=Prs    2    nsubj    2:nsubj    _
4    ze    ze    PRON    VNW|pers|pron|stan|red|3|mv    Person=3|PronType=Prs    2    obj    2:obj    _
5    vast    vast    ADJ    ADJ|vrij|basis|zonder    Degree=Pos    2    compound:prt    2:compound:prt    _
6    ,    ,    PUNCT    LET    _    2    punct    2:punct    _
7    ondanks    ondanks    ADP    VZ|init    _    8    case    8:case    _
8    alles    alles    PRON    VNW|onbep|pron|stan|vol|3o|ev    Person=3|PronType=Ind    2    obl    2:obl:ondanks    _
9    ,    ,    PUNCT    LET    _    2    punct    2:punct    _
10    omdat    omdat    SCONJ    VG|onder    _    21    mark    21:mark    _
11    ik    ik    PRON    VNW|pers|pron|nomin|vol|1|ev    Case=Nom|Person=1|PronType=Prs    21    nsubj    21:nsubj    _
12    nog    nog    ADV    BW    _    13    advmod    13:advmod    _
13    steeds    steeds    ADV    BW    _    21    advmod    21:advmod    _
14    aan    aan    ADP    VZ|init    _    17    case    17:case    _
15    de    de    DET    LID|bep|stan|rest    Definite=Def    17    det    17:det    _
16    innerlijke    innerlijk    ADJ    ADJ|prenom|basis|met-e|stan    Degree=Pos    17    amod    17:amod    _
17    goedheid    goedheid    NOUN    N|soort|ev|basis|zijd|stan    Gender=Com|Number=Sing    21    obl    21:obl:aan    _
18    van    van    ADP    VZ|init    _    20    case    20:case    _
19    den    de    DET    LID|bep|dat|evmo    Definite=Def    20    det    20:det    _
20    mens    mens    NOUN    N|soort|ev|basis|zijd|stan    Gender=Com|Number=Sing    17    nmod    17:nmod:van    _
21    geloof    geloven    VERB    WW|pv|tgw|ev    Number=Sing|Tense=Pres|VerbForm=Fin    2    advcl    2:advcl:omdat    _
22    .    .    PUNCT    LET    _    2    punct    2:punct    _

SVGで可視化すると、こんな感じ。分離動詞のvasthoudenも、ちゃんと「houd」=compound:prt⇒「vast」となっていて、非常に素晴らしい。さて、これ、どういうやり方でdeplacyに繋ごうかな。

14985116 journal
Google

yasuokaの日記: Alpinoのオランダ語係り受け解析をGoogle Colaboratoryで動かす

日記 by yasuoka

ネットサーフィンしていたところ、Alpinoというオランダ語係り受け解析エンジンを見つけた。Linux向けのバイナリも配布されているので、とりあえずGoogle Colaboratoryで動かしてみることにした。

!test -f Alpino.tar.gz || curl -L https://www.let.rug.nl/vannoord/alp/Alpino/versions/binary/latest.tar.gz -o Alpino.tar.gz
!test -d Alpino || tar xzf Alpino.tar.gz
!rm -f [1-9]*.xml [1-9]*.tab*
!echo Toch houd ik ze vast, ondanks alles, omdat ik nog steeds aan de innerlijke goedheid van den mens geloof. | Alpino/bin/Alpino -flag treebank . end_hook=xml -parse
!cat `ls -v [1-9]*.xml` /dev/null
!python2 Alpino/alpino2conll/tools/alpino2tab.py -c -f -p -r -t'\n' -w *.xml
!export ALPINO_HOME=Alpino ALPINO2CONLL_HOME=Alpino/alpino2conll ; for F in `ls -v *.tab` ; do python2 Alpino/alpino2conll/tools/tag.py -w2 -f $F ; cat $F'2' ; done

「Toch houd ik ze vast, ondanks alles, omdat ik nog steeds aan de innerlijke goedheid van den mens geloof.」を係り受け解析してみたところ、私(安岡孝一)の手元では以下の結果になった。

<?xml version="1.0" encoding="UTF-8"?>
<alpino_ds version="1.6">
  <parser build="Alpino-x86_64-linux-glibc2.5-git233-sicstus" date="2020-11-12T06:41" cats="3" skips="1" />
  <node begin="0" cat="top" end="19" id="0" rel="top">
    <node begin="7" conjtype="onder" end="8" frame="complementizer" his="robust_skip" id="1" lcat="--" lemma="omdat" pos="comp" postag="VG(onder)" pt="vg" rel="--" root="omdat" sense="omdat" word="omdat"/>
    <node begin="0" cat="du" end="19" id="2" rel="--">
      <node begin="0" cat="smain" end="7" id="3" rel="dp">
        <node begin="0" end="1" frame="adverb" his="normal" his_1="decap" his_1_1="normal" id="4" lcat="advp" lemma="toch" pos="adv" postag="BW()" pt="bw" rel="mod" root="toch" sense="toch" word="Toch"/>
        <node begin="1" end="2" frame="verb(hebben,sg1,nonp_pred_np)" his="normal" his_1="normal" id="5" infl="sg1" lcat="smain" lemma="houden" pos="verb" postag="WW(pv,tgw,ev)" pt="ww" pvagr="ev" pvtijd="tgw" rel="hd" root="houd" sc="nonp_pred_np" sense="houd" stype="declarative" tense="present" word="houd" wvorm="pv"/>
        <node begin="2" case="nom" def="def" end="3" frame="pronoun(nwh,fir,sg,de,nom,def)" gen="de" getal="ev" his="normal" his_1="normal" id="6" lcat="np" lemma="ik" naamval="nomin" num="sg" pdtype="pron" per="fir" persoon="1" pos="pron" postag="VNW(pers,pron,nomin,vol,1,ev)" pt="vnw" rel="su" rnum="sg" root="ik" sense="ik" status="vol" vwtype="pers" wh="nwh" word="ik"/>
        <node begin="3" case="both" def="def" end="4" frame="pronoun(nwh,thi,both,de,both,def,wkpro)" gen="de" getal="mv" his="normal" his_1="normal" id="7" lcat="np" lemma="ze" naamval="stan" num="both" pdtype="pron" per="thi" persoon="3" pos="pron" postag="VNW(pers,pron,stan,red,3,mv)" pt="vnw" rel="obj1" rnum="pl" root="ze" sense="ze" special="wkpro" status="red" vwtype="pers" wh="nwh" word="ze"/>
        <node aform="base" begin="4" buiging="zonder" end="5" frame="adjective(no_e(adv))" graad="basis" his="mistok" id="8" infl="no_e" lcat="ap" lemma="vast" pos="adj" positie="vrij" postag="ADJ(vrij,basis,zonder)" pt="adj" rel="predc" root="vast" sense="vast" vform="adj" word="vast,"/>
        <node begin="5" cat="pp" end="7" id="9" rel="mod">
          <node begin="5" end="6" frame="preposition(ondanks,[])" his="normal" his_1="normal" id="10" lcat="pp" lemma="ondanks" pos="prep" postag="VZ(init)" pt="vz" rel="hd" root="ondanks" sense="ondanks" vztype="init" word="ondanks"/>
          <node begin="6" end="7" frame="noun(het,mass,sg)" gen="het" getal="ev" his="mistok" id="11" lcat="np" lemma="alles" naamval="stan" num="sg" pdtype="pron" persoon="3o" pos="noun" postag="VNW(onbep,pron,stan,vol,3o,ev)" pt="vnw" rel="obj1" rnum="sg" root="alles" sense="alles" status="vol" vwtype="onbep" word="alles,"/>
        </node>
      </node>
      <node begin="8" case="nom" def="def" end="9" frame="pronoun(nwh,fir,sg,de,nom,def)" gen="de" getal="ev" his="normal" his_1="normal" id="12" lcat="np" lemma="ik" naamval="nomin" num="sg" pdtype="pron" per="fir" persoon="1" pos="pron" postag="VNW(pers,pron,nomin,vol,1,ev)" pt="vnw" rel="dp" rnum="sg" root="ik" sense="ik" status="vol" vwtype="pers" wh="nwh" word="ik"/>
      <node begin="9" cat="du" end="19" id="13" rel="dp">
        <node begin="9" cat="advp" end="11" id="14" rel="dp">
          <node begin="9" end="10" frame="modal_adverb" his="normal" his_1="normal" id="15" lcat="advp" lemma="nog" pos="adv" postag="BW()" pt="bw" rel="mod" root="nog" sc="modal" sense="nog" word="nog"/>
          <node begin="10" end="11" frame="adverb" his="normal" his_1="normal" id="16" lcat="advp" lemma="steeds" pos="adv" postag="BW()" pt="bw" rel="hd" root="steeds" sense="steeds" word="steeds"/>
        </node>
        <node begin="11" cat="pp" end="18" id="17" rel="dp">
          <node begin="11" end="12" frame="preposition(aan,[vooraf])" his="normal" his_1="normal" id="18" lcat="pp" lemma="aan" pos="prep" postag="VZ(init)" pt="vz" rel="hd" root="aan" sense="aan" vztype="init" word="aan"/>
          <node begin="12" cat="np" end="18" id="19" rel="obj1">
            <node begin="12" end="13" frame="determiner(de)" his="normal" his_1="normal" id="20" infl="de" lcat="detp" lemma="de" lwtype="bep" naamval="stan" npagr="rest" pos="det" postag="LID(bep,stan,rest)" pt="lid" rel="det" root="de" sense="de" word="de"/>
            <node aform="base" begin="13" buiging="met-e" end="14" frame="adjective(e)" graad="basis" his="normal" his_1="normal" id="21" infl="e" lcat="ap" lemma="innerlijk" naamval="stan" pos="adj" positie="prenom" postag="ADJ(prenom,basis,met-e,stan)" pt="adj" rel="mod" root="innerlijk" sense="innerlijk" vform="adj" word="innerlijke"/>
            <node begin="14" end="15" frame="noun(de,count,sg)" gen="de" genus="zijd" getal="ev" graad="basis" his="normal" his_1="normal" id="22" lcat="np" lemma="goedheid" naamval="stan" ntype="soort" num="sg" pos="noun" postag="N(soort,ev,basis,zijd,stan)" pt="n" rel="hd" rnum="sg" root="goedheid" sense="goedheid" word="goedheid"/>
            <node begin="15" cat="pp" end="18" id="23" rel="mod">
              <node begin="15" end="16" frame="preposition(van,[af,uit,vandaan,[af,aan]])" his="normal" his_1="normal" id="24" lcat="pp" lemma="van" pos="prep" postag="VZ(init)" pt="vz" rel="hd" root="van" sense="van" vztype="init" word="van"/>
              <node begin="16" cat="np" end="18" id="25" rel="obj1">
                <node begin="16" end="17" frame="determiner(den)" his="normal" his_1="variant" id="26" infl="den" lcat="detp" lemma="de" lwtype="bep" naamval="dat" npagr="evmo" pos="det" postag="LID(bep,dat,evmo)" pt="lid" rel="det" root="de" sense="de" word="den"/>
                <node begin="17" end="18" frame="noun(both,count,sg)" gen="both" genus="zijd" getal="ev" graad="basis" his="normal" his_1="normal" id="27" lcat="np" lemma="mens" naamval="stan" ntype="soort" num="sg" pos="noun" postag="N(soort,ev,basis,zijd,stan)" pt="n" rel="hd" rnum="sg" root="mens" sense="mens" word="mens"/>
              </node>
            </node>
          </node>
        </node>
        <node begin="18" end="19" frame="noun(het,count,sg)" gen="het" genus="onz" getal="ev" graad="basis" his="mistok" id="28" lcat="np" lemma="geloof" naamval="stan" ntype="soort" num="sg" pos="noun" postag="N(soort,ev,basis,onz,stan)" pt="n" rel="dp" rnum="sg" root="geloof" sense="geloof" word="geloof."/>
      </node>
    </node>
  </node>
  <sentence sentid="1">Toch houd ik ze vast, ondanks alles, omdat ik nog steeds aan de innerlijke goedheid van den mens geloof.</sentence>
  <comments>
    <comment>Q#1|Toch houd ik ze vast, ondanks alles, omdat ik nog steeds aan de innerlijke goedheid van den mens geloof.|1|4|-3.143097559099998</comment>
  </comments>
</alpino_ds>
converting 1.xml to 1.tab
retagging 1.tab to 1.tab2
['1', 'Toch', 'toch', 'adv', '2', 'mod', '_', '_\n']
['2', 'houd', 'houd', 'verb', '0', 'ROOT', '_', '_\n']
['3', 'ik', 'ik', 'pron', '2', 'su', '_', '_\n']
['4', 'ze', 'ze', 'pron', '2', 'obj1', '_', '_\n']
['5', 'vast,', 'vast', 'adj', '2', 'predc', '_', '_\n']
['6', 'ondanks', 'ondanks', 'prep', '2', 'mod', '_', '_\n']
['7', 'alles,', 'alles', 'noun', '6', 'obj1', '_', '_\n']
['8', 'omdat', 'omdat', 'comp', '0', 'ROOT', '_', '_\n']
['9', 'ik', 'ik', 'pron', '0', 'ROOT', '_', '_\n']
['10', 'nog', 'nog', 'adv', '11', 'mod', '_', '_\n']
['11', 'steeds', 'steeds', 'adv', '0', 'ROOT', '_', '_\n']
['12', 'aan', 'aan', 'prep', '0', 'ROOT', '_', '_\n']
['13', 'de', 'de', 'det', '15', 'det', '_', '_\n']
['14', 'innerlijke', 'innerlijk', 'adj', '15', 'mod', '_', '_\n']
['15', 'goedheid', 'goedheid', 'noun', '12', 'obj1', '_', '_\n']
['16', 'van', 'van', 'prep', '15', 'mod', '_', '_\n']
['17', 'den', 'de', 'det', '18', 'det', '_', '_\n']
['18', 'mens', 'mens', 'noun', '16', 'obj1', '_', '_\n']
['19', 'geloof.', 'geloof', 'noun', '0', 'ROOT', '_', '_\n']
['\n']
Parse string with Alpino
['[ @mwu Toch ]', '[ @mwu houd ]', '[ @mwu ik ]', '[ @mwu ze ]', '[ @mwu vast, ]', '[ @mwu ondanks ]', '[ @mwu alles, ]', '[ @mwu omdat ]', '[ @mwu ik ]', '[ @mwu nog ]', '[ @mwu steeds ]', '[ @mwu aan ]', '[ @mwu de ]', '[ @mwu innerlijke ]', '[ @mwu goedheid ]', '[ @mwu van ]', '[ @mwu den ]', '[ @mwu mens ]', '[ @mwu geloof. ]']
hdrug: process 374 on host 3524fa2f1272 (datime(2020,11,12,6,41,48))
[Toch houd ik ze vast, ondanks alles,][omdat][ik][nog steeds aan de innerlijke goedheid van den mens geloof.]
Q#1|Toch houd ik ze vast, ondanks alles, omdat ik nog steeds aan de innerlijke goedheid van den mens geloof.|1|4|-3.143097559099998
OUT:
top/top|top|top/hd|houd/[1,2]|[stype=declarative]:verb(hebben,sg1,nonp_pred_np)|1
steeds/[10,11]|[]:adverb|dp/dp|aan/[11,12]|[]:preposition(aan,[vooraf])|1
steeds/[10,11]|[]:adverb|dp/dp|geloof/[18,19]|[rnum=sg]:noun(het,count,sg)|1
steeds/[10,11]|[]:adverb|hd/mod|nog/[9,10]|[]:modal_adverb|1
aan/[11,12]|[]:preposition(aan,[vooraf])|hd/obj1|goedheid/[14,15]|[rnum=sg]:noun(de,count,sg)|1
ondanks/[5,6]|[]:preposition(ondanks,[])|hd/obj1|alles/[6,7]|[rnum=sg]:noun(het,mass,sg)|1
van/[15,16]|[]:preposition(van,[af,uit,vandaan,[af,aan]])|hd/obj1|mens/[17,18]|[rnum=sg]:noun(both,count,sg)|1
mens/[17,18]|[rnum=sg]:noun(both,count,sg)|hd/det|de/[16,17]|[]:determiner(den)|1
goedheid/[14,15]|[rnum=sg]:noun(de,count,sg)|hd/det|de/[12,13]|[]:determiner(de)|1
goedheid/[14,15]|[rnum=sg]:noun(de,count,sg)|hd/mod|innerlijk/[13,14]|[]:adjective(e)|1
goedheid/[14,15]|[rnum=sg]:noun(de,count,sg)|hd/mod|van/[15,16]|[]:preposition(van,[af,uit,vandaan,[af,aan]])|1
houd/[1,2]|[stype=declarative]:verb(hebben,sg1,nonp_pred_np)|-- / --|omdat/[7,8]|complementizer|1
houd/[1,2]|[stype=declarative]:verb(hebben,sg1,nonp_pred_np)|dp/dp|steeds/[10,11]|[]:adverb|1
houd/[1,2]|[stype=declarative]:verb(hebben,sg1,nonp_pred_np)|dp/dp|ik/[8,9]|[rnum=sg]:pronoun(nwh,fir,sg,de,nom,def)|1
houd/[1,2]|[stype=declarative]:verb(hebben,sg1,nonp_pred_np)|hd/mod|toch/[0,1]|[]:adverb|1
houd/[1,2]|[stype=declarative]:verb(hebben,sg1,nonp_pred_np)|hd/mod|ondanks/[5,6]|[]:preposition(ondanks,[])|1
houd/[1,2]|[stype=declarative]:verb(hebben,sg1,nonp_pred_np)|hd/obj1|ze/[3,4]|[rnum=pl]:pronoun(nwh,thi,both,de,both,def,wkpro)|1
houd/[1,2]|[stype=declarative]:verb(hebben,sg1,nonp_pred_np)|hd/predc|vast/[4,5]|[]:adjective(no_e(adv))|1
houd/[1,2]|[stype=declarative]:verb(hebben,sg1,nonp_pred_np)|hd/su|ik/[2,3]|[rnum=sg]:pronoun(nwh,fir,sg,de,nom,def)|1

** top/top|top|top/hd|houd/[1,2]|[stype=declarative]:verb(hebben,sg1,nonp_pred_np)|1
** steeds/[10,11]|[]:adverb|dp/dp|aan/[11,12]|[]:preposition(aan,[vooraf])|1
** steeds/[10,11]|[]:adverb|dp/dp|geloof/[18,19]|[rnum=sg]:noun(het,count,sg)|1
** steeds/[10,11]|[]:adverb|hd/mod|nog/[9,10]|[]:modal_adverb|1
** aan/[11,12]|[]:preposition(aan,[vooraf])|hd/obj1|goedheid/[14,15]|[rnum=sg]:noun(de,count,sg)|1
** ondanks/[5,6]|[]:preposition(ondanks,[])|hd/obj1|alles/[6,7]|[rnum=sg]:noun(het,mass,sg)|1
** van/[15,16]|[]:preposition(van,[af,uit,vandaan,[af,aan]])|hd/obj1|mens/[17,18]|[rnum=sg]:noun(both,count,sg)|1
** mens/[17,18]|[rnum=sg]:noun(both,count,sg)|hd/det|de/[16,17]|[]:determiner(den)|1
** goedheid/[14,15]|[rnum=sg]:noun(de,count,sg)|hd/det|de/[12,13]|[]:determiner(de)|1
** goedheid/[14,15]|[rnum=sg]:noun(de,count,sg)|hd/mod|innerlijk/[13,14]|[]:adjective(e)|1
** goedheid/[14,15]|[rnum=sg]:noun(de,count,sg)|hd/mod|van/[15,16]|[]:preposition(van,[af,uit,vandaan,[af,aan]])|1
** houd/[1,2]|[stype=declarative]:verb(hebben,sg1,nonp_pred_np)|-- / --|omdat/[7,8]|complementizer|1
** houd/[1,2]|[stype=declarative]:verb(hebben,sg1,nonp_pred_np)|dp/dp|steeds/[10,11]|[]:adverb|1
** houd/[1,2]|[stype=declarative]:verb(hebben,sg1,nonp_pred_np)|dp/dp|ik/[8,9]|[rnum=sg]:pronoun(nwh,fir,sg,de,nom,def)|1
** houd/[1,2]|[stype=declarative]:verb(hebben,sg1,nonp_pred_np)|hd/mod|toch/[0,1]|[]:adverb|1
** houd/[1,2]|[stype=declarative]:verb(hebben,sg1,nonp_pred_np)|hd/mod|ondanks/[5,6]|[]:preposition(ondanks,[])|1
** houd/[1,2]|[stype=declarative]:verb(hebben,sg1,nonp_pred_np)|hd/obj1|ze/[3,4]|[rnum=pl]:pronoun(nwh,thi,both,de,both,def,wkpro)|1
** houd/[1,2]|[stype=declarative]:verb(hebben,sg1,nonp_pred_np)|hd/predc|vast/[4,5]|[]:adjective(no_e(adv))|1
** houd/[1,2]|[stype=declarative]:verb(hebben,sg1,nonp_pred_np)|hd/su|ik/[2,3]|[rnum=sg]:pronoun(nwh,fir,sg,de,nom,def)|1
Traceback (most recent call last):
  File "Alpino/alpino2conll/tools/tag.py", line 661, in <module>
    retag(intabfn, outtabfn)
  File "Alpino/alpino2conll/tools/tag.py", line 68, in retag
    tmptags = parse.alpino(tokens, outtabfn+".parsed")
  File "/content/Alpino/alpino2conll/tools/alpino.py", line 52, in alpino
    output = triples2tab(output)
  File "/content/Alpino/alpino2conll/tools/alpino.py", line 82, in triples2tab
    row.append(split[1].split(",")[0]) # word index
IndexError: list index out of range
cat: 1.tab2: No such file or directory

うーむ、前半のxmlを出力するところと、その次のalpino2tab.pyまでは動いているのだが、最後のtag.pyがIndexErrorでコケている。ただ、このtag.pyはpython2で書かれているので、そもそも動かないのが当然なのかもしれない。困ったな。

14977272 journal
Google

yasuokaの日記: DiaParserの英語係り受け解析をGoogle Colaboratoryで動かす

日記 by yasuoka

一昨日の日記で紹介したDiaParserだが、単語切りモジュールを内蔵せずStanzaに頼っており、しかも作りがヘボい。なので、英語の係り受け解析に対しては、たとえばnltk.tokenizeを併用すべきだと思う。Google Colaboratoryで、nltk.tokenizeとDiaParserをdeplacyに繫いでみよう。

!pip install deplacy diaparser
import nltk
nltk.download("punkt")
from nltk.tokenize import word_tokenize
from diaparser.parsers import Parser
parser=Parser.load("en_ewt.electra-base")
nlp=lambda t:"\n".join([str(s) for s in parser.predict(data=word_tokenize(t),prob=True,text=None).sentences])
doc=nlp("I saw a horse yesterday which had no name.")
import deplacy
deplacy.render(doc,Japanese=True)
deplacy.serve(doc,port=None)

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

I         <══════════════╗   nsubj(主語)
saw       ═══════════╗═╗═╝═╗ root(親)
a         <════════╗ ║ ║   ║ det(決定詞)
horse     ═══════╗═╝<╝ ║   ║ obj(目的語)
yesterday <══════║═════╝   ║ obl:tmod(斜格補語[時])
which     <════╗ ║         ║ nsubj(主語)
had       ═══╗═╝<╝         ║ acl:relcl(連体修飾節[relcl])
no        <╗ ║             ║ det(決定詞)
name      ═╝<╝             ║ obj(目的語)
.         <════════════════╝ punct(句読点)

1    I    _    _    _    _    2    nsubj    _    _
2    saw    _    _    _    _    0    root    _    _
3    a    _    _    _    _    4    det    _    _
4    horse    _    _    _    _    2    obj    _    _
5    yesterday    _    _    _    _    2    obl:tmod    _    _
6    which    _    _    _    _    7    nsubj    _    _
7    had    _    _    _    _    4    acl:relcl    _    _
8    no    _    _    _    _    9    det    _    _
9    name    _    _    _    _    7    obj    _    _
10    .    _    _    _    _    2    punct    _    _

SVGで可視化すると、こんな感じ。係り受けの交差がちゃんと解析できていて非常に素晴らしいが、品詞が全て「???」になってしまうのはツライ。うーむ、単語切りと品詞付与を、何か良さげなモジュールに「外注」すべきかしら。

14976119 journal
人工知能

yasuokaの日記: DiaParserの日本語係り受け解析をGoogle Colaboratoryで動かす

日記 by yasuoka

ネットサーフィンしていたところ、DiaParserという係り受け解析ツールを見つけた。Transformers上で、22の言語の係り受け解析をおこなえるらしいが、品詞付与をおこなわずに、元の文に対してダイレクトに係り受け解析をおこなうようだ。とりあえず、DiaParserの日本語モデルを、Google Colaboratory上でdeplacyに繋いでみよう。

!pip install deplacy diaparser fugashi unidic-lite ipadic
from transformers.tokenization_bert_japanese import MecabTokenizer
tokenizer=MecabTokenizer(mecab_dic="unidic_lite")
from diaparser.parsers import Parser
parser=Parser.load("ja_gsd.mbert")
nlp=lambda t:"\n".join([str(s) for s in parser.predict(data=tokenizer.tokenize(t),prob=True,text=None).sentences])
doc=nlp("国境の長いトンネルを抜けると雪国であった。")
import deplacy
deplacy.render(doc,Japanese=True)
deplacy.serve(doc,port=None)

「国境の長いトンネルを抜けると雪国であった。」を係り受け解析してみたところ、私(安岡孝一)の手元では、以下の結果が得られた。

国境     ═╗<══╗         nmod(体言による連体修飾語)
の       <╝   ║         case(格表示)
長い     <══╗ ║         acl(連体修飾節)
トンネル ═╗═╝═╝<╗       obj(目的語)
を       <╝     ║       case(格表示)
抜ける   ═══════╝═╗<╗   acl(連体修飾節)
と       <════════╝ ║   mark(標識)
雪国     ═╗═╗═╗═════╝═╗ root(親)
で       <╝ ║ ║       ║ cop(繫辞)
あっ     <══╝ ║       ║ aux(動詞補助成分)
た       <════╝       ║ aux(動詞補助成分)
。       <════════════╝ punct(句読点)

1    国境    _    _    _    _    4    nmod    _    _
2    の    _    _    _    _    1    case    _    _
3    長い    _    _    _    _    4    acl    _    _
4    トンネル    _    _    _    _    6    obj    _    _
5    を    _    _    _    _    4    case    _    _
6    抜ける    _    _    _    _    8    acl    _    _
7    と    _    _    _    _    6    mark    _    _
8    雪国    _    _    _    _    0    root    _    _
9    で    _    _    _    _    8    cop    _    _
10    あっ    _    _    _    _    8    aux    _    _
11    た    _    _    _    _    8    aux    _    _
12    。    _    _    _    _    8    punct    _    _

SVGで可視化すると、こんな感じ。全単語の品詞が「???」になってしまうあたり、どうしたものかとは思うが、係り受けとしてはほぼ完璧なようだ。ただ、品詞情報が全く出てこないと、それはそれで使い勝手が悪い気もする。もうちょっと他の言語も調べてみないと、ダメかなぁ。

14975132 journal
政府

yasuokaの日記: 単独世帯死亡者のマイナンバー

日記 by yasuoka

死亡者のマイナンバー(個人番号)を、死亡後の行政手続にどのように反映させるか。3月12日付「申請に基づく行政手続における死亡者の個人番号の取扱い等について」で、一応の方針が内閣府大臣官房番号制度担当室から示されたものの、微妙にややこしいケースがあるので、ざっと私(安岡孝一)なりにまとめておこうと思う。

死亡者に家族(同一世帯)がいる場合は、実はそう難しい話ではなく、生前に本人からマイナンバーを聞き出しておくか、さもなくば住民票の除票を取得すればいい。問題は家族がいない場合(単独世帯)だ。相続人が本人からマイナンバーを聞き出せているなら、まあ、それを使えばいいのだが、聞き出せていない場合には、もはやマイナンバーを知る方法がない。となると、各種書類の個人番号欄を空欄にして提出してもらい、役場や年金事務所の方で住基ネットを叩いてマイナンバーを埋めることになるのだが、これがどうも現場では困っているらしい。

それがイキオイ余って、10月26日の厚生年金保険法施行規則改正や、本日(10月30日)の予防接種法施行規則改正へと、至ったわけである。ただ、相続人が死亡者のマイナンバーを書類に書かないからと言って、代わりに個人番号利用事務実施者が死亡者のマイナンバーを埋める、というだけのことだ。その手続には当然、死亡者のマイナンバーが使われる。使われるのに書く欄がない、というのは、それはそれでマズイ気がする。施行規則だけいじっても、そのあたりどうにもならない気がするのだが、さて、厚生労働省はどういう勝算があるんだろう?

typodupeerror

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

読み込み中...