My Tech Life

Memo by a Japanese Software Developer in his late 50s.

Pythonで日本語処理ー分かち書き

Python自然言語処理を行うにあたり、

ブログの諸先輩方から知恵を借りて、

Mecab分かち書きする処理を作成。

 

この記事の末尾にソースを貼り付けておく。

 

このブログでの注意点として「self.tagger.parse("")」を追加。

これがないと、不定値の解析結果が紛れ込んでしまうっぽい。

 

そのまま動かしてテストできる形になっている。

「if __name__ == "__main__":」以降のdataリストのフレーズを分かち書きする。

(base) C:\PyTest\jobs_new2>python separatewordsj2.py

 

日本語の分かち書きで、CountVectorizerしたい場合は、

こうやって使う。 

#!/usr/bin/env python3
# -*- coding: utf8 -*-

from sklearn.feature_extraction.text import CountVectorizer

from separatewordsj2 import separatewordsj2

wd = separatewordsj2()

vec = CountVectorizer(analyzer=wd.extract_words)

 

以下のソースを「separatewordsj2.py」で保存する。

# -*- coding: utf-8 -*-

import MeCab

class separatewordsj2:
  INDEX_CATEGORY = 0
  INDEX_ROOT_FORM = 6
  TARGET_CATEGORIES = ["助詞","名詞","動詞","形容詞","副詞","連体詞","感動詞","助動詞"]

  def __init__(self, dictionary="-Ochasen"):
    self.dictionary = dictionary
    self.tagger = MeCab.Tagger(self.dictionary)
    # for bug
    self.tagger.parse("")

  def extract_words(self, text):
    if not text:
      return [ ]

    words = [ ]
    node = self.tagger.parseToNode(text)
    while node:
      features = node.feature.split(",")
      #print(node.surface, features)
      if features[self.INDEX_CATEGORY] in self.TARGET_CATEGORIES:
        temp_words = features[self.INDEX_ROOT_FORM]
        if features[self.INDEX_ROOT_FORM] == "*":
          temp_words = node.surface
        words.append(temp_words)

      node = node.next

    return words

if __name__ == "__main__":

  data = [
    "オブジェクト指向言語を使用する",
    "蛙の「子」は変える",
    """私の名前!は
山田田中と申します""",
    "あれは●終わってしまった"
  ]

  wd = separatewordsj2()
  for d in data:
    ret = wd.extract_words(d)
    for r in ret:
      print(r)