【问题标题】:AttributeError: 'int' object has no attribute 'lower' in TFIDF and CountVectorizerAttributeError: 'int' 对象在 TFIDF 和 CountVectorizer 中没有属性 'lower'
【发布时间】:2019-05-27 21:47:15
【问题描述】:

我尝试预测不同类别的条目消息,并研究了波斯语。我使用 Tfidf 和 Naive-Bayes 对输入数据进行分类。这是我的代码:

import pandas as pd
df=pd.read_excel('dataset.xlsx')
col=['label','body']
df=df[col]
df.columns=['label','body']
df['class_type'] = df['label'].factorize()[0]
class_type_df=df[['label','class_type']].drop_duplicates().sort_values('class_type')
class_type_id = dict(class_type_df.values)
id_to_class_type = dict(class_type_df[['class_type', 'label']].values)
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf = TfidfVectorizer()
features=tfidf.fit_transform(df.body).toarray()
classtype=df.class_type
print(features.shape)
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.naive_bayes import MultinomialNB 
X_train,X_test,y_train,y_test=train_test_split(df['body'],df['label'],random_state=0)
cv=CountVectorizer()
X_train_counts=cv.fit_transform(X_train)
tfidf_transformer=TfidfTransformer()
X_train_tfidf = tfidf_transformer.fit_transform(X_train_counts)
clf = MultinomialNB().fit(X_train_tfidf, y_train)
print(clf.predict(cv.transform(["خريد و فروش لوازم آرايشي از بانه"])))

但是当我运行上面的代码时,它会抛出以下异常,而我希望在输出中给我“ads”类:

Traceback(最近一次调用最后一次):文件“.../multiclass-main.py”, 第 27 行,在 X_train_counts=cv.fit_transform(X_train) 文件“...\sklearn\feature_extraction\text.py”,第 1012 行,在 fit_transform self.fixed_vocabulary_) 文件“...sklearn\feature_extraction\text.py”,第 922 行,在 _count_vocab 对于分析(文档)中的功能:文件“...sklearn\feature_extraction\text.py”,第 308 行,在 tokenize(preprocess(self.decode(doc))), stop_words) 文件“...sklearn\feature_extraction\text.py”,第 256 行,在 return lambda x: strip_accents(x.lower()) AttributeError: 'int' object has no attribute 'lower'

如何在这个项目中使用 Tfidf 和 CountVectorizer?

【问题讨论】:

    标签: python machine-learning scikit-learn tf-idf


    【解决方案1】:

    你可以设置lowercase = False:

    cv = CountVectorizer(lowercase=False)
    

    【讨论】:

      【解决方案2】:

      如您所见,错误为AttributeError: 'int' object has no attribute 'lower',这意味着整数不能小写。在您的代码中的某处,它会尝试小写整数对象,这是不可能的。

      为什么会这样?

      CountVectorizer 构造函数有参数lowercase,默认为True。当您调用.fit_transform() 时,它会尝试将包含整数的输入小写。更具体地说,在您的输入数据中,您有一个整数对象。例如,您的列表包含类似于以下内容的数据:

       corpus = ['sentence1', 'sentence 2', 12930, 'sentence 100']
      

      当您将上述列表传递给CountVectorizer 时,它会引发此类异常。

      如何解决?

      这里有一些可能的解决方案来避免这个问题:

      1) 将语料库中的所有行转换为字符串对象。

       corpus = ['sentence1', 'sentence 2', 12930, 'sentence 100']
       corpus = [str (item) for item in corpus]
      

      2) 删除语料库中的整数:

      corpus = ['sentence1', 'sentence 2', 12930, 'sentence 100']
      corpus = [item for item in corpus if not isinstance(item, int)]
      

      【讨论】:

      • 感谢您的回答,我发现应该对波斯语语句进行编码以便能够对其进行处理。但我不知道如何解决这个问题。 @阿米尔
      • @hadijavanmard 在 python 3 中是不需要的。只需如上所述预处理您的数据框。
      • 我不能做 2 号解决方案,因为它们是我想用来制作我的 Dataframe 的句子。预处理数据框是什么意思?我无法理解解决方案 1。我该怎么办 ? @阿米尔
      • 用 X_train 替换我的代码中的语料库可以解决您的问题。
      猜你喜欢
      • 2020-08-21
      • 1970-01-01
      • 1970-01-01
      • 2020-10-22
      • 2021-02-10
      • 1970-01-01
      • 2020-10-06
      • 2016-04-15
      • 2016-01-30
      相关资源
      最近更新 更多