質問: Counter(flatten_2dim(nouns)) for word, cnt in counter.most_common(): print(word, cnt) ```
回答: `tf`は、**記事毎**に、さらに(記事内の)**単語毎**に値を持ちます。 `df`は、**単語毎**に値を持ちます。 提示コードでは元データを1次元化することで**記事毎**の情報が抜け落ちてしまっています。 少なくとも`tf`は**記事毎**のループで算出する必要があります。 `Counter`を使っても良いのですが、どうせ`tf`は 頻度 / 合計で算出しなければならないので 以下のように単純なリストと辞書で実装してもよいと思います。 ``` nouns = [['ブドウ','バナナ'], ['レモン','レモン','バナナ','ブドウ'], ['ブドウ']] tfs = [] # 記事毎のリスト。リスト要素は記事内の単語毎のtf値 dfs = {} # 単語毎のdf値 for idx,doc in enumerate(nouns): # idx=記事番号 tf = {} for term in doc: TERM_CNT = len(doc) # 記事内の単語数 # (記事内の)単語毎のtf値 if term not in tf: tf[term] = 0 tf[term] += 1 / TERM_CNT # コード短縮のため、割り込むと同時に足す # 単語毎のdf値 if term not in dfs: dfs[term] = set() dfs[term].add(idx) # 集合(set)で記事番号(idx)を保持 tfs.append(tf) # 記事番号の集合の大きさ=出現数 for term,doc_set in dfs.items(): dfs[term] = len(doc_set) print('nouns:',nouns) print('tfs:',tfs) print('dfs:',dfs) """ nouns: [['ブドウ', 'バナナ'], ['レモン', 'レモン', 'バナナ', 'ブドウ'], ['ブドウ']] tfs: [{'バナナ': 0.5, 'ブドウ': 0.5}, {'レモン': 0.5, 'ブドウ': 0.25, 'バナナ': 0.25}, {'ブドウ': 1.0}] dfs: {'バナナ': 2, 'ブドウ': 3, 'レモン': 1} """ ```