Fork me on GitHub

Welcome to janome's documentation! (Japanese)

English

Janome とは

_images/janome_small.jpg

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

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

内包辞書として mecab-ipadic-2.7.0-20070801 を使っています。なお,v0.3.8+ では新元号「令和」がシステム辞書に追加されています。

ソースコードリポジトリ

https://github.com/mocobeta/janome

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

API リファレンス

https://mocobeta.github.io/janome/api/

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

Python 3.7+ インタプリタ

最新バージョン

  • 0.5.0

インストール

PyPI

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

$ pip install janome

注釈

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

チュートリアル

初心者向けチュートリアル&ハンズオン教材「Janome ではじめるテキストマイニング」を公開しました。

ハンズオンには Google Colab を使っており Web ブラウザがあれば実行できます。janome CLI / API の基本的な使い方,ユーザー辞書・ワードカウント・Analyzer など janome の少しだけ高度な使い方,日本語 WordCloud といった内容について,手を動かしながら身につけられます。

使い方

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

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

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

for Windows users

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

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

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

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

現在のところ,コンパイルのためのツールはありませんが, API を使ってコンパイルが行えます。 progress_handler オプションは v0.4.1 以上でサポートされます。

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

>>> from janome.dic import UserDictionary
>>> from janome.progress import SimpleProgressIndicator
>>> from janome import sysdic
>>> user_dict = UserDictionary("userdic.csv", "utf8", "ipadic", sysdic.connections, progress_handler=SimpleProgressIndicator(update_frequency=0.01))
Reading user dictionary from CSV: 100.0% | 17149/17149
Running create_minimum_transducer: 100.0% | 17149/17149
>>> user_dict.save("/tmp/userdic")

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

>>> from janome.dic import UserDictionary
>>> from janome.progress import SimpleProgressIndicator
>>> from janome import sysdic
>>> user_dict = UserDictionary("user_simpledic.csv", "utf8", "simpledic", sysdic.connections, progress_handler=SimpleProgressIndicator(update_frequency=0.01))
Reading user dictionary from CSV: 100.0% | 17149/17149
Running create_minimum_transducer: 100.0% | 17149/17149
>>> user_dict.save("/tmp/userdic")

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

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

