やりたいこと
scikit-learn
のTfidfVectorizer
を使用してtfidfを求める。
疑問
日本語の場合、引数analyzer
に形態素解析する関数を与えますよね。
このとき「文字列は同じだが、品詞の異なる形態素」はどのように扱われるのでしょうか?
get_feature_names()
の結果は2つが別々になっているのでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
ベストアンサー
定義したanalyzer
の仕様に依存します。surface
だけでやれば当然同じ形態素として扱われてしまいます。
シンプルな例。
$ mecab # 説明のためにコメントを付けます。本来入力はしていないもの 犬の鼻は良い # 入力文 犬 名詞,一般,*,*,*,*,犬,イヌ,イヌ の 助詞,連体化,*,*,*,*,の,ノ,ノ # 助詞の「の」 鼻 名詞,一般,*,*,*,*,鼻,ハナ,ハナ は 助詞,係助詞,*,*,*,*,は,ハ,ワ 良い 形容詞,自立,*,*,形容詞・アウオ段,基本形,良い,ヨイ,ヨイ EOS 転んだのは誰 # 入力文 転ん 動詞,自立,*,*,五段・バ行,連用タ接続,転ぶ,コロン,コロン だ 助動詞,*,*,*,特殊・タ,基本形,だ,ダ,ダ の 名詞,非自立,一般,*,*,*,の,ノ,ノ # 形式名詞の「の」 は 助詞,係助詞,*,*,*,*,は,ハ,ワ 誰 名詞,代名詞,一般,*,*,*,誰,ダレ,ダレ EOS
それぞれの助詞の「の」と、いわゆる形式名詞の「の」があります。
以下の場合は区別されません。
python
1import MeCab 2from sklearn.feature_extraction.text import TfidfVectorizer 3 4def analyzer(s): 5 tagger = MeCab.Tagger() 6 tagger.parse("") 7 node = tagger.parseToNode(s).next 8 result = [] 9 while node.next: 10 result.append(node.surface) 11 node = node.next 12 return result 13 14data = ["犬の鼻は良い", "転んだのは誰"] 15 16tfidf = TfidfVectorizer(analyzer=analyzer) 17X = tfidf.fit_transform(data) 18print(tfidf.get_feature_names()) 19print(X.toarray()) 20 21""" => 22['だ', 'の', 'は', '犬', '良い', '誰', '転ん', '鼻'] 23[[0. 0.35520009 0.35520009 0.49922133 0.49922133 0. 0. 0.49922133] 24 [0.49922133 0.35520009 0.35520009 0. 0. 0.49922133 0.49922133 0. ]] 25""" 26
抽出される「形態素」にほどほどの品詞情報を混ぜれば区別は可能です。要は文字列として異なっていれば良いので。
python
1import MeCab 2from sklearn.feature_extraction.text import TfidfVectorizer 3 4def analyzer(s): 5 tagger = MeCab.Tagger() 6 tagger.parse("") 7 node = tagger.parseToNode(s).next 8 result = [] 9 while node.next: 10 result.append(node.surface + "\t" 11 + ",".join(node.feature.split(",")[:2])) 12 node = node.next 13 return result 14 15data = ["犬の鼻は良い", "転んだのは誰"] 16 17tfidf = TfidfVectorizer(analyzer=analyzer) 18X = tfidf.fit_transform(data) 19print(tfidf.get_feature_names()) 20print(X.toarray()) 21 22""" => 23['だ\t助動詞,*', 'の\t助詞,連体化', 'の\t名詞,非自立', 'は\t助詞,係助詞', '犬\t名詞,一般', '良い\t形容詞,自立', '誰\t名詞,代名詞', '転ん\t動詞,自立', '鼻\t名詞,一般'] 24[[0. 0.47107781 0. 0.33517574 0.47107781 0.47107781 0. 0. 0.47107781] 25 [0.47107781 0. 0.47107781 0.33517574 0. 0. 0.47107781 0.47107781 0. ]] 26""" 27
余談ですが、文字列である必要も実はなく、tupleとかでも問題ないはずです。
python
1import MeCab 2from sklearn.feature_extraction.text import TfidfVectorizer 3 4def analyzer(s): 5 tagger = MeCab.Tagger() 6 tagger.parse("") 7 node = tagger.parseToNode(s).next 8 result = [] 9 while node.next: 10 result.append((node.surface, *node.feature.split(",")[:2])) 11 node = node.next 12 return result 13 14data = ["犬の鼻は良い", "転んだのは誰"] 15 16tfidf = TfidfVectorizer(analyzer=analyzer) 17X = tfidf.fit_transform(data) 18print(tfidf.get_feature_names()) 19print(X.toarray()) 20 21""" => 22[('だ', '助動詞', '*'), ('の', '助詞', '連体化'), ('の', '名詞', '非自立'), ('は', '助詞', '係助詞'), ('犬', '名詞', '一般'), ('良い', '形容詞', '自立'), ('誰', '名詞', '代名詞'), ('転ん', '動詞', '自立'), ('鼻', '名詞', '一般')] 23[[0. 0.47107781 0. 0.33517574 0.47107781 0.47107781 0. 0. 0.47107781] 24 [0.47107781 0. 0.47107781 0.33517574 0. 0. 0.47107781 0.47107781 0. ]] 25""" 26
投稿2019/10/29 08:20
編集2019/10/29 08:21総合スコア30935
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。