2016-04-20 11 views
2

私は一連のクエリ間の類似度を計算し、各クエリの結果を設定しようとしています。私はtfidfのスコアとコサインの類似性を使ってこれをしたいと思います。私が持っている問題は、2つの列(パンダのデータフレーム内)を使ってtfidf行列を生成する方法を理解できないことです。私は2つの列を連結し、それは正常に動作しますが、どのクエリがどの結果に属しているかを追跡する必要があるので、使用するのは厄介です。一度に2つの列のtfidf行列を計算するにはどうすればよいですか?私はパンダとsklearnを使用しています。sklearnを使用して2つの異なる列の別々のtfidfスコアを計算する

ここに関連するコードです:

tf = TfidfVectorizer(analyzer='word', min_df = 0) 
tfidf_matrix = tf.fit_transform(df_all['search_term'] + df_all['product_title']) # This line is the issue 
feature_names = tf.get_feature_names() 

は私がtf.fit_transformへの引数として[ 'PRODUCT_TITLE'] [ 'SEARCH_TERMを'] df_all渡すとdf_allしようとしています。これは、文字列を一緒に連結するだけで、search_termとproduct_titleを比較できないため、明らかに機能しません。また、これについてもっと良い方法がありますか?

+0

あなたはこの 'df_all [「SEARCH_TERM」] +「」+ df_all [「PRODUCT_TITLE」]'他の賢明なあなたが最初に組み合わせることがありますようにスペースを追加する必要があります検索の最後の単語がある商品の単語 – maxymoo

+0

これはデフォルト値であるため、 'analyzer = word'は必要ありません – maxymoo

+0

私のコードのその行は私が望む通りではありません。検索と商品の間のコサインの類似性を計算できるように別々にしてください。 – David

答えて

1

あなたはすべての単語をまとめるだけで良いスタートを切りました。このような単純なパイプラインはしばしば良い結果を生み出すのに十分です。 pipelinepreprocessingを使用して、より複雑なフィーチャプロセッシングパイプラインを構築できます。ここでは、それはあなたのデータのために働くだろう方法は次のとおりです。

import pandas as pd 
from sklearn.feature_extraction.text import TfidfVectorizer 
from sklearn.preprocessing import FunctionTransformer 
from sklearn.pipeline import FeatureUnion, Pipeline 

df_all = pd.DataFrame({'search_term':['hat','cat'], 
         'product_title':['hat stand','cat in hat']}) 

transformer = FeatureUnion([ 
       ('search_term_tfidf', 
        Pipeline([('extract_field', 
           FunctionTransformer(lambda x: x['search_term'], 
                validate=False)), 
          ('tfidf', 
           TfidfVectorizer())])), 
       ('product_title_tfidf', 
        Pipeline([('extract_field', 
           FunctionTransformer(lambda x: x['product_title'], 
                validate=False)), 
          ('tfidf', 
           TfidfVectorizer())]))]) 

transformer.fit(df_all) 

search_vocab = transformer.transformer_list[0][1].steps[1][1].get_feature_names() 
product_vocab = transformer.transformer_list[1][1].steps[1][1].get_feature_names() 
vocab = search_vocab + product_vocab 

print(vocab) 
print(transformer.transform(df_all).toarray()) 

['cat', 'hat', 'cat', 'hat', 'in', 'stand'] 

[[ 0.   1.   0.   0.57973867 0.   0.81480247] 
[ 1.   0.   0.6316672 0.44943642 0.6316672 0.  ]] 
+0

あなたの助けをありがとう。私はこれを理解しようとしていますが、それが何を返すのか分からないようです。私はそれを実行すると、私はtfidfマトリックスを取得していない、それは私に別の何かを与えるのですか?また、df_allにアクセスする予定ですか?それはまったく参照されているようではありません... – David

+0

私はうまくいけば事を明確にするために計算例を加えました。正直言って、私は正確に何tf-idfの変種が使用されている、私はそれがログの周波数を使用しているかもしれないと思うドキュメントではないと言いますが動作することはできません) – maxymoo

+0

この男は一緒にいくつかのメモものを明確にするかもしれないhttps://github.com/rasbt/pattern_classification/blob/master/machine_learning/scikit-learn/tfidf_scikit-learn.ipynb – maxymoo

関連する問題