Fork me on GitHub

Welcome to janome’s documentation! (Japanese)

English

Janome とは

Janome (蛇の目) は,Pure Python で書かれた,辞書内包の形態素解析器です。

依存ライブラリなしで簡単にインストールでき,アプリケーションに組み込みやすいシンプルな API を備える形態素解析ライブラリを目指しています。

内包辞書として mecab-ipadic-2.7.0-20070801 を使っています。

ソースコードリポジトリ

https://github.com/mocobeta/janome

気に入ったらリポジトリにも★つけていってください! :)

動作に必要なソフトウェア

Python 2.7.x または Python 3.3+ インタプリタ

バージョン

  • janome: 0.3.5

インストール

PyPI

https://pypi.python.org/pypi/Janome

$ pip install janome

注釈

pip でのビルド時に 500 ~ 600 MB 程度のメモリを必要とします。利用可能なメモリ容量にご注意ください。(バージョン 0.2.6 より,RAM 2GB 程度のマシンや 32 bit 環境でもインストールできるようになりました。)

使い方

janome.tokenizer パッケージの Tokenizer オブジェクトを作り,tokenize() メソッドに解析したい文字列を渡します。

戻り値は Token オブジェクトのリストです。Token は表層形や品詞といった形態素情報を含みます。詳しくは リファレンス を参照してください。

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

for Windows users

文字化けする場合は decode('utf8') をかけてください。

>>> from janome.tokenizer import Tokenizer
>>> t = Tokenizer()
>>> for token in t.tokenize(u'すもももももももものうち'):
...     print(str(token).decode('utf8'))

ユーザー定義辞書を使う

MeCab IPADIC フォーマット

デフォルトユーザー定義辞書のフォーマットは,MeCab 辞書と同じです。たとえば以下のような CSV ファイルを作成し,Tokenizer クラスの初期化時にファイルパスとエンコーディングを指定します。

辞書フォーマットは MeCab の ドキュメント をご参照ください。

userdic.csv

東京スカイツリー,1288,1288,4569,名詞,固有名詞,一般,*,*,*,東京スカイツリー,トウキョウスカイツリー,トウキョウスカイツリー
東武スカイツリーライン,1288,1288,4700,名詞,固有名詞,一般,*,*,*,東武スカイツリーライン,トウブスカイツリーライン,トウブスカイツリーライン
とうきょうスカイツリー駅,1288,1288,4143,名詞,固有名詞,一般,*,*,*,とうきょうスカイツリー駅,トウキョウスカイツリーエキ,トウキョウスカイツリーエキ
>>> from janome.tokenizer import Tokenizer
>>> t = Tokenizer("userdic.csv", udic_enc="utf8")
>>> for token in t.tokenize(u'東京スカイツリーへのお越しは、東武スカイツリーライン「とうきょうスカイツリー駅」が便利です。'):
...   print(token)
...

東京スカイツリー         名詞,固有名詞,一般,*,*,*,東京スカイツリー,トウキョウスカイツリー,トウキョウスカイツリー
へ        助詞,格助詞,一般,*,*,*,へ,ヘ,エ
の        助詞,連体化,*,*,*,*,の,ノ,ノ
お越し    名詞,一般,*,*,*,*,お越し,オコシ,オコシ
は        助詞,係助詞,*,*,*,*,は,ハ,ワ
、        記号,読点,*,*,*,*,、,、,、
東武スカイツリーライン    名詞,固有名詞,一般,*,*,*,東武スカイツリーライン,トウブスカイツリーライン,トウブスカイツリーライン
「        記号,括弧開,*,*,*,*,「,「,「
とうきょうスカイツリー駅  名詞,固有名詞,一般,*,*,*,とうきょうスカイツリー駅,トウキョウスカイツリーエキ,トウキョウスカイツリーエキ
」        記号,括弧閉,*,*,*,*,」,」,」
が        助詞,格助詞,一般,*,*,*,が,ガ,ガ
便利      名詞,形容動詞語幹,*,*,*,*,便利,ベンリ,ベンリ
です      助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
。        記号,句点,*,*,*,*,。,。,。

簡略辞書フォーマット (v0.2.7 以上)

Kuromoji のユーザー辞書に似た,簡略化された辞書フォーマットです(ただし Janome には search mode がないため,search mode 用の項目はありません)。表層形,品詞,読みのみを記述し,詳細品詞やスコアは指定できません。

簡略辞書フォーマットを使うには,以下のような「<表層形>,<品詞>,<読み>」を並べた CSV ファイルを用意し,Tokenizer 初期化時にファイルパスと辞書タイプ(udic_type='simpledic')を指定してください。

