将 sklearn TfidfVectorizer 与已经标记化的输入一起使用?
Use sklearn TfidfVectorizer with already tokenized inputs?
我有一个标记化句子列表,想要适合 tfidf Vectorizer。我尝试了以下方法:
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)
哪个错误为
AttributeError: 'list' object has no attribute 'lower'
有办法吗?我有十亿个句子,不想再次标记它们。在此之前的另一个阶段,它们已被标记化。
尝试 preprocessor
而不是 tokenizer
。
return lambda x: strip_accents(x.lower())
AttributeError: 'list' object has no attribute 'lower'
如果上述错误消息中的 x
是一个列表,那么对列表执行 x.lower()
将抛出错误。
你的两个例子都是停用词所以为了使这个例子 return 有意义,随便输入几个词。这是一个例子:
tokenized_sentences = [['this', 'is', 'one', 'cat', 'or', 'dog'],
['this', 'is', 'another', 'dog']]
tfidf = TfidfVectorizer(preprocessor=' '.join, stop_words='english')
tfidf.fit_transform(tokenized_sentences)
Returns:
<2x2 sparse matrix of type '<class 'numpy.float64'>'
with 3 stored elements in Compressed Sparse Row format>
特点:
>>> tfidf.get_feature_names()
['cat', 'dog']
更新:可能在分词器和预处理器上使用 lambda
s?
tokenized_sentences = [['this', 'is', 'one', 'cat', 'or', 'dog'],
['this', 'is', 'another', 'dog']]
tfidf = TfidfVectorizer(tokenizer=lambda x: x,
preprocessor=lambda x: x, stop_words='english')
tfidf.fit_transform(tokenized_sentences)
<2x2 sparse matrix of type '<class 'numpy.float64'>'
with 3 stored elements in Compressed Sparse Row format>
>>> tfidf.get_feature_names()
['cat', 'dog']
尝试使用参数 lowercase=False
初始化 TfidfVectorizer
对象(假设这实际上是您需要的,因为您在前面的阶段已经小写了您的标记)。
tokenized_list_of_sentences = [['this', 'is', 'one', 'basketball'], ['this', 'is', 'a', 'football']]
def identity_tokenizer(text):
return text
tfidf = TfidfVectorizer(tokenizer=identity_tokenizer, stop_words='english', lowercase=False)
tfidf.fit_transform(tokenized_list_of_sentences)
请注意,我更改了句子,因为它们显然只包含停用词,由于词汇表为空而导致另一个错误。
与 @Jarad 一样,只需为您的分析器使用 "passthrough" 函数,但它需要忽略停用词。您可以从 sklearn
:
获取停用词
>>> from sklearn.feature_extraction.text import ENGLISH_STOP_WORDS
或来自nltk
:
>>> import nltk
>>> nltk.download('stopwords')
>>> from nltk.corpus import stopwords
>>> stop_words = set(stopwords.words('english'))
或合并两组:
stop_words = stop_words.union(ENGLISH_STOP_WORDS)
但是你的例子只包含停用词(因为你所有的词都在 sklearn.ENGLISH_STOP_WORDS
集中)。
Noetheless @Jarad 的示例有效:
>>> tokenized_list_of_sentences = [
... ['this', 'is', 'one', 'cat', 'or', 'dog'],
... ['this', 'is', 'another', 'dog']]
>>> from sklearn.feature_extraction.text import TfidfVectorizer
>>> tfidf = TfidfVectorizer(analyzer=lambda x:[w for w in x if w not in stop_words])
>>> tfidf_vectors = tfidf.fit_transform(tokenized_list_of_sentences)
我喜欢 pd.DataFrame
s 用于浏览 TF-IDF 向量:
>>> import pandas as pd
>>> pd.DataFrame(tfidf_vectors.todense(), columns=tfidf.vocabulary_)
cat dog
0 0.814802 0.579739
1 0.000000 1.000000
我有一个标记化句子列表,想要适合 tfidf Vectorizer。我尝试了以下方法:
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)
哪个错误为
AttributeError: 'list' object has no attribute 'lower'
有办法吗?我有十亿个句子,不想再次标记它们。在此之前的另一个阶段,它们已被标记化。
尝试 preprocessor
而不是 tokenizer
。
return lambda x: strip_accents(x.lower())
AttributeError: 'list' object has no attribute 'lower'
如果上述错误消息中的 x
是一个列表,那么对列表执行 x.lower()
将抛出错误。
你的两个例子都是停用词所以为了使这个例子 return 有意义,随便输入几个词。这是一个例子:
tokenized_sentences = [['this', 'is', 'one', 'cat', 'or', 'dog'],
['this', 'is', 'another', 'dog']]
tfidf = TfidfVectorizer(preprocessor=' '.join, stop_words='english')
tfidf.fit_transform(tokenized_sentences)
Returns:
<2x2 sparse matrix of type '<class 'numpy.float64'>'
with 3 stored elements in Compressed Sparse Row format>
特点:
>>> tfidf.get_feature_names()
['cat', 'dog']
更新:可能在分词器和预处理器上使用 lambda
s?
tokenized_sentences = [['this', 'is', 'one', 'cat', 'or', 'dog'],
['this', 'is', 'another', 'dog']]
tfidf = TfidfVectorizer(tokenizer=lambda x: x,
preprocessor=lambda x: x, stop_words='english')
tfidf.fit_transform(tokenized_sentences)
<2x2 sparse matrix of type '<class 'numpy.float64'>'
with 3 stored elements in Compressed Sparse Row format>
>>> tfidf.get_feature_names()
['cat', 'dog']
尝试使用参数 lowercase=False
初始化 TfidfVectorizer
对象(假设这实际上是您需要的,因为您在前面的阶段已经小写了您的标记)。
tokenized_list_of_sentences = [['this', 'is', 'one', 'basketball'], ['this', 'is', 'a', 'football']]
def identity_tokenizer(text):
return text
tfidf = TfidfVectorizer(tokenizer=identity_tokenizer, stop_words='english', lowercase=False)
tfidf.fit_transform(tokenized_list_of_sentences)
请注意,我更改了句子,因为它们显然只包含停用词,由于词汇表为空而导致另一个错误。
与 @Jarad sklearn
:
>>> from sklearn.feature_extraction.text import ENGLISH_STOP_WORDS
或来自nltk
:
>>> import nltk
>>> nltk.download('stopwords')
>>> from nltk.corpus import stopwords
>>> stop_words = set(stopwords.words('english'))
或合并两组:
stop_words = stop_words.union(ENGLISH_STOP_WORDS)
但是你的例子只包含停用词(因为你所有的词都在 sklearn.ENGLISH_STOP_WORDS
集中)。
Noetheless @Jarad 的示例有效:
>>> tokenized_list_of_sentences = [
... ['this', 'is', 'one', 'cat', 'or', 'dog'],
... ['this', 'is', 'another', 'dog']]
>>> from sklearn.feature_extraction.text import TfidfVectorizer
>>> tfidf = TfidfVectorizer(analyzer=lambda x:[w for w in x if w not in stop_words])
>>> tfidf_vectors = tfidf.fit_transform(tokenized_list_of_sentences)
我喜欢 pd.DataFrame
s 用于浏览 TF-IDF 向量:
>>> import pandas as pd
>>> pd.DataFrame(tfidf_vectors.todense(), columns=tfidf.vocabulary_)
cat dog
0 0.814802 0.579739
1 0.000000 1.000000