エンターテイメント!!

遊戯王好きのJavaエンジニアのブログ。バーニングソウルを会得する特訓中。

WordNetの試し実装

きっかけ

文章を解析するようになったけど、意味合い的に同じなのかチェックしたくなるだろうって思って、実装について調べた。

実装

build.gradle

group 'kuropaper'
version '1.0-SNAPSHOT'

apply plugin: 'java'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
    // https://mvnrepository.com/artifact/de.sciss/ws4j
    compile group: 'de.sciss', name: 'ws4j', version: '0.1.0'
}

resources

src/main/resoces 配下に、下記リンクのjawjaw.conf, similarity.confを置く。
たぶん、クラスパスが通っている箇所なら、どこでも大丈夫だと思う。

ws4j/config at master · Sciss/ws4j · GitHub

そんでもって、同じディレクトリにwnjpn-0.9.dbっていう辞書のDBファイルを置く。
中身は、Sqliteらしい。

http://compling.hss.ntu.edu.sg/wnja/data/1.1/wnjpn.db.gz

かなり大きなファイルなので、githubとかにあげるときは、要注意。

mainファイル

mainとなる実装。
とりあえず、下記をコピペ。

import edu.cmu.lti.jawjaw.JAWJAW;
import edu.cmu.lti.jawjaw.pobj.*;
import java.util.Set;

public class Sample {
    public static void main(String[] args) {
        // "買収"(動詞)という単語から得られる関係の一部をデモします
        new Sample().run( "買収", POS.v );
    }

    private void run( String word, POS pos ) {
        // ファサードから日本語 WordNet にアクセス
        Set<String> hypernyms = JAWJAW.findHypernyms(word, pos);
        Set<String> hyponyms = JAWJAW.findHyponyms(word, pos);
        Set<String> consequents = JAWJAW.findEntailments(word, pos);
        Set<String> translations = JAWJAW.findTranslations(word, pos);
        Set<String> definitions = JAWJAW.findDefinitions(word, pos);
        // 結果表示
        System.out.println( "hypernyms of "+word+" : \t"+ hypernyms );
        System.out.println( "hyponyms of "+word+" : \t"+ hyponyms );
        System.out.println( word+" entails : \t\t"+ consequents );
        System.out.println( "translations of "+word+" : \t"+ translations );
        System.out.println( "definitions of "+word+" : \t"+ definitions );
    }
}

思ったこと

似たような文言を取ってこれる。
うまく使えば、文章の近似性を求められそうな気がする。

不満点は、初期化処理に10秒くらい時間がかかること。。。
どうにかならんもんかね?
SqliteのDBファイルをメモリ展開しているみたいだが、毎回DBアクセスだと遅いのだろうか?

実装にかなり疑問がある。

あまり、偉そうなことは言えないが。。。

実運用にするようになったら、考えよう。。。

参考サイト

日本語WordnetのJavaフロントエンドを利用して,類義語の検索を行った. - へっぽこ修士の忘れ物

WordNetをJavaから使う | Apitore blog

日本語 Wordnet

【愚痴】資格試験が終わった

今日は、情報処理試験だった。
受けたのは、データベーススペシャリスト

受験しての感想は、玉砕ですわ。。。

午前免除の期間が過ぎたので、午前1から受けたけど、難易度高すぎないか?
過去問やっているけど、過去問のレベルとは明らかに違う問題がある。
クロック精度って、どうやって計算したらいいねんって思いましたよ...
この試験考えたやつはクソ野郎だと思いました。

午前2は、過去問解いてればある程度できる。
知らない問題は、ほとんどなかった。

午後問は、お察しですね。。。

当初の予定だった、30代での高度試験合格は叶いませんでしたな。。。
もう、お終いだ~。このままオシマイダーになりたい。
そして、キュアアンジェに浄化してもらいたい。

今後の試験予定

とりあえず、ネットワークスペシャリストかな、次は。
あと、日商簿記

日商簿記は、全然業務と関係ないけど、株をやるようになって欲しいと思うようになった。
企業の財務諸表を読み解くのに、勉強が必要で、その力が付いたか判定するのに日商簿記で実力だめししたくなった。

