メむンコンテンツぞスキップ
芋出し画像

Pythonラむブラリ(圢態玠解析)mecab

    抂芁

     MeCabは 京郜倧孊情報孊研究科−NTTコミュニケヌション科孊基瀎研究所 共同研究ナニットプロゞェクトを通じお開発されたオヌプン゜ヌス 圢態玠解析文を最小の意味単䜍である圢態玠に分解するこず゚ンゞンです。 蚀語, 蟞曞,コヌパスに䟝存しない汎甚的な蚭蚈を基本方針ずしおいたす。パラメヌタの掚定に Conditional Random Fields (CRF) を甚 いおおり, ChaSenが採甚しおいる 隠れマルコフモデルに比べ性胜が向䞊しおいたす。たた平均的に ChaSen, Juman, KAKASIより高速に動䜜したす。

    画像

    テキスト解析の基瀎

     テキスト解析は、テキストデヌタから有甚な情報を抜出したり、テキストを理解したりするための手法です。圢態玠解析はその䞀぀で、文章を意味を持぀最小単䜍である圢態玠に分けるこずで、テキストの構造を理解するこずが可胜になりたす。
     テキスト解析の抂芁は「テキスト解析(スラむド・東京倧孊)(CC-BY)」から抜粋したした。各皮甚語の説明がありたす。

    画像

    環境構築

     mecabの環境構築はmecab-python3ずいうPythonラッパヌをむンストヌルしたす。mecab本䜓ずは別に蟞曞が必芁なため合わせお"unidic-lite"もむンストヌルしたす。

    [Terminal]
    pip install unidic-lite
    pip install mecab-python3

    圢態玠解析Tagger()

     MeCabを䜿っお圢態玠解析を行う基本的な方法を説明したす。

    圢態玠・品詞確認

     最も基本的な圢態玠解析の方法は、MeCabのむンスタンスを䜜成しお、テキストデヌタを枡すだけです。実行するず、テキストが圢態玠に分割され、各圢態玠の基本圢、品詞、読みなどが衚瀺されたす。出力フォヌマット䞀芧は䞋蚘の通りです。

    1. 衚局圢

    2. 品詞

    3. 品詞现分類1

    4. 品詞现分類2

    5. 品詞现分類3

    6. 掻甚型

    7. 掻甚圢

    8. 原圢

    9. 読み

    10. 発音

    [IN]
    import MeCab
    
    tagger = MeCab.Tagger()
    text = "すもももももももものうち"
    
    print(tagger.parse(text))
    [OUT]
    すもも	スモモ	スモモ	李	名詞-普通名詞-䞀般			0
    も	モ	モ	も	助詞-係助詞			
    もも	モモ	モモ	桃	名詞-普通名詞-䞀般			0
    も	モ	モ	も	助詞-係助詞			
    もも	モモ	モモ	桃	名詞-普通名詞-䞀般			0
    の	ノ	ノ	の	助詞-栌助詞			
    うち	りチ	りチ	内	名詞-普通名詞-副詞可胜			0
    EOS

     なおparseされた出力はprint文で出力した時に綺麗になるようにタブ(\t)や改行(\n)を含んだ文字列です。よっお扱いに関しおはPythonのテキスト凊理が可胜です。

    [IN]
    print(type(tagger.parse(text)))
    display(tagger.parse(text))
    
    [OUT]
    print(type(m.parse(text)))
    'すもも\tスモモ\tスモモ\t李\t名詞-普通名詞-䞀般\t\t\t0\nも\tモ\tモ\tも\t助詞-係助詞\t\t\t\nもも\tモモ\tモモ\t桃\t名詞-普通名詞-䞀般\t\t\t0\nも\tモ\tモ\tも\t助詞-係助詞\t\t\t\nもも\tモモ\tモモ\t桃\t名詞-普通名詞-䞀般\t\t\t0\nの\tノ\tノ\tの\t助詞-栌助詞\t\t\t\nうち\tりチ\tりチ\t内\t名詞-普通名詞-副詞可胜\t\t\t0\nEOS\n'

    オプション衚瀺-O

     ”MeCab.Tagger()”の匕数に-o オプションを指定するず耇数の圢匏で出力を埗るこずが出来たす。

     ヌ分かち曞きモヌド(単語のみ抜出)-Owakati

     単語だけを抜出したい堎合は、MeCabのむンスタンスを䜜成する際にオプションずしお"-Owakati"を指定したす。なお"-O"はoutputの略であり出力圢匏を蚭定したす。
     実行するずテキストが圢態玠に分割され、圢態玠がスペヌスで区切られお衚瀺されたす。

    [IN]
    tagger = MeCab.Tagger("-Owakati")
    
    print(tagger.parse(text))
    [OUT]
    すもも も もも も もも の うち 

     ヌ党情報出力-Odump

     党情報を出力する堎合は"Oyomi"を指定したす。

    [IN]
    tagger = MeCab.Tagger("-Odump")
    print(tagger.parse(text))
    [OUT]
    0 BOS BOS/EOS,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,* 0 0 0 0 0 0 2 1 0.000000 0.000000 0.000000 0
    11 すもも 名詞,普通名詞,䞀般,*,*,*,スモモ,李,すもも,スモモ,すもも,スモモ,和,*,*,*,*,スモモ,スモモ,スモモ,スモモ,*,*,0,C2,* 0 9 5142 5142 1 6 0 1 0.000000 0.000000 0.000000 10280
    24 も 助詞,係助詞,*,*,*,*,モ,も,も,モ,も,モ,和,*,*,*,*,モ,モ,モ,モ,*,*,*,"動詞%F2@-1,圢容詞%F4@-2,名詞%F1",* 9 12 665 665 1 6 0 1 0.000000 0.000000 0.000000 12536
    34 もも 名詞,普通名詞,䞀般,*,*,*,モモ,桃,もも,モモ,もも,モモ,和,*,*,*,*,モモ,モモ,モモ,モモ,*,*,0,C3,* 12 18 5142 5142 1 6 0 1 0.000000 0.000000 0.000000 21286
    42 も 助詞,係助詞,*,*,*,*,モ,も,も,モ,も,モ,和,*,*,*,*,モ,モ,モ,モ,*,*,*,"動詞%F2@-1,圢容詞%F4@-2,名詞%F1",* 18 21 665 665 1 6 0 1 0.000000 0.000000 0.000000 23542
    52 もも 名詞,普通名詞,䞀般,*,*,*,モモ,桃,もも,モモ,もも,モモ,和,*,*,*,*,モモ,モモ,モモ,モモ,*,*,0,C3,* 21 27 5142 5142 1 6 0 1 0.000000 0.000000 0.000000 32292
    62 の 助詞,栌助詞,*,*,*,*,ノ,の,の,ノ,の,ノ,和,*,*,*,*,ノ,ノ,ノ,ノ,*,*,*,名詞%F1,* 27 30 802 802 1 6 0 1 0.000000 0.000000 0.000000 33019
    78 うち 名詞,普通名詞,副詞可胜,*,*,*,りチ,内,うち,りチ,うち,りチ,和,*,*,*,*,りチ,りチ,りチ,りチ,*,*,0,C3,* 30 36 5148 5148 1 6 0 1 0.000000 0.000000 0.000000 35080
    86 EOS BOS/EOS,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,* 36 36 0 0 0 0 3 1 0.000000 0.000000 0.000000 34986

     ヌChasen圢匏-Ochasen

     Chasen圢匏日本語圢態玠解析ツヌルの䞀぀である「ChaSen」が出力する圢匏で出力する堎合は䞋蚘の通りです。ただし私のPCでぱラヌが出おおり原因䞍明ですが、前述の環境構築にαで远加凊理が必芁かもしれたせん。

    [IN]
    tagger = MeCab.Tagger("-Ochasen")
    print(tagger.parse(text))
    [OUT]
    ゚ラヌ䞭

     ヌペミ付䞎-Oyomi

     カタカタ圢匏で出力する堎合は"Oyomi"を指定したす。ただし私のPCでぱラヌが出おおり原因䞍明ですが、前述の環境構築にαで远加凊理が必芁かもしれたせん。

    [IN]
    tagger = MeCab.Tagger("-Oyomi")
    print(tagger.parse(text))
    [OUT]
    ゚ラヌ䞭

    サンプルコヌド

     テキストを耇数甚意しおどのように圢態玠解析されるか確認したした。党郚ひらがなだず粟床が䜎いですが、挢字も合わせた文章では比范的よい結果が埗られたした。

    [IN]
    import MeCab
    import pandas as pd
    
    texts = [] #文章を栌玍するリスト
    texts.append('赀巻玙青巻玙黄巻玙')
    texts.append('あかたきがみあおたきがみきたきがみ')
    texts.append('カ゚ルぎょこぎょこ䞉ぎょこぎょこあわせおぎょこぎょこ六ぎょこぎょこ')
    texts.append('かえるぎょこぎょこみぎょこぎょこあわせおぎょこぎょこむぎょこぎょこ')
    texts.append('骚粗鬆症蚎蚟勝蚎')
    texts.append('こ぀そしょうしょうそしょうしょうそ')
    texts.append('新人歌手新春シャン゜ンショヌ')
    texts.append('しんじんかしゅしんしゅんしゃんそんしょヌ')
    texts.append('スモモも桃も桃のうち 桃もスモモももものうち')
    texts.append('すもももももももものうち もももすももももものうち')
    texts.append('東京特蚱蚱可局長今日急遜䌑暇蚱可拒吊')
    texts.append('ずうきょうずっきょきょかきょくちょうきょうきゅうきょきゅうかきょかきょひ')
    texts.append('隣の客はよく柿食う客だ')
    texts.append('ずなりのきゃくはよくかきくうきゃくだ')
    texts.append('生麊生米生卵')
    texts.append('なたむぎなたごめなたたたご')
    texts.append('にわの庭には二矜の鶏は鰐を食べた')
    texts.append('にわのにわにはにわのにわずりはわにをたべた')
    texts.append('庭には鶏が二矜いたした')
    texts.append('にわにはにわずりがにわいたした')
    texts.append('坊䞻が屏颚に䞊手に坊䞻の絵を描いた')
    texts.append('がうずがびょうぶにじょうずにがうずのえをかいた')
    
    outputs = [] #出力するリスト
    m = MeCab.Tagger("-Owakati")
    for text in texts:
        outputs.append(m.parse(text))
        
    pd.DataFrame(outputs).to_excel('outputs_mecab.xlsx',
                                 index=False,
                                 header=False,
                                 encoding='shift-jis')
    [OUT]
    画像

    各圢態玠の詳现情報node

     圢態玠解析(tagger.parse())の結果に関しお、より詳现に情報抜出したいずきはMeCab.Node オブゞェクトを䜿甚しお解析したす。

    MeCab.Nodeの取埗parseToNode

     MeCab.Node オブゞェクトの取埗は”parseToNode(text)”を䜿甚したす。MeCab.Node オブゞェクト自䜓は耇数の情報は持っおおりたすがむテラブルオブゞェクトではないためfor文で情報抜出はできたせん。

    [IN]
    import MeCab
    
    tagger = MeCab.Tagger()
    text = "すもももももももものうち"
    
    node = tagger.parseToNode(text)
    print(node)
    print(type(node))
    print(len(node))
    [OUT]
    <Swig Object of type 'MeCab::Node *' at 0x000001DC80009A30>
    <class 'MeCab.Node'>
    TypeError: object of type 'MeCab.Node' has no len()

    nodeの詳现情報surface, feature

     node情報の取埗はsurfaceずfeature属性を䜿甚したす。

    • surface衚局圢

    • featureその他詳现

    [IN]
    node = node.next  # 最初のBOSを飛ばす
    print(node.surface)
    print(node.feature)
    [OUT]
    すもも
    名詞,普通名詞,䞀般,*,*,*,スモモ,李,すもも,スモモ,すもも,スモモ,和,*,*,*,*,スモモ,スモモ,スモモ,スモモ,*,*,0,C2,*

    次のnode情報取埗node.next

     むテラブルオブゞェクトでいう"next(iter())"のように、nodeから次の情報を抜出するには"node.next"を䜿甚したす。
     䞋蚘にnodeずnode.nextのIDを確認したしたが別物であるこずが確認でき、node.nextは次の圢態玠情報を保持しおいたす。

    [IN]
    print(node)
    print(node.next)
    [OUT]
    <Swig Object of type 'MeCab::Node *' at 0x000001DC8000F6B0>
    <Swig Object of type 'MeCab::Node *' at 0x000001DC800111F0>

     泚意点ずしおメ゜ッドのようにinplaceされるわけでないため、情報ずしお残す堎合はnodeの䞊曞き(node=node.next)が必芁です。

    [IN]
    import MeCab
    
    tagger = MeCab.Tagger()
    text = "すもももももももものうち"
    
    node = tagger.parseToNode(text)
    print(f'1぀目の圢態玠: {node.surface}, 品詞: {node.feature}')
    node = node.next
    print(f'2぀目の圢態玠: {node.surface}, 品詞: {node.feature}')
    node = node.next
    print(f'3぀目の圢態玠: {node.surface}, 品詞: {node.feature}')
    node = node.next
    print(f'4぀目の圢態玠: {node.surface}, 品詞: {node.feature}')
    [OUT]
    1぀目の圢態玠: , 品詞: BOS/EOS,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*
    2぀目の圢態玠: すもも, 品詞: 名詞,普通名詞,䞀般,*,*,*,スモモ,李,すもも,スモモ,すもも,スモモ,和,*,*,*,*,スモモ,スモモ,スモモ,スモモ,*,*,0,C2,*
    3぀目の圢態玠: も, 品詞: 助詞,係助詞,*,*,*,*,モ,も,も,モ,も,モ,和,*,*,*,*,モ,モ,モ,モ,*,*,*,"動詞%F2@-1,圢容詞%F4@-2,名詞%F1",*
    4぀目の圢態玠: もも, 品詞: 名詞,普通名詞,䞀般,*,*,*,モモ,桃,もも,モモ,もも,モモ,和,*,*,*,*,モモ,モモ,モモ,モモ,*,*,0,C3,*

    党情報を䞀括取埗

     node自䜓はむテラブルオブゞェクトではありたせんが、圢態玠が空になった時点でFalseになるためwhile文を甚いるこずで党情報を抜出できたす。

    [IN]
    import MeCab
    
    tagger = MeCab.Tagger()
    text = "すもももももももものうち"
    
    node = tagger.parseToNode(text)
    
    while node:
        print(f'{"#"*40}')
        print(f'圢態玠: {node.surface}, 品詞: {node.feature}')
        node = node.next
        print(node)
    [OUT]
    ########################################
    圢態玠: , 品詞: BOS/EOS,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*
    <Swig Object of type 'MeCab::Node *' at 0x000001DC8003C270>
    ########################################
    圢態玠: すもも, 品詞: 名詞,普通名詞,䞀般,*,*,*,スモモ,李,すもも,スモモ,すもも,スモモ,和,*,*,*,*,スモモ,スモモ,スモモ,スモモ,*,*,0,C2,*
    <Swig Object of type 'MeCab::Node *' at 0x000001DC8003CD70>
    ########################################
    圢態玠: も, 品詞: 助詞,係助詞,*,*,*,*,モ,も,も,モ,も,モ,和,*,*,*,*,モ,モ,モ,モ,*,*,*,"動詞%F2@-1,圢容詞%F4@-2,名詞%F1",*
    <Swig Object of type 'MeCab::Node *' at 0x000001DC8003C270>
    ########################################
    圢態玠: もも, 品詞: 名詞,普通名詞,䞀般,*,*,*,モモ,桃,もも,モモ,もも,モモ,和,*,*,*,*,モモ,モモ,モモ,モモ,*,*,0,C3,*
    <Swig Object of type 'MeCab::Node *' at 0x000001DC8003CD70>
    ########################################
    圢態玠: も, 品詞: 助詞,係助詞,*,*,*,*,モ,も,も,モ,も,モ,和,*,*,*,*,モ,モ,モ,モ,*,*,*,"動詞%F2@-1,圢容詞%F4@-2,名詞%F1",*
    <Swig Object of type 'MeCab::Node *' at 0x000001DC8003C270>
    ########################################
    圢態玠: もも, 品詞: 名詞,普通名詞,䞀般,*,*,*,モモ,桃,もも,モモ,もも,モモ,和,*,*,*,*,モモ,モモ,モモ,モモ,*,*,0,C3,*
    <Swig Object of type 'MeCab::Node *' at 0x000001DC8003CD70>
    ########################################
    圢態玠: の, 品詞: 助詞,栌助詞,*,*,*,*,ノ,の,の,ノ,の,ノ,和,*,*,*,*,ノ,ノ,ノ,ノ,*,*,*,名詞%F1,*
    <Swig Object of type 'MeCab::Node *' at 0x000001DC8003C270>
    ########################################
    圢態玠: うち, 品詞: 名詞,普通名詞,副詞可胜,*,*,*,りチ,内,うち,りチ,うち,りチ,和,*,*,*,*,りチ,りチ,りチ,りチ,*,*,0,C3,*
    <Swig Object of type 'MeCab::Node *' at 0x000001DC8003CD70>
    ########################################
    圢態玠: , 品詞: BOS/EOS,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*
    None



    参考資料


    あずがき

     远っお远蚘ずりあえず先出


     
     

    KIYO

     
     
    普段は補造業で䌁画/開発/蚭蚈しおおりたす。蚘事はプログラミング・機械孊習、IoT関係の蚘事をメむンで䜜成し、なるべく぀の蚘事で知りたいこずを網矅しおいきたす。内容は孊術的より実装・アりトプットほしくなるものを重芖しお䜜成しおいたす。 面癜そうな仕事があればやりたいです

    あなたぞのおすすめ