

pythonでMeCabで文章の処理をかけています。

[code]

    for text in df["msg_body"]:
        for line in mecab.parse(text).rstrip().splitlines():
            items = line.split("\t")
            if len(items) == 2:
                surface, feature = items
                if re.search("^(名詞|動詞,自立)", feature) and not\ 
                             re.search("^(BOS/EOS|名詞,数|記号)", feature):
                    small_list.append(surface)
                else:
                    surface=" "                    
                    small_list.append(surface)
    
[/code]

のように、対象の文章から、名詞と動詞のみ（名詞は数字と記号は抜かす）ように条件を与えています。  
ですが、出力結果の品詞をカウントしてみると、

[code]

    ['名詞', '一般', '*']        216
    ['動詞', '自立', '*']        139
    ['名詞', '固有名詞', '一般']     121
    ['名詞', 'サ変接続', '*']       63
    ['名詞', '固有名詞', '組織']      29
    ['名詞', '固有名詞', '人名']      28
    ['名詞', '固有名詞', '地域']      24
    ['副詞', '一般', '*']          7
    ['形容詞', '自立', '*']         7
    ['名詞', '形容動詞語幹', '*']      5
    
[/code]

と、除外した単語が入ってきます。  
これはどうしてでしょうか？  
MeCabではこのような不安定な挙動があるのでしょうか？  
もしくはコードが間違えているのでしょうか？  
よろしくお願いします。

### 追記 (コメントへの返信)

> feature には何が入っていますか？ MeCab のインスタンスはどうやって生成していますか？

featureはコードの通りです。`mecab = MeCab.Tagger("-b
5242880")`でパースしたものは基本的に単語と品詞（ここではsurfaceとfeature）に分けられますので。mecabインスタンスは上記のとおりです。dfはテキストが入っているデータフレームです。small_listは条件をクリアした単語のみ格納するただのリストです。

> 条件を満たすものは `surface` だけしか集めていないのに、どうやってフィルター後の `feature` を数えているのですか？

残った単語を再度パースしているだけです。


CC BY-SA 4.0
2019-02-18T09:01:55.223
52850
2019-02-19T09:57:08.053
2019-02-19T06:10:05.210
19110
32225
question
python 正規表現 pandas mecab
除外した品詞が除外できていない


「あった」を解析すると(辞書にもよりますが)

[code]

    あっ  動詞,自立,*,*,五段・ラ行,連用タ接続,ある,アッ,アッ
    た   助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
    
[/code]

となって、この表層「あっ」だけ再度解析したら、 **当然**

[code]

    あっ  感動詞,*,*,*,*,*,あっ,アッ,アッ
    
[/code]

という結果になりますよね。

追記

[code]

                if re.search("^(名詞|動詞,自立)", feature) and not\ 
                             re.search("^(BOS/EOS|名詞,数|記号)", feature):
    
[/code]

のコードには特に問題はありません。

[code]

                if re.search("^(名詞|動詞,自立)", feature) and not re.search("^名詞,数)", feature):
    
[/code]

でいいだろうとは思いましたが本質的な間違いではないです。


CC BY-SA 4.0
2019-02-19T06:07:23.123
52872
2019-02-19T09:57:08.053
2019-02-19T09:57:08.053
12274
12274
52850
answer