あと、最近思うのだが、弁護士試験って俺でも取れそうな気がしてきたのだが、気のせいだろうか?

Typescriptの型とデータ構造で相当悩んだ話

きっかけ

くだらないことで相当悩んでしまったので、戒めのためにのせる

内容の詳細

どういったことが起きたかと言うと、HTTPでデータの受け渡しをする際に、データ構造を間違えて渡しているのになかなか気づけず、1日近い時間を無駄にしてしまった。。。

簡易的な例

似たような事が、下記のような内容。
本当は、test.a の内容を表示したいのだが、実際は、undefinend。
なぜ違うんだ?ってかなり悩んだ。

class Test {

  main(): void {
    const args = { test: { a: 3 } };
    new Sub().execute(args);
  }
}

class Sub {

  execute(test: any): void {
    console.log(test.a)
  }
}

new Test().main()

マジで恥ずかしいぜ。。。

どうすれば良かったのか

デバックとかも、同じ名前だったので、ちゃんとあるじゃンって思ってしまいました。
目がイカれているのでしょうね。。

個人的に考えた結果、やっぱり、any型を消すことだろうな。
必ずなくせばいいってわけでもないが、なるべく消したほうが無難でしょうね。

でも、それでも発生するよな。。。
実行時に型の情報が消えるから、実行時に予想してないデータ構造になると、アウトですわ。。。
とくに結合が疎になるネットワーク越しは、発生しやすいでしょうね。

なので、ネットワーク越しでデータがうまく連携できなかったら、渡せてないと一緒に、構造がおかしいっていう選択肢を入れて考えないとイケないですな。。。

構文はある程度解析できたが。。。

suzaku-tec.hatenadiary.jp

ある程度

ある程度、文章の構造の解析には成功したが、意味解析が全然できてない。。。

だから、並列関係にあるんだろう~というのは見分けられたのだが、それが概念的に同じ分類なのか、形態素解析からは判断できない。。。

調べた結果

なんとか意味解析できないか調べたら、いくつかあった。

どうも、やりたきことを実現するには、「シソーラス」ってやつらしい。
シソーラスって言われると、weblioの時点を思いつくんだが、そういうことなのだろうか?

類語辞典・シソーラス・対義語 - Weblio辞書

国立国語研究所の分類語彙表やNICTの日本語 WordNetがあるらしい。
日本語 WordNetについて調べたが、使えそうな気がする。
どうも人手でメンテしているようだが、アップデートが滞ってないかだけ心配。。。

あとで試す。

参考サイト

自然言語処理用語と解析器まとめ - Qiita

【API】日本語WordNetの全内容にアクセスできるWebAPIを公開した | Apitore blog

日本語 Wordnet

GitHubにプッシュするようになって思ったこと

注意

これはただの感想の羅列なので、真実かどうかは別問題です。

感想

ソース書く時間って、時間に縛られた働き方をしていると、まったくできない。

この時間は会社にいなければならないっていう制約があると、セキュリティ的にGitHubのソースも修正したりできない。
暇な時間ができても、ただ待つしかできないのがもどかしい。
暇なときにハッと思いつくことがたまにあるのだが、即座に反映ができない。
家に返ってからやろうとするけど、大抵は忘れている。。。

特に、即座に試して発想を昇華できないので、損をしている気がしなくもない。
時間の消費も、もったいなく感じる。

そうなると、自然と個人のソースを書く時間は、土日などの休みになってしまう。
多種多様な働き方は、プログラマーにこそ必要ではなかろうかって思い始めた。

jshellを使いたくなった瞬間と正規表現

きっかけ

こういうときに使いたいって思ったので、記録として残しておこうかと。

詳細

文字列分割を試みたのだが、予期した状況と違っていた。

いちいち確認用のクラスを作るのは面倒くさかったので、この際、jshell使ってみるとかと思い使った。

やりたかったことは、"遅く起きた。だから、授業に遅刻した。" っていう文を、 文字含んだ状態での分割がしたかった。

まずは、初期の実装。

"遅く起きた。だから、授業に 遅刻した。".split("。")

これだと、結果は、["遅く起きた", "だから、授業に 遅刻した"] になって、予期した結果と違った。 いろいろ調べた結果、後読みってのが使えればいいという結論に至った。

