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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

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

Mecab

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

Python

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

自然言語処理

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

Q&A

解決済

1回答

654閲覧

TF-IDFを使ってFAQに回答するコードの理解できない部分に関して

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

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

Mecab

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

Python

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

自然言語処理

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

0グッド

0クリップ

投稿2018/09/05 21:59

編集2018/09/05 22:27

前提・実現したいこと

TF-IDFを使ってFAQに回答するという記事を読みながら実装を進めています。
TF-IDF値が高い順に出力を得ることを実現したいです。

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

以下のコードのコメントアウトされている部分のvectorizer.vocabulary_.items()が何を指しているのか理解できません。何を指しているのか教えていただきたいです。
検索でもこの部分を説明したものは出てきませんでした。

#for k,v in vectorizer.vocabulary_.items(): # print(k, v)

該当のソースコード

from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.metrics.pairwise import cosine_similarity import numpy as np import MeCab import argparse parser = argparse.ArgumentParser(description="convert csv") parser.add_argument("input", type=str, help="faq tsv file") parser.add_argument("--dictionary", "-d", type=str, help="mecab dictionary") parser.add_argument("--stop_words", "-s", type=str, help="stop words list") args = parser.parse_args() mecab = MeCab.Tagger("-Owakati" + ("" if not args.dictionary else " -d " + args.dictionary)) questions = [] answers = [] for line in open(args.input, "r", encoding="utf-8"): cols = line.strip().split('\t') questions.append(mecab.parse(cols[0]).strip()) answers.append(cols[1]) stop_words = [] if args.stop_words: for line in open(args.stop_words, "r", encoding="utf-8"): stop_words.append(line.strip()) vectorizer = TfidfVectorizer(token_pattern="(?u)\b\w+\b", stop_words=stop_words) vecs = vectorizer.fit_transform(questions) #for k,v in vectorizer.vocabulary_.items(): # print(k, v) while True: line = input("> ") if not line: break index = np.argmax(cosine_similarity(vectorizer.transform([mecab.parse(line)]), vecs)) print(questions[index]) print() print(answers[index]) print()

試したこと

類似するコードが載っていた記事を使って、vectorizer.vocabulary_.items()の振る舞いを確認しようとしましたが、
sortを行うとあいうえお順に出力され、sortをしないとただ分かち書きされた単語が順番に出力されるだけだったので、TF-IDF値が高い順に並べることはできないのでしょうか。

python

1import numpy as np 2from sklearn.feature_extraction.text import TfidfVectorizer 3 4np.set_printoptions(precision=2) 5 6docs = np.array([ 7 'みぞれ とは 何ですか?', # 文書1 8 '台風 と ハリケーン の 違いは?', # 文書2 9 '異常気象 に ついて' 10 ]) 11 12vectorizer = TfidfVectorizer(use_idf=True) 13vecs = vectorizer.fit_transform(docs) 14 15print (vecs.toarray()) 16for k,v in sorted(vectorizer.vocabulary_.items(), key=lambda x:x[1]): 17 print (k)
[[ 0. 0.58 0.58 0. 0.58 0. 0. 0. ] [ 0. 0. 0. 0.58 0. 0.58 0. 0.58] [ 0.71 0. 0. 0. 0. 0. 0.71 0. ]] ついて とは みぞれ ハリケーン 何ですか 台風 異常気象 違いは

補足情報(FW/ツールのバージョンなど)

Python 3.6.0 :: Anaconda 4.3.0

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

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

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

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

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

guest

回答1

0

ベストアンサー

ドキュメントに説明があります。

vocabulary_ : dict

A mapping of terms to feature indices.

sklearn.feature_extraction.text.TfidfVectorizer — scikit-learn 0.19.2 documentation

あとは実際にprintしてみた方がわかりやすいかと。

投稿2018/09/05 22:25

hayataka2049

総合スコア30933

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

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

退会済みユーザー

退会済みユーザー

2018/09/05 22:28

ご回答いただきましてありがとうございます。 実際にprintしてみたのですが、TF-IDF値が高い順には単語が出力されているわけではないことがわかりました。
hayataka2049

2018/09/05 22:31

vocabulary_はただの語彙表ですので、そのコードでは正しい動作になっているかと 目的のものは、抽出されたTF-IDFのベクトルに対してargsort等を用いて取り出せると思います
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問