TF-IDF,带有用于 python 中的 IDF 的日志基数 2

问题描述 投票:0回答:0

我是机器学习的新手。我尝试使用 TF-IDF 进行情绪分析。 我使用的公式 TF 是: TF formula 我使用的公式 IDF 是: IDF formula 对于 IDF 公式,我使用以对数为底数 2 的基本公式。我发现其他人使用与我相同的 TF-IDF 公式的语法。我尝试使该代码适应我的数据。所以,代码是这样的:

import pandas as pd 
import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer
dataset = pd.read_csv("/content/Text_stop-stem-label.csv", usecols=["review_tokens_stemmed", "sentiment"])
dataset.columns = ["review", "sentiment"]

#Change list token into document string
import ast

def join_text_list(texts):
    texts = ast.literal_eval(texts)
    return ' '.join([text for text in texts])
dataset["review_join"] = dataset["review"].apply(join_text_list)

#TFIDF
import seaborn as sns
cvec =  CountVectorizer(stop_words='english', min_df=1, max_df=0.5,  ngram_range=(1,2))
cvec 
CountVectorizer(analyzer='word', binary=False, decode_error='strict', dtype=np.int64, encoding='utf-8', 
                input='content', lowercase=True, max_df=0.5, max_features=None, min_df=1, ngram_range=(1,2), 
                preprocessor=None,  stop_words='english', strip_accents=None, token_pattern=r"(?u)\b\w\w+\b", 
                tokenizer=None, vocabulary=None)

#calculate all ngram find in all document
from itertools import islice
from nltk.corpus import stopwords
global str

cvec.fit(dataset["review_join"])
list(islice(cvec.vocabulary_.items(), 20))
cvec = CountVectorizer(stop_words='english', min_df=.0025, max_df=.5, ngram_range=(1,2))
cvec.fit(dataset["review_join"])
cvec_counts = cvec.transform(dataset["review_join"])
print('sparse matrix shape:', cvec_counts.shape)
print('nonzero count:', cvec_counts.nnz)
print('sparsity: %.2f%%' % (100.0 * cvec_counts.nnz / cvec_counts.shape[0] * cvec_counts.shape[1]))

#calculate term frequency 
occ = np.asarray(cvec_counts.sum(axis=0)).ravel().tolist()
counts_df = pd.DataFrame({'term': cvec.get_feature_names(), 'occurances': occ})
counts_df.sort_values(by='occurances', ascending=False).head(20)

#weight for all term in document
transformer = TfidfTransformer()
transformered_weights = transformer.fit_transform(cvec_counts)
transformered_weights
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(dataset["review_join"])
#making dataframe for tf-idf result
df = pd.DataFrame(X.toarray().transpose(), index = vectorizer.get_feature_names())
df = df.transpose()
#change column name
#ColNames  = ['']
#df.columns = ["ColNames"]
df

但是,python和manual的结果是不一样的。例如,python 中的术语“应用程序”为 0,1877,手动计算为 0,630。我希望得到与手动计算相同的结果。有人知道怎么了吗?或者我该怎么办?

python machine-learning tf-idf tfidfvectorizer
© www.soinside.com 2019 - 2024. All rights reserved.