user_simpledic.csv

東京スカイツリー,カスタム名詞,トウキョウスカイツリー
東武スカイツリーライン,カスタム名詞,トウブスカイツリーライン
とうきょうスカイツリー駅,カスタム名詞,トウキョウスカイツリーエキ
>>> from janome.tokenizer import Tokenizer
>>> t = Tokenizer("user_simpledic.csv", udic_type="simpledic", udic_enc="utf8")
>>> for token in t.tokenize(u'東京スカイツリーへのお越しは、東武スカイツリーライン「とうきょうスカイツリー駅」が便 利です。'):
...   print(token)
...
東京スカイツリー     カスタム名詞,*,*,*,*,*,東京スカイツリー,トウキョウスカイツリー,トウキョウスカイツリー
へ    助詞,格助詞,一般,*,*,*,へ,ヘ,エ
の    助詞,連体化,*,*,*,*,の,ノ,ノ
お越し    名詞,一般,*,*,*,*,お越し,オコシ,オコシ
は    助詞,係助詞,*,*,*,*,は,ハ,ワ
、    記号,読点,*,*,*,*,、,、,、
東武スカイツリーライン   カスタム名詞,*,*,*,*,*,東武スカイツリーライン,トウブスカイツリーライン,トウブスカイツリーライン
「    記号,括弧開,*,*,*,*,「,「,「
とうきょうスカイツリー駅    カスタム名詞,*,*,*,*,*,とうきょうスカイツリー駅,トウキョウスカイツリーエキ,トウキョウスカイツリーエキ
 」   記号,括弧閉,*,*,*,*,」,」,」
が    助詞,格助詞,一般,*,*,*,が,ガ,ガ
便利    名詞,形容動詞語幹,*,*,*,*,便利,ベンリ,ベンリ
です    助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
。    記号,句点,*,*,*,*,。,。,。

コンパイル済みのユーザー辞書を使う

ユーザー定義辞書は,巨大になるとバイナリコンパイルに時間がかかるため,あらかじめコンパイルしておき,コンパイル済みの辞書を使うことも可能です。

現在のところ,コンパイルのためのツールはありませんが, API を使ってコンパイルが行えます。

注釈

v0.3.1 から,ユーザー辞書コンパイル時の API が少し変わっているため注意してください。

辞書のコンパイル(MeCab IPADIC format)

>>> from janome.dic import UserDictionary
>>> import sysdic
>>> user_dict = UserDictionary("userdic.csv", "utf8", "ipadic", sysdic.connections)
>>> user_dict.save("/tmp/userdic")

辞書のコンパイル(simplified format)

>>> from janome.dic import UserDictionary
>>> import sysdic
>>> user_dict = UserDictionary("user_simpledic.csv", "utf8", "simpledic", sysdic.connections)
>>> user_dict.save("/tmp/userdic")

これで, /tmp/userdic 以下にコンパイル済みのユーザー辞書が保存されます。使うときは Tokenizer のコンストラクタにディレクトリのパスを指定します。

>>> t = Tokenizer("/tmp/userdic")

注釈

コンパイル済みユーザー辞書は,コンパイル時と読み取り時で同一のメジャーバージョンの Python を使ってください。辞書の前方/後方互換性は保証されないため,Python のメジャーバージョンが異なると読めない可能性があります。

(experimental) Analyzer フレームワーク (v0.3.4 以上)

Analyzer は,形態素解析の前処理・後処理をテンプレ化するためのフレームワークです。Analyzer フレームワークは下記のクラスを含みます。

  • 文字の正規化などの前処理を行う CharFilter クラス
  • 小文字化,品詞によるトークンのフィルタリングなど,形態素解析後の後処理を行う TokenFilter クラス
  • CharFilter, Tokenizer, TokenFilter を組み合わせてカスタム解析フローを組み立てる Analyzer クラス

Analyzer の使い方

Analyzer 初期化時に,CharFilter のリスト,初期化済み Tokenizer オブジェクト,TokenFilter のリストを指定します。0 個以上,任意の数の CharFilter や TokenFilter を指定できます。 Analyzer を初期化したら,analyze() メソッドに解析したい文字列を渡します。戻り値はトークンの generator です(最後に指定した TokenFilter の出力により,generator の返す要素の型が決まります)。

以下の実行例では,前処理としてユニコード正規化と正規表現による文字列置換を行い,形態素解析を実行後に,名詞の連続のまとめあげ(複合名詞化),品詞によるフィルタリング,表層形の小文字化という後処理を行っています。

注釈

CharFilter や TokenFilter は,リストに指定した順で適用されるため,順番には注意してください。

