LoginSignup
13
12

More than 5 years have passed since last update.

[Groovy]文章を解析して日本語を学びかけの宇宙人のようにする。

Last updated at Posted at 2016-10-20

概要

現在31歳のおじさんである私の年代では、子供の頃に、○○ ウソ ツカナイというように文章をカタカナにして必要最低限な部分のみ使う、というような遊び(?)がありました。
○○の部分は現在ではもしかしたら問題のある表現かも知れませんので、ココでは宇宙人とします。
とうことで、文章を解析して必要最低限な部分のみ抽出して、それっぽくなるように各単語をシャッフルして、さらにそれっぽくカタカナのみ利用する、というスクリプトをGroovyで記述しました。

こんなスクリプトが、手動での外部ライブラリのダウンロード、設定や、ビルドツールを使ったコンパイル&実行を 必要とせず、さらにコレだけ 短いコードで実現できてしまうApache Groovyは本当に素晴らしい言語ですね!

コード

@Grapes([
    @Grab(group='com.atilika.kuromoji', module='kuromoji-ipadic', version='0.9.0')
])

import com.atilika.kuromoji.ipadic.Token
import com.atilika.kuromoji.ipadic.Tokenizer

Tokenizer tokenizer = new Tokenizer()

// 読み(カタカナ)の抽出
// 動詞の分割がちょっと微妙なので本当は動詞の場合はさらにbaseFormからゴニョゴニョしたい
def toReading = { Token token ->
    token.reading == '*' ? token.surface : token.reading
}

// 必要な種類の単語のみ抽出
def withThisCondition = { Token token ->
    token.partOfSpeechLevel1 in ['動詞', '名詞', '助動詞', '副詞', '形容詞']
}

// 別に態々メタクラスに追加する必要は無いけどカッコいいので!
// (今回のような場合はmetaClassに直接じゃなくてCategoryクラスでやった方がいいけど)
List.metaClass.shuffle = {
    List<Token> list = delegate
    Token first = list.find{Token t -> t.partOfSpeechLevel1 == '名詞'}
    List<Token> remains = list.findAll{it != first}
    Collections.shuffle(remains)
    [first] + remains
}

// 解析&翻訳(?)
List<Token>tokens = tokenizer.tokenize("プログラミング言語Apache Groovyは本当に素晴らしいプログラミング言語です")
println tokens.findAll(withThisCondition).shuffle().collect(toReading).unique().join(" ")

たったコレだけのコードです。
実行結果は毎回ランダムに変わります。例えば今回のサンプルでは
"プログラミング言語Apache Groovyは本当に素晴らしいプログラミング言語です"
を解析して、その結果は、

プログラミング ゲンゴ デス Groovy スバラシイ Apache ホントウニ

のようになります。
とてもそれっぽい!

吾輩は猫である、の冒頭も試してみます。

List<String> values = [
    "吾輩は猫である。",
    "名前はまだ無い。",
    "どこで生れたかとんと見当がつかぬ。",
    "何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。",
    "吾輩はここで始めて人間というものを見た。",
    "しかもあとで聞くとそれは書生という人間中で一番獰悪な種族であったそうだ。"
]

values.each { String line ->
    println tokenizer.tokenize(line).findAll(withThisCondition).shuffle().collect(toReading).unique().join(" ")
}

結果は

ワガハイ ネコ アル デ
ナマエ マダ ナイ
ドコ トウ ツカ ヌ ケン タ ケントウ ウマレ トント
ナニ ウスグライ ジメジメ イル シ タ ニャーニャー トコロ キオク ナイ イタコト
ワガハイ ニンゲン モノ ハジメ ココ タ ミ
アト ソウ ドウ アッ ニンゲン ダ ソレ イチバン シュゾク ショセイ キク チュウ アク タ デ ドウアク

まとめ

プログラミング スバラシイ ゲンゴ ホントウニ デス Groovy Apache
注目すべきはやはり、Apache Groovyが如何に優れたイケメンプログラミング言語か、という点ですね。

なお、別の方のCommon Lispで実装されたイカれたバージョンがあるのでそちらもどうぞ!
Lispで日本語を宇宙人言葉にする

参考資料

[Groovy]たった1スクリプトで形態素解析!
[Groovy]たった1スクリプトで形態素解析! -少し詳細編-
Apache Groovyチュートリアル(非公式)

13
12
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
12