当前位置: 首页 > 面试题库 >

NotFittedError:TfidfVectorizer-词汇不适合

梁丘兴腾
2023-03-14
问题内容

我正在尝试使用scikit-learn / pandas构建情感分析器。建立和评估模型是可行的,但尝试对新的示例文本进行分类则无法。

我的代码:

import csv
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import BernoulliNB
from sklearn.metrics import classification_report
from sklearn.metrics import accuracy_score

infile = 'Sentiment_Analysis_Dataset.csv'
data = "SentimentText"
labels = "Sentiment"


class Classifier():
    def __init__(self):
        self.train_set, self.test_set = self.load_data()
        self.counts, self.test_counts = self.vectorize()
        self.classifier = self.train_model()

    def load_data(self):

        df = pd.read_csv(infile, header=0, error_bad_lines=False)
        train_set, test_set = train_test_split(df, test_size=.3)
        return train_set, test_set

    def train_model(self):
        classifier = BernoulliNB()
        targets = self.train_set[labels]
        classifier.fit(self.counts, targets)
        return classifier


    def vectorize(self):

        vectorizer = TfidfVectorizer(min_df=5,
                                 max_df = 0.8,
                                 sublinear_tf=True,
                                 ngram_range = (1,2),
                                 use_idf=True)
        counts = vectorizer.fit_transform(self.train_set[data])
        test_counts = vectorizer.transform(self.test_set[data])

        return counts, test_counts

    def evaluate(self):
        test_counts,test_set = self.test_counts, self.test_set
        predictions = self.classifier.predict(test_counts)
        print (classification_report(test_set[labels], predictions))
        print ("The accuracy score is {:.2%}".format(accuracy_score(test_set[labels], predictions)))


    def classify(self, input):
        input_text = input

        input_vectorizer = TfidfVectorizer(min_df=5,
                                 max_df = 0.8,
                                 sublinear_tf=True,
                                 ngram_range = (1,2),
                                 use_idf=True)
        input_counts = input_vectorizer.transform(input_text)
        predictions = self.classifier.predict(input_counts)
        print(predictions)

myModel = Classifier()

text = ['I like this I feel good about it', 'give me 5 dollars']

myModel.classify(text)
myModel.evaluate()

错误:

Traceback (most recent call last):
  File "sentiment.py", line 74, in <module>
    myModel.classify(text)
  File "sentiment.py", line 66, in classify
    input_counts = input_vectorizer.transform(input_text)
  File "/home/rachel/Sentiment/ENV/lib/python3.5/site-packages/sklearn/feature_extraction/text.py", line 1380, in transform
    X = super(TfidfVectorizer, self).transform(raw_documents)
  File "/home/rachel/Sentiment/ENV/lib/python3.5/site-packages/sklearn/feature_extraction/text.py", line 890, in transform
    self._check_vocabulary()
  File "/home/rachel/Sentiment/ENV/lib/python3.5/site-packages/sklearn/feature_extraction/text.py", line 278, in _check_vocabulary
    check_is_fitted(self, 'vocabulary_', msg=msg),
  File "/home/rachel/Sentiment/ENV/lib/python3.5/site-packages/sklearn/utils/validation.py", line 690, in check_is_fitted
    raise _NotFittedError(msg % {'name': type(estimator).__name__})
sklearn.exceptions.NotFittedError: TfidfVectorizer - Vocabulary wasn't fitted.

我不确定是什么问题。在我的分类方法中,我创建了一个全新的矢量化器来处理要分类的文本,与用于从模型创建训练和测试数据的矢量化器分开。

谢谢


问题答案:

您已经安装了矢量化器,但由于它在vectorize函数的生命周期内不存在,因此将其丢弃。相反,将模型vectorize转换后保存在其中:

self._vectorizer = vectorizer

然后在classify函数中,不要创建新的矢量化器。相反,请使用适合您的训练数据的数据:

input_counts = self._vectorizer.transform(input_text)


 类似资料:
  • 词汇表 本表列出的是一些单词在本书中使用的翻译。这些单词大部分是专业术语,一部分是字典上没有的。 英文 中文 adapter 适配器 algorithm 算法 allocate 分配 allocator 分配器 amortize 分摊 argument 实参 associative container 关联容器 cast 映射 category 种类 component 组件 context 场景

  • 这是 Redux 的核心概念词汇表以及这些核心概念的类型签名。这些类型使用了流标注法进行记录。 State type State = any State (也称为 state tree) 是一个宽泛的概念,但是在 Redux API 中,通常是指一个唯一的 state 值,由 store 管理且由 getState() 方法获得。它表示了 Redux 应用的全部状态,通常为一个多层嵌套的对象。 约

  • @Directive more more @Injectable more @Input more more @Pipe more @ViewChildren more

  • 此词汇表包含了与Apache相关的一些常用术语的详细定义,以及对网络服务的一般说明,并提供了相关的更详细资料的连接。 定义 访问控制(Access Control) 对网络领域访问的限制。对Apache来说,通常是指对某些URL访问的限制。参见:认证、授权、访问控制 算法(Algorithm) 通过有限步骤解决问题的一个明确的公式或者一套规则。用于加密的算法通常称为加密算法(Cipher)。 Ap

  • 这是 React Router 库以及文档中常用术语的词汇表,并附有 type signatures(类型签名),以首字母顺序列出。 Action(动作) Component(组件) EnterHook LeaveHook Location LocationKey LocationState Path(路径) Pathname(路径名) Params(参数) Query QueryString R

  • 介绍文档中缩写的含义. 缩略语 全称 AWS Amazon Web Services Azure AD Azure Active Directory CAS Central Authentication Service IAM Identity and Access Management LADP Lightweight Directory Access Protocol OIDC OpenID