我是机器学习的新手。我尝试使用 TF-IDF 进行情绪分析。 我使用的公式 TF 是: 我使用的公式 IDF 是: 对于 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。我希望得到与手动计算相同的结果。有人知道怎么了吗?或者我该怎么办?