我有一个标记化的句子列表,并希望适合一个tfidf矢量化器.我尝试了以下方法:
tokenized_list_of_sentences = [['this', 'is', 'one'], ['this', 'is', 'another']]
def identity_tokenizer(text):
return text
tfidf = TfidfVectorizer(tokenizer=identity_tokenizer, stop_words='english')
tfidf.fit_transform(tokenized_list_of_sentences)
Run Code Online (Sandbox Code Playgroud)
出错的地方
AttributeError: 'list' object has no attribute 'lower'
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?我有十亿句话,不想再次对它们进行标记.在此之前的另一个阶段,它们被标记化.
在 scikit-learn 中TfidfVectorizer
,我们可以拟合训练数据,然后使用相同的向量化器来转换我们的测试数据。对训练数据进行转换的输出是一个矩阵,表示给定文档中每个单词的 tf-idf 分数。
但是,拟合向量化器如何计算新输入的分数?我已经猜到了:
我曾尝试从 scikit-learn 的源代码中推断出该操作,但无法完全弄清楚。它是我之前提到的选项之一还是完全其他选项?请协助。
使用 linear_kernel 或cosine_similarity
for 时TfIdfVectorizer
,出现错误“内核已死亡,正在重新启动”。
我正在为 TfID 方法 Vectorizer 和fit_transform
一些文本数据运行 scikit 学习函数,如下例所示,但是当我想计算距离矩阵时,我收到错误"Kernel dead, restarting "。
无论我使用的是cosine_similarity
还是linear_kernel
函数:
tf = TfidfVectorizer(analyzer='word' stop_words='english')
tfidf_matrix = tf.fit_transform(products['ProductDescription'])
--cosine_sim = linear_kernel(tfidf_matrix, tfidf_matrix)
--cosine_sim = cosine_similarity(tfidf_matrix, tfidf_matrix)
Run Code Online (Sandbox Code Playgroud)
也许问题是我的数据的大小?
我的 tiidf 矩阵是 (178350,143529),它应该生成一个 (178350,178350) cosine_sim 矩阵。
我使用 sklearn 为 nltk 库中 Brown 语料库的每个类别实现了 Tf-idf。有 15 个类别,每个类别的最高分都分配给一个停用词。
默认参数是use_idf=True
,所以我使用 idf 。语料库足够大,可以计算出正确的分数。所以,我不明白 - 为什么停用词被赋予高值?
import nltk, sklearn, numpy
import pandas as pd
from nltk.corpus import brown, stopwords
from sklearn.feature_extraction.text import TfidfVectorizer
nltk.download('brown')
nltk.download('stopwords')
corpus = []
for c in brown.categories():
doc = ' '.join(brown.words(categories=c))
corpus.append(doc)
thisvectorizer = TfidfVectorizer()
X = thisvectorizer.fit_transform(corpus)
tfidf_matrix = X.toarray()
features = thisvectorizer.get_feature_names_out()
for array in tfidf_matrix:
tfidf_per_doc = list(zip(features, array))
tfidf_per_doc.sort(key=lambda x: x[1], reverse=True)
print(tfidf_per_doc[:3])
Run Code Online (Sandbox Code Playgroud)
结果是:
[('the', 0.6893251240111703), ('and', 0.31175508121108203), ('he', 0.24393467757919754)] …
Run Code Online (Sandbox Code Playgroud) 如果我将自定义停用词列表传递给TfidfVectorizer
,那么停用词到底什么时候会被删除?根据文档:
\n\n\nstop_words :
\n\nstring
{\xe2\x80\x98english\xe2\x80\x99},list
, 或None
(默认)...
\n\n如果是一个列表,则假定该列表包含停用词,所有这些停用词都将从结果标记中删除。仅适用于
\nanalyzer == \'word\'
。
所以这个过程似乎是在标记化之后发生的,对吗?之所以产生疑问,是因为如果标记化还涉及词干提取,我认为存在错误地跳过(而不是删除)停用词的风险,因为在词干提取之后,它不再被识别。
\n在实习项目中,我必须对大量文件(~18000)执行 tfidf 分析。我正在尝试使用 sklearn 中的 TFIDF 矢量器,但我面临以下问题:如何避免一次将所有文件加载到内存中?根据我在其他帖子上读到的内容,使用可迭代似乎是可行的,但是如果我使用 [open(file) for file in os.listdir(path)] 作为fit_transform() 函数的raw_documents输入,我收到“打开文件太多”错误。预先感谢您的建议!干杯!保罗
我有一个有 5000 条评论的文档。我对该文档应用了 tf-idf 。这里的sample_data包含5000条评论。我正在对具有一克范围的sample_data应用tf-idf向量化器。现在我想从样本数据中获取具有最高 tf-idf 值的前 1000 个单词。谁能告诉我如何获得最热门的单词?
from sklearn.feature_extraction.text import TfidfVectorizer
tf_idf_vect = TfidfVectorizer(ngram_range=(1,1))
tf_idf_vect.fit(sample_data)
final_tf_idf = tf_idf_vect.transform(sample_data)
Run Code Online (Sandbox Code Playgroud) tf-idf python-3.x scikit-learn sklearn-pandas tfidfvectorizer
我需要从存储在巨大数据框列中的文本中获取 TF-IDF 特征矩阵,从 CSV 文件(无法放入内存)加载。我正在尝试使用块迭代数据帧,但它返回的生成器对象不是TfidfVectorizer方法的预期变量类型。我想我在编写ChunkIterator
如下所示的生成器方法时做错了什么。
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
#Will work only for small Dataset
csvfilename = 'data_elements.csv'
df = pd.read_csv(csvfilename)
vectorizer = TfidfVectorizer()
corpus = df['text_column'].values
vectorizer.fit_transform(corpus)
print(vectorizer.get_feature_names())
#Trying to use a generator to parse over a huge dataframe
def ChunkIterator(filename):
for chunk in pd.read_csv(csvfilename, chunksize=1):
yield chunk['text_column'].values
corpus = ChunkIterator(csvfilename)
vectorizer.fit_transform(corpus)
print(vectorizer.get_feature_names())
Run Code Online (Sandbox Code Playgroud)
任何人都可以请教如何修改上述ChunkIterator
方法,或使用dataframe 的任何其他方法。我想避免为数据框中的每一行创建单独的文本文件。以下是一些用于重新创建场景的虚拟 csv 文件数据。
id,text_column,tags
001, This is the first …
Run Code Online (Sandbox Code Playgroud) 我有一个网站元描述列表(128k 描述;每个描述平均有 20-30 个单词),并且正在尝试构建一个相似度排名器(如:向我显示与此网站元描述最相似的 5 个网站)
它与 TF-IDF uni- 和 bigram 配合得非常好,我认为我还可以通过添加预先训练的词嵌入(准确地说是 spacy“en_core_web_lg”)来改进它。情节扭曲:根本行不通。从字面上没有得到一个好的猜测,它突然吐出完全随机的建议。
下面是我的代码。有什么想法我可能哪里出了问题吗?我是否在监督一些高度直观的事情?
import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer
import sys
import pickle
import spacy
import scipy.sparse
from scipy.sparse import csr_matrix
import math
from sklearn.metrics.pairwise import linear_kernel
nlp=spacy.load('en_core_web_lg')
""" Tokenizing"""
def _keep_token(t):
return (t.is_alpha and
not (t.is_space or t.is_punct or
t.is_stop or t.like_num))
def _lemmatize_doc(doc):
return [ t.lemma_ for t in doc if _keep_token(t)]
def _preprocess(doc_list):
return [_lemmatize_doc(nlp(doc)) for doc in doc_list]
def dummy_fun(doc): …
Run Code Online (Sandbox Code Playgroud) 假设我有一个包含两列的数据框,其中pandas
类似于以下一列:
text label
0 This restaurant was amazing Positive
1 The food was served cold Negative
2 The waiter was a bit rude Negative
3 I love the view from its balcony Positive
Run Code Online (Sandbox Code Playgroud)
然后我在这个数据集上使用TfidfVectorizer
from sklearn
。
找到每类 TF-IDF 得分词汇量前 n 名的最有效方法是什么?
显然,我的实际数据框包含比上面 4 行更多的数据行。
我的帖子的重点是找到适用于任何类似于上面的数据框的代码;4 行数据帧或 1M 行数据帧。
我认为我的帖子与以下帖子有很多相关性:
tfidfvectorizer ×10
scikit-learn ×8
python ×5
tf-idf ×4
nlp ×3
python-3.x ×2
dataframe ×1
kernel ×1
nltk ×1
pandas ×1
spacy ×1
stop-words ×1