>>> from janome.tokenizer import Tokenizer
>>> from janome.analyzer import Analyzer
>>> from janome.charfilter import *
>>> from janome.tokenfilter import *
>>> text = u'蛇の目はPure Pythonな形態素解析器です。'
>>> char_filters = [UnicodeNormalizeCharFilter(), RegexReplaceCharFilter(u'蛇の目', u'janome')]
>>> tokenizer = Tokenizer()
>>> token_filters = [CompoundNounFilter(), POSStopFilter(['記号','助詞']), LowerCaseFilter()]
>>> a = Analyzer(char_filters, tokenizer, token_filters)
>>> for token in a.analyze(text):
...     print(token)
...
janome  名詞,固有名詞,組織,*,*,*,*,*,*
pure    名詞,固有名詞,組織,*,*,*,*,*,*
python  名詞,一般,*,*,*,*,*,*,*
な       助動詞,*,*,*,特殊・ダ,体言接続,だ,ナ,ナ
形態素解析器  名詞,複合,*,*,*,*,形態素解析器,ケイタイソカイセキキ,ケイタイソカイセキキ
です     助動詞,*,*,*,特殊・デス,基本形,です,デス,デス

Analyzer の利用例: ワードカウント (v0.3.5 以上)

TokenCountFilter を使うと,入力文字列中の単語出現頻度を数えることができます。以下は,文字列中の名詞の出現回数を数える例です(POSKeepFilterで名詞のみフィルタしています)。出現回数の多い順に,単語(表層形)とその出現回数のタプルが返されます。

>>> from janome.tokenizer import Tokenizer
>>> from janome.analyzer import Analyzer
>>> from janome.tokenfilter import *
>>> text = u'すもももももももものうち'
>>> token_filters = [POSKeepFilter('名詞'), TokenCountFilter()]
>>> a = Analyzer(token_filters=token_filters)
>>> for k, v in a.analyze(text):
...   print('%s: %d' % (k, v))
...
もも: 2
すもも: 1
うち: 1

なお TokenCountFilter の初期化時に att='base_form' と指定すると,基本形の数を数えます。動詞や形容動詞の数を数えたい場合は,このオプションを指定すると良いでしょう。

>>> token_filters = [TokenCountFilter(att='base_form')]

その他,組み込みの CharFilter や TokenFilter についてはリファレンスを参照してください。また,CharFilter や TokenFilter を拡張すれば,任意のフィルター処理を実装することもできます。

[参考リンク]

ストリーミングモード (v0.3.1 以上)

tokenize() メソッドに stream = True オプションを与えると,ストリーミングモードで動作します。ストリーミングモードでは,部分的な解析が完了する都度,解析結果を返します。戻り値はリストではなく generator になります。

内部的にすべての Token のリストを保持しなくなるため,巨大な文書を解析する場合でも,メモリ消費量が一定以下に抑制されます。

t = Tokenizer()
with open('very_large_text.txt') as f:
    txt = f.read()
    for token in t.tokenize(txt, stream=True):
        print(token)

分かち書きモード (v0.3.1 以上)

tokenize() メソッドに wakati = True オプションを与えると,分かち書きモード(表層形のみを返すモード)で動作します。分かち書きモードで解析した場合の戻り値は,Token オブジェクトのリストではなく文字列 (str) のリストになります。

>>> t = Tokenizer()
>>> tokens = t.tokenize(u'分かち書きモードがつきました!', wakati=True)
>>> tokens
['分かち書き', 'モード', 'が', 'つき', 'まし', 'た', '!']

分かち書きモードしか使わない場合,Tokenizer オブジェクト初期化時に wakati = True オプションを与えると,詳細品詞・読みなど,不要なデータを辞書からロードしなくなります。普通にすべての辞書データをロードして初期化した場合より,少し(50MB程度)メモリ使用量が抑制されます。

>>> t = Tokenizer(wakati=True)

なお, このオプションを与えて Tokenizer を初期化した場合,tokenize() メソッドは常に分かち書きモードで動作します(tokenize 時に wakati = False と指定しても無視されます)。

分かち書きモードはストリームモードと併用することができます。その場合の戻り値は文字列 (str) の generator となります。

t = Tokenizer()
for token in t.tokenize(txt, stream=True, wakati=True):
    print(token)

(experimental) NEologd 辞書を使う (v0.3.3 以上)

NEologd 辞書を内包した janome パッケージを作成する手順を以下で公開しています。実験的なものなので,諸々了解のうえお試しください :)

NEologd 辞書を内包した janome をビルドする方法

Memory-mapped file サポート (v0.3.3 以上)

Tokenizer オブジェクトの初期化時に mmap=True オプションを与えると,辞書エントリは Memory-mapped file としてアクセスされるようになります。

