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

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

新規登録して質問してみよう
ただいま回答率
85.50%
機械学習

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

Python

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

自然言語処理

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

Q&A

解決済

3回答

1319閲覧

tfidfのこーどで素数名と計算結果の関係

sequelanonymous

総合スコア123

機械学習

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

Python

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

自然言語処理

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

0グッド

1クリップ

投稿2019/04/15 10:33

編集2019/04/16 04:17

s に入るデータは、mecabによって分かち書きさえれた日本語の文章がリストではいっています。
なぜか、アウトプットの数をカウントするとずれます。
色々、試してやっいますが、少ない量だと差分がでないです。
何が原因がお気づきの方、ご教示頂けると大変助かります。

python

1 2from sklearn.feature_extraction.text import TfidfVectorizer 3vectorizer = TfidfVectorizer() 4X = vectorizer.fit_transform(s) 5data = X.data 6features = vectorizer.get_feature_names() 7output = [(data[i], features[i]) for i in range(len(data))] 8 9> data 10array([0.04610715, 0.05050163, 0.04156941, ..., 0.04623194, 0.04623194, 11 0.04623194]) 12> len(data) 132012 14> len(features) 151088

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

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

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

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

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

quickquip

2019/04/16 00:06

タグの 機械語 は 機械学習 を付けようとして間違えたのではないでしょうか?
sequelanonymous

2019/04/16 01:17

> タグの 機械語 とは、どのことを言っていますでしょうか?
quickquip

2019/04/16 01:56

質問のタグが Python 自然言語処理 機械語 になってますよ。
sequelanonymous

2019/04/16 04:17

ありがとうございます。修正しました
guest

回答3

0

fit_transformの返り値が何かを調べていないのが問題。

fit_transformの返り値はscipy.sparse.csr_matrix型つまりsparse matrix(疎な行列)で、大部分が0な行列を効率よく表現するためのデータ構造。data属性は「データがあるところ」の分のデータだけが格納されている。

https://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.csr_matrix.html
の例を見るべき。

投稿2019/04/15 14:38

編集2019/04/15 14:38
quickquip

総合スコア11029

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

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

sequelanonymous

2019/04/16 01:18

ありがとうございます。すみません、データのないところとは、どういうケースのことでしょうか?
sequelanonymous

2019/04/16 04:17

ありがとうございます。理解しました。
guest

0

TfidfVectorizer詳しくないですが、単に単語が重複しているからではないでしょうか?

Python

1from sklearn.feature_extraction.text import TfidfVectorizer 2vectorizer = TfidfVectorizer() 3X = vectorizer.fit_transform(['今日 から 働く きっと 働く', '明日 から また 天気 が よく なる', 'これから 頑張る']) 4data = X.data 5features = vectorizer.get_feature_names() 6#output = [(data[i], features[i]) for i in range(len(data))] 7print(data) # [0.38988801 0.29651988 0.77977602 0.38988801 0.32200242 0.42339448 8 # 0.42339448 0.42339448 0.42339448 0.42339448 0.70710678 0.70710678] 9print(features) # ['から', 'きっと', 'これから', 'なる', 'また', 'よく', '今日', '働く', '天気', '明日', '頑張る'] 10print(len(data)) # 12 11print(len(features)) # 11

投稿2019/04/15 11:49

編集2019/04/15 12:57
can110

総合スコア38233

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

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

sequelanonymous

2019/04/15 12:51 編集

お気づきありがとうございます。確認してみましたが、以下のような結果になりました。 len(set(data)) 424 len(set(features)) 1088 もしかしたら、私のデータの入れ方がおかしいのかもしれません。 私はいかのように分かち書きをしていれています。複数の文章, でわけて、単語間は、スペースで分かち書きしてinputしています。 ['今日 から 働く きっと 働く’, '明日 から また 天気 が よく なる', 'これから 頑張る'] なにか、お気づきの点ありましたらご指摘して頂けると助かります。
can110

2019/04/15 13:05

> 私はいかのように分かち書きをしていれています。複数の文章, でわけて、単語間は、スペースで分かち書きしてinputしています。 ['今日 から 働く きっと 働く’, '明日 から また 天気 が よく なる', 'これから 頑張る'] 上記に合わせ回答コードを修正しました。 このコード結果でいくとdataの要素数は分かち書きされた単語数、featuresの要素数は重複を除いた単語数になっているかと思います。 なお、data変数値が何を表すか忘れてしまったのですが、単純にset(data)すると単純に同じ数値の重複を除くことになるので不味いような気がします。 もし何か分かれば、またコメントできればと思います。
sequelanonymous

2019/04/16 01:19

ありがとうございます。 len(vectorizer.vocabulary_)とlen(vectorizer.idf_)で正しい数が取れました。 となると、X.dataがなんのデータだったのかいまいち不明のままですが。
can110

2019/04/16 02:01

quiquiさんの回答どおり、(私も含め)ちゃんとマニュアルを読むべきでしょうね。
guest

0

自己解決

countvectorizerを利用することで本題の質問の本質を解決しました。

tfのデータ個数は以下。

python

1 from sklearn.feature_extraction.text import CountVectorizer 2 import numpy as np 3 4 c_vec = CountVectorizer() 5 bag_of_words = c_vec.fit_transform(texts) 6 one_hot_vector = bag_of_words.toarray() 7 one_hot_vector_count = np.sum(a=one_hot_vector, axis=0) 8 9 for word, count in zip(c_vec.get_feature_names(), one_hot_vector_count): 10 print(word, count)

idfのデータ個数は以下。

from sklearn.feature_extraction.text import TfidfVectorizer t_vec = TfidfVectorizer(token_pattern=r"(?u)\b\w\w+\b") len(t_vec.vocabulary_) len(t_vec.idf_)

投稿2019/04/16 04:20

編集2019/04/16 04:35
sequelanonymous

総合スコア123

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

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

quickquip

2019/04/16 04:23 編集

tfもidfも要らなかった(=欲しいのはtf-idfで重みがついた文書ベクタじゃなかった)ということ?
quickquip

2019/04/16 05:35

なるほど、tf-idfで計算済みの文書ベクタが欲しかったのではなくて、ボキャプラリのidfと、(tfの計算に使う)文書中の単語出現頻度を別々に取得したかったのですね。
sequelanonymous

2019/04/16 05:38

tf-idfについて勉強し始めたばかりだったのでその辺をはっきり明確にわけて質問できませんでした。コメントありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問