3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

形態素解析器(Janome)を使いこなしたい!

Posted at

はじめに

「形態素解析器を使いこなしたい!」、そう思ったのはいったいいつからか...

今回は形態素解析器であるJanomeの公式Documentを自分なりにまとめました!
形態素解析器の使い方がよくわかっていない方の参考になれば幸いです!

参考文献

Janome API reference v0.4
Janome v0.4 documentation (ja)WELCOME TO JANOME'S DOCUMENTATION! (JAPANESE)
Python, Janomeで日本語の形態素解析、分かち書き(単語分割)

目次

  • Tokenizer
  • Analyzer
    • char_filters
    • token_filters

janome.tokenizer module

入力した文字列を"Token"に変換して出力します。

tokenizer
from janome.tokenizer import Tokenizer

tokenizer = Tokenizer()
phrase = "すもももももももものうち"
for token in tokenizer.tokenize(phrase):
  print(token)

【output】
すもも 名詞,一般,,,,,すもも,スモモ,スモモ
も 助詞,係助詞,,,,,も,モ,モ
もも 名詞,一般,,,,,もも,モモ,モモ
も 助詞,係助詞,,,,,も,モ,モ
もも 名詞,一般,,,,,もも,モモ,モモ
の 助詞,連体化,,,,,の,ノ,ノ
うち 名詞,非自立,副詞可能,,,*,うち,ウチ,ウチ

Tokenの属性には分割した単語の情報が格納されています。

  • surface:文章中で使われていた形そのもの
  • part_of_speech:品詞の詳細
  • infl_type:活用型(「語形変化」を表すinflectionから来ている?)
  • infl_form:活用形
  • base_form:基本形
  • reading:読み
  • phonetic:発音

janome.analyzer module

形態素解析のための前処理と後処理をまとめたフレームワークです。
抽出したい情報の条件をAnalyzerクラスを呼び出す際の引数に入れることで、
条件に該当した単語の情報を抽出することができます。

analyzer
from janome.tokenizer import Tokenizer
from janome.analyzer import Analyzer
from janome.charfilter import *
from janome.tokenfilter import *

phrase = "蛇の目はPure Pythonな形態素解析器です。"
char_filters = [UnicodeNormalizeCharFilter(), RegexReplaceCharFilter('蛇の目', 'janome')]
tokenizer = Tokenizer()
token_filters = [CompoundNounFilter(), POSStopFilter(['記号','助詞']), LowerCaseFilter()]
analyzer = Analyzer(char_filters=char_filters, tokenizer=tokenizer, token_filters=token_filters)
for token in analyzer.analyze(phrase):
  print(token)

【output】
janome 名詞,固有名詞,組織,,,,janome,,*
pure 名詞,固有名詞,組織,,,,pure,,*
python 名詞,一般,,,,,python,,
な 助動詞,,,,特殊・ダ,体言接続,だ,ナ,ナ
形態素解析器 名詞,複合,
,,,,形態素解析器,ケイタイソカイセキキ,ケイタイソカイセキキ
です 助動詞,
,,,特殊・デス,基本形,です,デス,デス

また、文章中に各単語が何回出現したか数えることもできます。

token_count
phrase = "赤巻紙青巻紙黄巻紙"
analyzer = Analyzer(token_filters=[TokenCountFilter()])
word_count = analyzer.analyze(phrase)
for _ in word_count:
  print(_)

【output】
('赤', 1)
('巻紙', 3)
('青', 1)
('黄', 1)

抽出条件はchar_filters、tokenizer、token_filtersの3つで設定します。

char_filters

入力テキストに施す内容を設定します。
入力テキストに文字の正規化などの前処理を加えた後、tokenizerに渡します。

  • RegexReplaceCharFilter
    入力内に該当する文字列を別の文字列に変換します。
    e.g. RegexReplaceCharFilter('蛇の目', 'janome')とすると、「蛇の目」が「janome」となります。

  • UnicodeNormalizeCharFilter
    Unicode文字列を正規化します。

token_filters

tokenizerの出力に対して、小文字化,品詞によるトークンのフィルタリングなどを行います。

  • CompoundNounFilter
    tokenizerによって分割されたトークンを複合名詞として扱えるように再結合するクラスです。
    e.g. "形態素/解析/器" ⇒ "形態素解析器"

  • ExtractAttirbuteFilter
    Token内から指定した属性の情報を取り出します。
    e.g. ExtractAttributeFilter("base_form")ではそのトークンの基本形が抽出されます。

  • LowerCaseFilter
    Tokenのsurfaceとbase_formを小文字に変換します。

  • POSKeepFilter
    引数に入れた品詞に該当するTokenは残し、それ以外のTokenを除外します。
    e.g. POSKeepFilter(["動詞"])とすると、‘動詞,自立,*,*’や‘動詞,非自立,*,*’などが残ります。

  • POSStopFilter
    POSKeepFilterの逆で、引数に入れた品詞に該当するTokenを除外します。

  • TokenCountFilter
    入力テキスト内の単語出現回数を数える。単語と出現回数をペアとして出力します。

終わり

以上です。
お読みいただきありがとうございました。

※誤りがありましたら、お手数ですがご指摘いただけますと幸いです。

3
2
0

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
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?