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

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

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

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python 3.x

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

リストボックス

ユーザーがリストから1つ以上のアイテムを選択できるようにするGUI要素です。

Q&A

解決済

1回答

3162閲覧

tf(Term Frequency)とdf(Document Frequency)の求め方

退会済みユーザー

退会済みユーザー

総合スコア0

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python 3.x

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

リストボックス

ユーザーがリストから1つ以上のアイテムを選択できるようにするGUI要素です。

0グッド

0クリップ

投稿2017/11/07 04:41

編集2017/11/07 07:16

記事ごとの名詞を格納した2次元リスト
イメージとして
noun = [['私','子育て','問題','問題']['トランプ','今朝','会談','来日']・・・]
「私、子育て、問題」は記事1の名詞集、「トランプ、今朝、会談、来日」は記事2の名詞集
みたいなものを作りました。

そして以下のようにtfとdfを定義して求めたいと思いました。
tf = ある単語の記事内での出現回数 / 記事内のすべての単語の出現回数の和
例えば上の例なら、私:1/4 子育て:1/4 問題:2/4
df = ある単語が出現する記事の数
例えば私という単語が他の記事5つにも出てくるなら私のdf値は5です。

それでtfを求めるためにCounterのmost_commonを使って全単語の出現回数をカウントすることはできたのですが、この出現回数を全部足しすのどうやるんだってところで詰んでしまいました。。。

tfとdfを求めるためのアルゴリズム、手順をご教授いただけないでしょうか(汗)

<追記>コードはこんな感じです。
nounsというリストが上で説明したような名刺を入れている2次元のリストになります。
また、jupyter notebookでコードを書いています。

from collections import Counter def flatten_2dim(array): return [item for sublist in array for item in sublist] counter = Counter(flatten_2dim(nouns)) for word, cnt in counter.most_common(): print(word, cnt)

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

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

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

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

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

can110

2017/11/07 05:50

途中までで良いのでコードを提示ください。
退会済みユーザー

退会済みユーザー

2017/11/07 07:17

すみません、そうですよね。。。
guest

回答1

0

ベストアンサー

tfは、記事毎に、さらに(記事内の)単語毎に値を持ちます。
dfは、単語毎に値を持ちます。

提示コードでは元データを1次元化することで記事毎の情報が抜け落ちてしまっています。
少なくともtf記事毎のループで算出する必要があります。

Counterを使っても良いのですが、どうせtfは 頻度 / 合計で算出しなければならないので
以下のように単純なリストと辞書で実装してもよいと思います。

Python

1nouns = [['ブドウ','バナナ'], 2 ['レモン','レモン','バナナ','ブドウ'], 3 ['ブドウ']] 4 5tfs = [] # 記事毎のリスト。リスト要素は記事内の単語毎のtf値 6dfs = {} # 単語毎のdf値 7for idx,doc in enumerate(nouns): # idx=記事番号 8 tf = {} 9 for term in doc: 10 TERM_CNT = len(doc) # 記事内の単語数 11 12 # (記事内の)単語毎のtf値 13 if term not in tf: 14 tf[term] = 0 15 tf[term] += 1 / TERM_CNT # コード短縮のため、割り込むと同時に足す 16 17 # 単語毎のdf値 18 if term not in dfs: 19 dfs[term] = set() 20 dfs[term].add(idx) # 集合(set)で記事番号(idx)を保持 21 22 tfs.append(tf) 23 24# 記事番号の集合の大きさ=出現数 25for term,doc_set in dfs.items(): 26 dfs[term] = len(doc_set) 27 28print('nouns:',nouns) 29print('tfs:',tfs) 30print('dfs:',dfs) 31""" 32nouns: [['ブドウ', 'バナナ'], ['レモン', 'レモン', 'バナナ', 'ブドウ'], ['ブドウ']] 33tfs: [{'バナナ': 0.5, 'ブドウ': 0.5}, {'レモン': 0.5, 'ブドウ': 0.25, 'バナナ': 0.25}, {'ブドウ': 1.0}] 34dfs: {'バナナ': 2, 'ブドウ': 3, 'レモン': 1} 35"""

投稿2017/11/07 07:34

can110

総合スコア38256

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

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

退会済みユーザー

退会済みユーザー

2017/11/08 05:14

なるほどです!理解しました! 勉強になります、分かりやすい解説どうもありがとうございましたm(__)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問