Tokenizer の初期化時,プロセス空間に辞書エントリをロードしないため,初期化が高速になります。

コマンドラインから使う (v0.2.6 以上,Lunux/Mac only)

コマンドラインから実行可能なスクリプト janome がついています。(Linux/Mac のみ。Windows 版 (bat) はもう少しお待ちください。PR 歓迎!)

簡単に動作を確認したいときにお使いください。

標準入力から文字列を受け取り,形態素解析を実行します。指定できるオプションを見るには 「janome -h」 とタイプしてください。

(env)$ janome
猫は液体である
猫    名詞,一般,*,*,*,*,猫,ネコ,ネコ
は    助詞,係助詞,*,*,*,*,は,ハ,ワ
液体  名詞,一般,*,*,*,*,液体,エキタイ,エキタイ
で    助動詞,*,*,*,特殊・ダ,連用形,だ,デ,デ
ある  助動詞,*,*,*,五段・ラ行アル,基本形,ある,アル,アル
(Ctrl-C で終了)

大きな文書を解析する際の注意 (v0.2.8 以下)

注釈

バージョン 0.3 では,大きな文書を解析したときにメモリを大量に消費(リーク)してしまう問題が解決されました。内部バッファに収まらないサイズの文書が与えられた場合,部分的に解析することでメモリ使用量を抑制しています。よりメモリ使用量を抑制したい場合は「ストリーミングモード」を使ってください。

詳しくはこちら: [janome開発日誌] 省メモリ対応をした janome 0.3.1 をリリースしました

この修正の影響で,0.2 系と 0.3 系以上 では,大きなドキュメントを解析したときの解析結果が若干異なる可能性があります。

古いバージョン(< 0.3)では,入力全体を読んでラティスを構築するため,入力文字列が大きくなると多くのリソースを消費します。数十キロバイト以上の文書を解析する場合は,なるべく適度に分割して与えてください。

よくある(かもしれない)質問

  1. Tokenizer の初期化が遅いんだけど。
  1. インタプリタ起動直後の,初回の Tokenizer インスタンス生成時に,システム辞書を読み込むのですが,現在のバージョンでは1~2秒かかる仕様です。2回目以降はシステム辞書がすでに読み込まれているため速くなります。今後改善していきたいのですが,現行ではご勘弁ください. (そのため, インタプリタをしょっちゅう再起動するようなユースケースだと厳しいです。) => v0.3.3 以上の mmap サポートを使うと初期化が高速になるため,必要に応じて検討ください。
  1. 解析結果の精度は。
  1. 辞書,言語モデルともに MeCab のデフォルトシステム辞書をそのまま使わせていただいているため,バグがなければ,MeCab と同等の解析結果になると思います。
  1. 形態素解析の速度は。
  1. 文章の長さによりますが,手元の PC では 1 センテンスあたり数ミリ〜数十ミリ秒でした。mecab-python の10倍程度(長い文章だとそれ以上)遅い,というくらいでしょうか。性能向上させていきたいですが,いまのところは速度を追うのがメインの目的ではないです。
  1. 実装(データ構造,アルゴリズム)について。
  1. 辞書は,FST (正確には Minimal Acyclic Subsequential Transducer, 論文) を使っています。実装は Apache Lucene (Kuromoji) と kagome を参考にさせていただきました。エンジンはオーソドックスなビタビで,ほぼ 自然言語処理の基礎 の3章だけ読んで書きました。

Janome は Lucene の単語辞書やクエリパーサで使われている FST について調べていて生まれました。もしも内部実装にご興味があれば,以下もどうぞ。

  1. Python 2 系への対応は。
  1. デスヨネー。 => 対応しました。janomePy2 をご利用ください。=> janome 本体が Python2.7 にも対応しました。
  1. 学習器ついてないの。
  1. 今のところありません。
  1. Janome ってどういう意味。
  1. ikawaha さんの,Go で書かれた形態素解析器 kagome にあやかりつつ,蛇(Python)をかけて命名しました。日本語の Ja ともかかっているのは takuya-a さんに言われて気づきました :)
  1. neologd 内包版はないの。
  1. やりたいです! => NEologd 辞書を内包した janome をビルドする方法
  1. バグ見つけた or なんか変 or 改善要望
  1. Gitter room でつぶやくか,Github リポジトリに Issue 立ててください。

作者について

プロフィール

License

Licensed under Apache License 2.0 and uses the MeCab-IPADIC dictionary/statistical model.

See LICENSE.txt and NOTICE.txt for license details.

History

詳細: CHANGES

Badge(FISHEYE)

このバッジについて