注釈

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

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 = '蛇の目はPure Pythonな形態素解析器です。'
>>> char_filters = [UnicodeNormalizeCharFilter(), RegexReplaceCharFilter('蛇の目', 'janome')]
>>> tokenizer = Tokenizer()
>>> token_filters = [CompoundNounFilter(), POSStopFilter(['記号','助詞']), LowerCaseFilter()]
>>> a = Analyzer(char_filters=char_filters, tokenizer=tokenizer, token_filters=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 = 'すもももももももものうち'
>>> token_filters = [POSKeepFilter(['名詞']), TokenCountFilter()]
>>> a = Analyzer(token_filters=token_filters)
>>> for k, v in a.analyze(text):
...   print('%s: %d' % (k, v))
...
すもも: 1
もも: 2
うち: 1

TokenCountFilter の初期化時に sorted=True を指定すると,出現回数の多い順に返されます。ソートの計算コストがかかるため,出現回数でのソートが不要の場合は False としてください。指定がない場合のデフォルト値は False です。

>>> token_filters = [TokenCountFilter(sorted=True)]

また, TokenCountFilter 初期化時に att='base_form' を指定すると,基本形の数を数えます。動詞や形容動詞の数を数えたい場合は,このオプションを指定すると良いでしょう。指定がない場合のデフォルト値は surface (表層形) です。

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

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

[参考リンク]

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

注釈

v0.4.0 から,ストリーミングモードのみサポートしており, stream オプションは廃止されました。

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 をビルドする方法

v0.3.7 より,janome コマンド (後述) が NEologd 辞書内包版にも対応しました。NEologd 内包版は mmap モード (後述) のみで動作するため, -m オプションをつけて実行してください。

$ echo "渋谷ヒカリエで待ち合わせ" | janome -m

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

注釈

v0.4.0 以上では, 64bit アーキテクチャにおいて mmap=True がデフォルトになりました(32bit アーキテクチャでのデフォルトは False)。

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

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

Graphviz ファイル (DOT ファイル) 出力 (v0.3.7 以上)

Tokenizer.tokenize() メソッドに dotfile=<dotfile output path> オプションを与えると,解析時のラティスグラフを Graphviz の DOT ファイルに変換して指定のパスに出力します。パフォーマンス上の理由により,ストリーミングモードで実行時,またはとても長いテキストを与えた場合は,このオプションは無視されます。

この機能は,janome コマンド(後述)から利用するのが便利です。

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

コマンドラインから実行可能なスクリプト janome がついています。

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

標準入力から文字列を受け取り,形態素解析を実行します。指定できるオプションを見るには "janome -h" とタイプしてください。また,"janome --version" でインストールされているバージョンが確認できます(v0.3.7 以上)。

Linux/Mac

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

Windows

文字化けする場合, -e sjis オプションをつけるといいでしょう。

>janome -e sjis
ウィンドウズでも簡単インストール
ウィンドウズ    名詞,固有名詞,一般,*,*,*,ウィンドウズ,ウィンドウズ,ウィンドウズ
      助詞,格助詞,一般,*,*,*,,,
      助詞,係助詞,*,*,*,*,,,
簡単    名詞,形容動詞語幹,*,*,*,*,簡単,カンタン,カンタン
インストール    名詞,一般,*,*,*,*,インストール,インストール,インストール
(Type Ctrl-Z to quit.)

ラティス可視化

注釈

この機能を実行するには,Graphviz が必要です。 こちら の手順で事前にインストールしてください。

-g オプションをつけると,解析後にラティスグラフがファイルに出力されます。デフォルトの出力先はカレントディレクトリ,フォーマットは PNG です。

$ echo "カレーは飲み物" | janome -g
カレー 名詞,一般,*,*,*,*,カレー,カレー,カレー
は   助詞,係助詞,*,*,*,*,は,ハ,ワ
飲み物 名詞,一般,*,*,*,*,飲み物,ノミモノ,ノミモノ
Graph was successfully output to lattice.gv.png

lattice.gv.png (クリックで拡大)

_images/lattice.gv.png

ファイルの出力先を指定したい場合は --gv-out オプションを,Graphviz のフォーマットを指定する場合は --gv-format オプションをつけてください。サポートされるフォーマットは Graphviz のドキュメント を参照してください。

$ echo "カレーは飲み物" | janome -g --gv-out /tmp/a.gv --gv-format svg
...
Graph was successfully output to /tmp/a.gv.svg

PyInstaller でアプリケーションにバンドルする (v0.3.9+)

PyInstaller で janome をアプリケーションにバンドルして,実行可能ファイルとして配布できます。

Tokenizer 初期化時に mmap=False オプションをつけてください。

(venv) $ janome --version
janome 0.3.9
(venv) $ pyinstaller -v
3.4

(venv) $ cat test.py
# -*- utf-8
from janome.tokenizer import Tokenizer
t = Tokenizer(mmap=False)
    for token in t.tokenize('令和元年'):
    print(token)

(venv) $ pyinstaller --onefile test.py
44 INFO: PyInstaller: 3.4
44 INFO: Python: 3.6.6
...

(venv) $ ls dist/
test
(venv) $ ./dist/test
令和  名詞,固有名詞,一般,*,*,*,令和,レイワ,レイワ
元年  名詞,一般,*,*,*,*,元年,ガンネン,ガンネン

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

  1. Tokenizer の初期化が遅いんだけど。

  1. インタプリタ起動直後の,初回の Tokenizer インスタンス生成時に,システム辞書を読み込むのですが,現在のバージョンでは1~2秒かかる仕様です。2回目以降はシステム辞書がすでに読み込まれているため速くなります。今後改善していきたいのですが,現行ではご勘弁ください. (そのため, インタプリタをしょっちゅう再起動するようなユースケースだと厳しいです。) => v0.3.3 以上の mmap サポートを使うと初期化が高速になるため,必要に応じて検討ください。

  1. 解析結果の精度は。

  1. 辞書,言語モデルともに MeCab のデフォルトシステム辞書をそのまま使わせていただいているため,バグがなければ,MeCab と同等の解析結果になると思います。

  1. 形態素解析の速度は。

  1. 文章の長さによりますが,手元の PC では 1 センテンスあたり数ミリ〜数十ミリ秒でした。mecab-python の10倍程度(長い文章だとそれ以上)遅い,というくらいでしょうか。今のところは,大量の文書を高速にバッチ処理する用途には向いていません。MeCab をお使いください。

  1. 実装(データ構造,アルゴリズム)について。

  1. 辞書は,FST (正確には Minimal Acyclic Subsequential Transducer, 論文) を使っています。実装は Apache Lucene (Kuromoji) と kagome を参考にさせていただきました。エンジンはオーソドックスなビタビで,ほぼ 自然言語処理の基礎 の3章だけ読んで書きました。

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

  1. Python 2 系への対応は。

  1. デスヨネー。 => 対応しました。janomePy2 をご利用ください。=> janome 本体が Python2.7 にも対応しました。 => v0.4.0 以降,Python 2.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 立ててください。

For Contributors

See https://github.com/mocobeta/janome/blob/master/CONTRIBUTING.md

作者について

プロフィール

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

  • 2023.07.01 janome Version 0.5.0 released [Release Note]

  • 2022.02.23 janome Version 0.4.2 released [Release Note]

  • 2020.09.21 janome Version 0.4.1 released

  • 2020.08.23 janome Version 0.4.0 released

  • 2019.11.03 janome Version 0.3.10 released

  • 2019.05.12 janome Version 0.3.9 released

  • 2019.04.03 janome Version 0.3.8 released

  • 2018.12.11 janome Version 0.3.7 released

  • 2017.12.07 janome Version 0.3.6 released

  • 2017.08.06 janome Version 0.3.5 released

  • 2017.07.29 janome Version 0.3.4 released

  • 2017.07.23 janome Version 0.3.3 released

  • 2017.07.05 janome Version 0.3.2 released

  • 2017.07.02 janome Version 0.3.1 released

  • 2017.06.30 janome Version 0.3.0 released

  • 2016.05.07 janome Version 0.2.8 released

  • 2016.03.05 janome Version 0.2.7 released

  • 2015.10.26 janome Version 0.2.6 released

  • 2015.05.11 janome Version 0.2.5 released

  • 2015.05.03 janome Version 0.2.4 released

  • 2015.05.03 janome Version 0.2.3 released

  • 2015.04.24 janome Version 0.2.2 released

  • 2015.04.24 janome Version 0.2.0 released

  • 2015.04.11 janome Version 0.1.4 released

  • 2015.04.08 janome Version 0.1.3 released

詳細: CHANGES

Badge(FISHEYE)