mai_Nのプログラミング勉強メモ

Python or R × マーケティング

TF-IDF(特徴語の抽出)

※使用したデータ:カップヌードルミュージアムの口コミ500件
じゃらんの口コミをスクレイピングで取得したもの。
 なお、単語はリスト化した後に動詞・名詞・形容詞・副詞のみに限定。)

分かち書きデータの作成

def generate_wakati_data(text_list):
    wakati_data = ""
    from janome.tokenizer import Tokenizer
    t = Tokenizer()
    for text in text_list:
        token_list = t.tokenize(text)
        for token in token_list:
            if token.part_of_speech.split(',')[0] in ['名詞']:  #ここで品詞を限定
                wakati_data = wakati_data + " " + token.base_form
    return wakati_data

wakati_0 = generate_wakati_data(text_list_0) #text_listはデータフレームの1つのカラム(レビュー本文etc.)を指定するなど
wakati_1 = generate_wakati_data(text_list_1)
#以下、同様に分かち書きデータを作る


■TF-IDFの計算

datas = [wakati_0, wakati_1,...] #比較する分かち書きデータのリスト
from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(datas)
terms = vectorizer.get_feature_names()  #キーワードのリスト
matrix = X.toarray()  #TF-IDFの行列

def get_tfidfs(i, top):  #i=matrixのindex(行)、top=取得する重要語の数
    array = matrix[i]
    key_indexs = array.argsort()[-top:][::-1]
    key_terms = [terms[index] for index in key_indexs]
    tfidfs = [matrix[i][index] for index in key_indexs]
    return key_terms, tfidfs

key_terms_0, tfidfs_0 = get_tfidfs(0, 50)
key_terms_1, tfidfs_1 = get_tfidfs(1, 50)
#以下、同様にTF-IDFを計算


■TFの計算

def get_tfs(wakati_data, key_terms):
    from collections import defaultdict
    term_list = wakati_data.split(" ")
    dic = defaultdict(lambda: 0)
    for key in term_list:
        dic[key] += 1
    tfs = [(dic[term])/len(wakati_data.split(" ")) for term in key_terms]
    return tfs

tfs_0 = get_tfs(wakati_0, key_terms_0)
tfs_1 = get_tfs(wakati_1, key_terms_1)
#以下、同様にTFを計算


■必要ならデータフレーム化

DF_tfidfs = pd.DataFrame({
    'category0':key_terms_0,
    'category0_tfidf':tfidfs_0,
    'category0_tf':tfs_0,
    'category1':key_terms_1,
    'category1_tfidf':tfidfs_1,
    'category1_tf':tfs_1
})
DF_tfidfs