質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Q&A

解決済

3回答

412閲覧

scikit-learn tfidf求め方

SAMUSAMUN

総合スコア32

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

0グッド

0クリップ

投稿2017/07/12 14:32

###前提・実現したいこと
pythonのscikit-learnを使い,tfidfを求めようと考えています.
形態素解析を行って,単語だけを集めたテキストファイルを読み込み,
値が0.5以上の単語だけを表示しようとしています.

###発生している問題・エラーメッセージ

Traceback (most recent call last): File "tfidf6.py", line 15, in <module> if vecs > 0.5: File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/scipy/sparse/base.py", line 183, in __bool__ raise ValueError("The truth value of an array with more than one " ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all().

###該当のソースコード

# -*- coding: utf-8 -*- import numpy as np from sklearn.feature_extraction.text import TfidfVectorizer np.set_printoptions(precision=2) f = open('part-time_negaword.txt', 'r')#読み込むファイルを開く text = f.read()#ファイルから全データを読み込む f.close()#ファイルを閉じる docs = np.array([text]) vectorizer = TfidfVectorizer(use_idf=True,token_pattern=u'(?u)\\b\\w+\\b',min_df=1.0) vecs = vectorizer.fit_transform(docs) if vecs > 0.5: print vecs.toarray()

###試したこと
多次元配列が問題となっていると書いていたんですが,イマイチ理解できずエラーが直せません.
どうかご協力お願い致します.

###補足情報(言語/FW/ツール等のバージョンなど)
OS X
python2系

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

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

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

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

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

guest

回答3

0

ベストアンサー

つい最近おなじような回答をした気がしますが、

結果を表示する部分は

Python

1if vecs > 0.5: 2 print(vecs.toarray())

ではなく、先に配列に変換(toarray())してから

Python

1TF_IDF = vecs.toarray() 2print(TF_IDF[TF_IDF>0.5])

のように書けます。

しかしながら、上記のように書くと何の単語のTF-IDF値が 0.5 以上なのか分からなくなるので、

np.where() を使い、条件に当てはまる値の配列の位置データを求めることで、行・単語(列データ)・TF-IDF値を同時に表示することができるようになります。

Python

1TF_IDF = vecs.toarray() 2terms = vectorizer.get_feature_names() #単語リスト 3x,y = np.where(TF_IDF>0.5) 4for pos in zip(x,y): 5 print(pos) # 位置を表示 6 print(TF_IDF[pos]) # TF-IDF値を表示 7 print(terms[pos[1]]) # 単語を表示

まとめるとこんな感じで書けます

Python

1TF_IDF = vecs.toarray() 2terms = vectorizer.get_feature_names() 3for idx, word in zip(*np.where(TF_IDF> 0.5)): 4 print("INDEX:{}, WORD:{}, TF-IDF:{}".format(idx, terms[word], TF_IDF[(idx,word)]))

投稿2017/07/12 16:15

magichan

総合スコア15898

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

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

swallowataill

2017/07/12 16:53

自分が回答したものよりもわかりやすく、見やすいですね 勉強になります
SAMUSAMUN

2017/07/13 07:48

ご回答ありがとうございます! おかげさまで解決することができました!
guest

0

python3系でTfidfVectorizer日常的に使用している者です

結果のvecsの中身がどうなっているか確認しましたか?
2系と得られるものは大差ないはずなので多分下記のようになっていると思います。
データ自体は同じように形態素解析の結果を使っていますが、データの都合上tfidf値の設定は行っていません。

python3

1 2vectorizer = TfidfVectorizer() 3dictionary2 = vectorizer.fit_transform(data) 4print(dictionary2) 5#(0, 996) 0.407322789896 6#(0, 887) 0.381311993422 7#(0, 259) 0.407322789896 8#(0, 118) 0.407322789896 9#(0, 1142) 0.282491647013 10#(0, 228) 0.362857039626 11#(0, 1276) 0.381311993422 12 : :

それを解釈した上で、tfidf値が高いものを引き出す場合、以下のような感じでやればできるんではないかと思います。
データの都合上0.4より大きいものを検知するようにしています

python3

1vectorizer = TfidfVectorizer() 2dictionary2 = vectorizer.fit_transform(data) 3print(dictionary2[0]) 4dictionary2 = dictionary2.toarray() 5vec = [] 6for i in range(len(dictionary2[0])): 7 if dictionary2[0][i] >0.4: 8 vec.append(i) 9print(vec) 10for i in range(len(vec)): 11 print(vectorizer.get_feature_names()[vec[i]])

出力結果がこれです

python3

1print(dictionary2[0]) 2 (0, 996) 0.407322789896 3 (0, 887) 0.381311993422 4 (0, 259) 0.407322789896 5 (0, 118) 0.407322789896 6 (0, 1142) 0.282491647013 7 (0, 228) 0.362857039626 8 (0, 1276) 0.381311993422 9 10print(vec) 11[118, 259, 996] 12 13print(vectorizer.get_feature_names()[vec[i]]) 14おやすみ 15つぶやき 16新緑

ここら辺のサイトなんかは参考になるんじゃないかと思います
http://qiita.com/katryo/items/f86971afcb65ce1e7d40

投稿2017/07/12 15:28

編集2017/07/12 15:31
swallowataill

総合スコア36

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

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

SAMUSAMUN

2017/07/13 07:49

とてもわかりやすくて参考になりました. ありがとうございます!!
guest

0

http://nishidy.hatenablog.com/entry/2016/04/23/120519
こちらを参考に

基本的にエラーメッセージで検索すれば解決できますのでまずはggrましょう。

投稿2017/07/12 14:51

_Victorique__

総合スコア1392

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

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

SAMUSAMUN

2017/07/13 07:50

今回も調べてみたのですがもっと自分で解決できるようにしようと思います. ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問