MENU

python ストップワードの除去

ストップワードとはあまりにも利用頻度が高い言葉であるために、処理対象外とする単語のことである。例えば助詞や助動詞など(が、の、です、ます)がそれに該当する。

どのような場面でストップワードの除去を行うかというと例えば形態素解析した結果を機械学習させて文章の意図を判定する場合、利用頻度が高いが意図の判定に利用できない単語は除去しておく方が精度を向上させることができる。

ストップワードの除去には様々な方法があるが今回のプログラムでは形態素解析の結果の品詞情報を利用して除去していく。

f:id:hanamichi_sukusuku:20210116223411p:plain

実行結果

f:id:hanamichi_sukusuku:20210116223135p:plain

名詞、動詞、形容詞の場合のみ出力することでストップワードを除去している。

 

parseToNode()メソッド

parse()メソッドが文字列を返すのに対してparseToNode()メソッドはMeCab.Nodeクラスオブジェクトを返す。parseToNode()メソッドに渡した文章はnodeクラスに格納されて解析結果を呼び出すにはクラスメソッドを使用する必要がある。つまり部分的に解析結果を取得したい場合はこのメソッドを使用する認識でいいと思う。

繰り返し処理で呼び出す必要があるのでwhile文を使用して要素を取得していく。

 

ストップワードを除去したリストの作成

result = []
while node is not None:
  # 品詞情報取得 --- (*2)
  hinshi = node.feature.split(",")[0]
   if hinshi in ["名詞"]:
  # 表層形の取得 --- (*3)
    result.append(node.surface)
   elif hinshi in ["動詞", "形容詞"]:
  # 形態素情報から原形情報を取得 --- (*4)
     result.append(node.feature.split(",")[6])
  node = node.next

変数nodeがNoneでない時間繰り返し処理をする。

feature()メソッドで品詞情報の取得。feature()メソッドでは単語の表層形以外の情報を文字列で取得できる。

 

今回のwhile文の中でprint(node.feature)を行った結果

f:id:hanamichi_sukusuku:20210116230017p:plain

表層形以外の情報を文字列で取得している。

 

これをsplitメソッドで[,]で区切ったリストを作成し直し、インデックス番号が0(リストの先頭)の要素を取得することで品詞情報を取得している。

 

if hinshi in ["名詞"]:の部分では変数hinshiに["名詞"]が含まれている時、surface()メソッドで表層形を取得し、最終的に出力するリストに追加している。

 

elif hinshi in ["動詞", "形容詞"]:の部分では変数hinshiに動詞、形容詞が含まれている時feature()メソッドを利用して原型情報を取得してリストに追加している。ストップワードの除去には関係ないが動詞や形容詞の場合、送り仮名などに違いが出るためこのように原型を取得してリストに追加している。

 

node.nextでオブジェクト内の次の要素に処理を行うため次のデータをnode.nextで取得し変数nodeに格納することで無限ループの阻止と次のデータの処理を行っている。