Hope is a Dream. Dream is a Hope.

非公開ブログは再開しました。

PySideを使ってJanomeで日本語形態素解析!! 2時間でつくる簡単アプリ

f:id:hope_is_dream:20160106220933j:plain

こんにちわ。

ふぃふぃです。

ふと。韻辞典を作りたいと思いました。韻辞典とはその名の通り"韻"を踏むワードが見つかる夢の辞書。まぁ日本語ラップをしていなければ普通はいりません。中学生のころ友達とラップを作ってみよう!となった時に韻を踏むのにとても苦労したのを覚えています。そんな夢のツール。調べてみると色々でてきました。

作詞支援ツール,単語データベース(韻検索/母音検索/連想表示) 23万語を収録!! - ブラウザで使えるWeb便利ツール

ライムサーチ(韻踏み検索)

韻を踏む | くだらない研究所

踏韻事典: 韻を踏む単語や語句を検索できるアプリ。ずばり使える、かなり。3721 | AppBank

ホーム - RhymePlus! (ライムプラス) : 韻を踏む語句を検索する無料モバイルアプリ

調べるといくつか出てきます。使いやすそうなアプリもありました。いいですね。

しかしこの韻辞典。安易に使うのは注意が必要です。

フリースタイル信じてたら韻辞典は禁じ手 あくまで参考 俺が先んじて言っておこう byZEEBRA

1995年。韻辞典サービスなんてまだなかった時代にすでにZeebra先輩が釘を刺してます。


KGDR(ex.キングギドラ) 「未確認飛行物体接近中」 「見まわそう」 BAZOOKA!!!ライブ

2:35付近で歌ってますね。

こんな記事も。(おまけ)

日本語ラップの世界に限った話ではないが、 強烈なインパクトを持った一つの作品がその後の時流を規定してしまうということがある。 そして、日本語ラップにおけるライミングに関して言えば、 その「たった一つの作品」のうちの一つは、95年にリリースされた『空からの力』だ。 キングギドラZEEBRAK DUB SHINEの2MCは、 卓越したライミングのテクニックで多くのファンやフォロワーを生み出した。 この押韻重視のアティチュードは勿論リリックでも表現されており、 「何人のラッパーがちゃんと韻踏んでるのか数えてみよう」や、 「悲しくなるお前のライム甘くて(共に"大掃除"ZEBBRAバース)」などの部分に特に顕著である。 同時に「韻辞典は禁じ手("見まわそう"より)」と明言して敷居を高くすることで、 自らの成し遂げた押韻術の地位を絶対的なものへと押し上げた。 「お前らやれるもんなら同じようにやってみろよ、簡単じゃないぜ」ということである。 以上諸々ひっくるめて、ライミングの巧みさをセルフボースティングとしても用いた、 最も効果的で最も早かったケースだと言える。 そして、この作品をきっかけにZEEBRAが徐々にシーンの中心人物となっていくと同時に、 「韻を踏んでなけりゃラップじゃねぇ」という空気がより強くシーンを支配するようになる。 日本語ラップと韻 その2:キングギドラ『空からの力』の影響力 : 日本語ラップの基礎研究

さてさてそんなことを今朝お風呂で考えていました。日本語を分析するにはMecab等を使って分析できるのは知っているのですが、使ったことがなく敷居がたかい(厳密にはインストールに苦戦)。

今日久しぶりに調べてみるとJanomeというツールが公開されているのを見つけました。チュートリアルをみると簡単に使えそうでしたので試してみたのが今日の記事になります。

PySideでJanomeを使ってみた

Janome

@moco_betaさんがMecabを簡単に使えるよなツールを作られたということで試してみました.

辞書内包/Pure Python実装の形態素解析Janome を公開しました 一応の基本機能がととのったので、できたてほやほやではありますが、Python製の形態素解析Janome を公開しました。 http://mocobeta-backup.tumblr.com/post/115843098157/pure-python-janome

Janomeの使い方

公式がとても詳しいですJanome v0.2 documentation

使い方は簡単!!pipでインストールしてちゃちゃっとするだけ!!(作者様本当にありがとうございます)

    (venv) $ pip install janome
    (venv) $ python
    >>> from janome.tokenizer import Tokenizer
    >>> t = Tokenizer()
    >>> for token in t.tokenize('すもももももももものうち'):
    ...     print(token)
    ...
    すもも 名詞,一般,*,*,*,*,すもも,スモモ,スモモ
    も    助詞,係助詞,*,*,*,*,も,モ,モ
    もも  名詞,一般,*,*,*,*,もも,モモ,モモ
    も    助詞,係助詞,*,*,*,*,も,モ,モ
    もも  名詞,一般,*,*,*,*,もも,モモ,モモ
    の    助詞,連体化,*,*,*,*,の,ノ,ノ
    うち  名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ

Janomeを使ってみるツール

そこで形態素解析を使ってみたくPySideを使って簡単なアプリを作ってみました。 文章を入力するとJanomeを使って形態素解析を行い結果を表示するだけのアプリです。

f:id:hope_is_dream:20160106215614j:plain

ソースコードgithubにあります

github.com

#! coding:utf-8
"""
janome-app.py

Janome v0.2 documentation
http://mocobeta.github.io/janome/

(2015/01/05) ver1.0 たたき台完成

Created by fifi on 2016/01/06 16:16
"""
__version__ = '1.0'
__app_name__ = 'janome'

import sys
import os
import csv

from PySide.QtGui import *

from PySide.QtCore import *

from janome.tokenizer import Tokenizer
from UI_ import *


class MyWindow(QWidget, Ui_window):
    loaded_words = Signal(str)
    refresh_words = Signal()

    def __init__(self):
        QWidget.__init__(self)
        self.setupUi(self)
        self.setWindowTitle(
            QApplication.translate("Widget", "%s %s" % (__app_name__, __version__), None, QApplication.UnicodeUTF8))

        self.jacome_token = Tokenizer()
        self.words_container = []

    @Slot()
    def analysis_janome(self, s):
        # デバッグ用に解析文章をstdout
        print s

        # 解析結果の表示要素を初期化(クリア)
        self.refresh_words.emit()
        # 解析結果格納配列を初期化(csv保存用)
        self.words_container = []
        # 形態素解析を実行
        tokens = self.jacome_token.tokenize(s)

        for token in tokens:
            # 解析結果をstring(UNICODE)型へキャスト
            print_str = str(token).decode('utf8')
            # csv保存用に解析結果を格納
            self.words_container.append(print_str)

        # 解析結果を出力
        self.loaded_words.emit('\n'.join(self.words_container))

    @Slot()
    def save_csv(self):
        filename = 'result.csv'
        filename = os.path.normpath(filename)

        # OSを判定してエンコードを設定
        if os.name is 'nt':
            code = 'cp932'
        else:
            code = 'utf-8'
        print 'save_csv: code = %s' % code

        with open(filename, 'wb') as f:  # 'wb'じゃないと変な改行入る。
            writer = csv.writer(f, delimiter=',')
            for words in self.words_container:
                out_word = words.encode(code)
                writer.writerow([out_word])


def main():
    app = QApplication(sys.argv)
    app.setStyle('plastique')
    win = MyWindow()
    win.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

※ 作成者moco_betaさんに感謝いたします

今日もご観覧ありがとうございました。

ふぃ