"遅く起きた。だから、授業に 遅刻した。".split("(?<=。)")

これで、["遅く起きた。", "だから、授業に 遅刻した。"] にできた。

結論

  • 正規表現は面倒くさい
  • 使って知識を得るものに対してjshellは有効

言葉の説明が難しいものが世の中にはあって、それを試すのにjshllは有効そう。
それが顕著にでるのが、正規表現な気がしますわ。

正規表現がやりたいことを満たしているのか、実行してみないと分からないからな。。。
サンプル見るけど、本当に理解したのとあっているか、実行してみないと分からない。

正規表現って、もっと簡単に覚えられないものなのか?
使っていると、知識が足りないとかなり苦労する。

参考サイト

正規表現の先読み・後読みを極める! - あらびき日記

[JAVA] 文字列を区切って区切り文字も含める | ぷすぅ~ぷすぅ~

[コラム] 正規表現の先読み/後読みは、どう考えても名前が悪いので、呼称禁止令を出してルックと気軽に呼んでみませんか。 - Qiita

修飾語と被修飾語で、1日ずっと神経をすり減らした。。。

前回記事

suzaku-tec.hatenadiary.jp

連体修飾語と連用修飾語

連体修飾語と連用修飾語の振り分けにかなり苦戦した。。。

主語、述語は分けられたけど、連体修飾語と連用修飾語が難しい。。。

主語や述語の前にあるのが修飾語でしょって安易に考えてたけど、かなり痛い目にあった。

格助詞

キーは、格助詞。

格助詞で「を・に・へ・で」が来れば、格助詞決定。
あとは、主語、述語以外で、活用のあり/なしで連体修飾語と連用修飾語を決めた。

見分け方でかなり悩んだ。。。
土曜の朝から日が変わる直前まで悩んでた。
TDDで開発してるんやけど、全部テストクリアすると、マジで気持ちいい。

強制修飾

これも結構悩んだ。

連体修飾語は、体言にしかかからないと思ったけど、例外もあるのが、かなり悩んだ。
逆も然り。連用修飾語も用言以外にかかることがある。

自分の実装は、読点がある文節があれば、今まで修飾させることができなかった修飾語は、強制的に修飾させている。
なぜそうしたかというと、さすがに読点をまたいで修飾関係になるような文は、文として成り立っていないと思ったから。
いろいろ考えたけど、読点またいだ修飾関係の文を考えることはできなかったわ。。。

実はありますってのがあれば、教えて欲しいものだね。

参考サイト

修飾語について学ぼう - 国語の文法(口語文法)

品詞の分類をマスターしよう - 国語の文法(口語文法)

格助詞の覚え方 | 国語の先生が教える国語文法

日本語勉強してみての感想

日本語って、助詞・助動詞の力がかなり強い。
もちろん、動詞・形容動詞・副詞なども重要だけど、英語を勉強したときには助詞ってあんまり意識したことはなかった。
日本語をより探求するには、助詞を理解することが大切な気がする。

あと、品詞を見分ける力が超重要。
品詞の情報を見て、どれがどういう関係になるのか、かなり悩んだわ。。。

次回タスク

  • 指示語の情報付与
  • 命令系・過去形・断定などの文章の特徴情報の付与
  • 文同士の関係情報の付与
  • デバック用の情報出力機能の実装

愚痴

かなりストレス溜まったわ。。。
考えても考えても、理詰めできない感じがして、ものすごいツライ。。。
日本語の文節の説明って、システムチックな説明じゃないのが、腹立たしい。
よくあるのが、意味が通る/通らないで判別ってのが、マジで意味不明だった。
システム的に、こうだから、これは適用されず、この条件の文節に適用されるって感じで説明してくれないと、システム化できへんねん。。。

そう考えると、人間の考える能力って素晴らしいと感じますわ。

おかげで、情報処理の資格試験の勉強、まったく未着手状態。。。

ストレス解消

もう、ものすごいストレスを溜めた気がする。
ストレス解消のために、ToLOVEるのデジタルカラー版を買ったので、これから読みますわ。

github

GitHub - suzaku-tec/kuropaper