在scikit-learn和中有TF-IDF实现gensim.
有简单的实现在Python中简单实现N-Gram,tf-idf和余弦相似性
为了避免重新发明轮子,
在这篇博文中,它说NLTK没有它.真的吗? http://www.bogotobogo.com/python/NLTK/tf_idf_with_scikit-learn_NLTK.php
我有一个带有一列短句的火花数据框和一个带有分类变量的列.我想tf-idf对句子执行one-hot-encoding分类变量,然后将其输出到我的驱动程序上的稀疏矩阵,一旦它的尺寸小得多(对于scikit-learn模型).
以稀疏形式从火花中获取数据的最佳方法是什么?看起来toArray()稀疏矢量只有一种方法,它输出numpy数组.但是,文档确实说scipy稀疏数组可以用于代替spark sparse数组.
还要记住,tf_idf值实际上是一列稀疏数组.理想情况下,将所有这些功能集成到一个大型稀疏矩阵中会很不错.
我正在进行基于TF-IDF向量空间模型的文本分类.我只有不超过3000个样本.为了公平评估,我正在使用5倍交叉验证来评估分类器.但令我困惑的是,是否有必要TF-IDF在每个折叠交叉验证中重建向量空间模型.也就是说,我是否需要重建词汇表并重新计算IDF每个折叠交叉验证中的词汇量值?
目前我正在基于scikit-learn工具包进行TF-IDF转换,并使用SVM训练我的分类器.我的方法如下:首先,我将手中的样本除以3:1的比例,75%的样本用于拟合TF-IDF向量空间模型的参数.Herein,参数是大小词汇及其中包含的术语,也是IDF词汇中每个术语的价值.然后我在这里转换剩余部分TF-IDF SVM并使用这些向量进行5倍交叉验证(值得注意的是,我不使用之前的75%的样本用于转化).
我的代码如下:
# train, test split, the train data is just for TfidfVectorizer() fit
x_train, x_test, y_train, y_test = train_test_split(data_x, data_y, train_size=0.75, random_state=0)
tfidf = TfidfVectorizer()
tfidf.fit(x_train)
# vectorizer test data for 5-fold cross-validation
x_test = tfidf.transform(x_test)
scoring = ['accuracy']
clf = SVC(kernel='linear')
scores = cross_validate(clf, x_test, y_test, scoring=scoring, cv=5, return_train_score=False)
print(scores)
Run Code Online (Sandbox Code Playgroud)
我的困惑在于,我的方法是进行TF-IDF转换和进行5倍交叉验证是否正确,或者是否有必要TF-IDF使用列车数据重建矢量模型空间,然后转换为TF-IDF包含列车和测试数据的向量?如下:
skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=0)
for train_index, test_index in …Run Code Online (Sandbox Code Playgroud) 我运行具有 TF-IDF 和非 TF-IDF 特征的随机森林算法。
总共特征数量约为 130k(在对 TF-IDF 特征进行特征选择之后),训练集的观察数量约为 120k。
其中大约 500 个是非 TF-IDF 功能。
问题是随机森林在同一测试集上的准确性等
- 只有非 TF-IDF 的特征是 87%
- TF-IDF 和非 TF-IDF 特征为 76%
准确性的显着恶化在我的脑海中引发了一些问题。
我与模型训练的相关代码如下:
drop_columns = ['labels', 'complete_text_1', 'complete_text_2']
# Split to predictors and targets
X_train = df.drop(columns=drop_columns).values
y_train = df['labels'].values
# Instantiate, train and transform with tf-idf models
vectorizer_1 = TfidfVectorizer(analyzer="word", ngram_range=(1,2), vocabulary=tf_idf_feature_names_selected)
X_train_tf_idf_1 = vectorizer_1.fit_transform(df['complete_text_1'])
vectorizer_2 = TfidfVectorizer(analyzer="word", ngram_range=(1,2), vocabulary=tf_idf_feature_names_selected)
X_train_tf_idf_2 = vectorizer_2.fit_transform(df['complete_text_2'])
# Covert the general features to sparse array
X_train = …Run Code Online (Sandbox Code Playgroud) 给定一个查询,我有一个文档的余弦分数.我也有文件pagerank.是否有标准的好方法将两者结合起来?
我在考虑增加它们
Total_Score = cosine-score * pagerank
Run Code Online (Sandbox Code Playgroud)
因为如果你在pagerank或cosine-score上得到低分,那么文档就不那么有趣了.
或者最好是加权和?
Total_Score = weight1 * cosine-score + weight2 * pagerank
Run Code Online (Sandbox Code Playgroud)
这是否更好?然后你可能有零余弦分数,但是高分页,并且页面将显示在结果中.
我正在使用Python 2.7中sklearn包中的TfidfTransformer。
当我对参数感到满意时,我对变得有些困惑use_idf,例如:
TfidfVectorizer(use_idf=False).fit_transform(<corpus goes here>)
究竟是什么use_idf做的时候或真或假?
由于我们正在生成一个稀疏的Tfidf矩阵,因此没有理由选择一个稀疏的Tfidif矩阵。这似乎是多余的。
这篇文章很有趣,但似乎没有提到。
该文档仅说Enable inverse-document-frequency reweighting,这不是很有启发性。
任何意见表示赞赏。
编辑
我想我想通了。这非常简单:
文本->计数
Counts-> TF,这意味着我们只有原始计数或Counts-> TFIDF,这意味着我们拥有加权计数。
令我感到困惑的是……因为他们叫它,TfidfVectorizer只有当您选择它作为TFIDF时,我才意识到这是真的。您也可以使用它来创建TF。
我试图根据他们的TF-IDF分数在语料库中找到最重要的单词.
按照https://radimrehurek.com/gensim/tut2.html上的示例进行操作.基于
>>> for doc in corpus_tfidf:
... print(doc)
Run Code Online (Sandbox Code Playgroud)
TF-IDF得分在每次迭代中都会得到更新.例如,
所以这就是我目前如何获得每个单词的最终TF-IDF分数,
tfidf = gensim.models.tfidfmodel.TfidfModel(corpus)
corpus_tfidf = tfidf[corpus]
d = {}
for doc in corpus_tfidf:
for id, value in doc:
word = dictionary.get(id)
d[word] = value
Run Code Online (Sandbox Code Playgroud)
有没有更好的办法?
提前致谢.
我在部分文本数据上使用了来自sklearn的TfidfVectorizer(),以了解每个功能(词)的术语频率感。我当前的代码如下
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf = TfidfVectorizer(analyzer='word', stop_words = 'english')
# fit_transform on training data
X_traintfidf = tfidf.fit_transform(X_train)
Run Code Online (Sandbox Code Playgroud)
如果我想将“ X_traintfidf”中每个术语的tf-idf值从最低到最高排序(反之亦然),例如top10,并将这些排序的tf-idf值排名分为两个Series对象,我应该如何进行从我的代码的最后一行开始?
谢谢。
我在读类似的主题,但不知道该怎么做。也许有人可以将该主题中显示的提示与此处的问题联系起来。
我有一个包含n-gram的词汇表,如下所示.
myvocabulary = ['tim tam', 'jam', 'fresh milk', 'chocolates', 'biscuit pudding']
Run Code Online (Sandbox Code Playgroud)
我想用这些词来计算TF-IDF值.
我还有一个语料库字典如下(键=食谱号,值=食谱).
corpus = {1: "making chocolates biscuit pudding easy first get your favourite biscuit chocolates", 2: "tim tam drink new recipe that yummy and tasty more thicker than typical milkshake that uses normal chocolates", 3: "making chocolates drink different way using fresh milk egg"}
Run Code Online (Sandbox Code Playgroud)
我目前正在使用以下代码.
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf = TfidfVectorizer(vocabulary = myvocabulary, stop_words = 'english')
tfs = tfidf.fit_transform(corpus.values())
Run Code Online (Sandbox Code Playgroud)
现在我正在打印令牌或n-gram的配方1 corpus以及tF-IDF值,如下所示.
feature_names = tfidf.get_feature_names()
doc = …Run Code Online (Sandbox Code Playgroud) 在 scikit-learn 中TfidfVectorizer,我们可以拟合训练数据,然后使用相同的向量化器来转换我们的测试数据。对训练数据进行转换的输出是一个矩阵,表示给定文档中每个单词的 tf-idf 分数。
但是,拟合向量化器如何计算新输入的分数?我已经猜到了:
我曾尝试从 scikit-learn 的源代码中推断出该操作,但无法完全弄清楚。它是我之前提到的选项之一还是完全其他选项?请协助。