🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Mecab

Mecabは、オープンソースの形態素解析エンジンです。 言語、辞書、コーパスに依存しない汎用的な設計を基本方針としています。 Mecabの由来は、開発者の好物である和布蕪(めかぶ)から名づけられました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

自然言語処理

自然言語処理は、日常的に使用される自然言語をコンピューターに処理させる技術やソフトウェアの総称です。

Q&A

解決済

1回答

2164閲覧

scikit-learnでtfidfを求めることに関して

退会済みユーザー

退会済みユーザー

総合スコア0

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Mecab

Mecabは、オープンソースの形態素解析エンジンです。 言語、辞書、コーパスに依存しない汎用的な設計を基本方針としています。 Mecabの由来は、開発者の好物である和布蕪(めかぶ)から名づけられました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

自然言語処理

自然言語処理は、日常的に使用される自然言語をコンピューターに処理させる技術やソフトウェアの総称です。

0グッド

0クリップ

投稿2019/10/29 07:35

編集2019/10/29 08:00

やりたいこと

scikit-learnTfidfVectorizerを使用してtfidfを求める。

疑問

日本語の場合、引数analyzerに形態素解析する関数を与えますよね。

このとき「文字列は同じだが、品詞の異なる形態素」はどのように扱われるのでしょうか?

get_feature_names()の結果は2つが別々になっているのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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
hayataka2049

総合スコア30935

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問