Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在朴素贝叶斯分类器中,这个错误意味着什么?_Python - Fatal编程技术网

Python 在朴素贝叶斯分类器中,这个错误意味着什么?

Python 在朴素贝叶斯分类器中,这个错误意味着什么?,python,Python,我是python新手。事实上,我有一个文字袋里的火车数据。这是一个文章集。列车数据的每一行都是一篇文章。它包括2000行。列车数据的标签位于另一个文件中,每个i标签等于列车数据中的i项目。我阅读了整个文件,然后对列车数据进行词干分析,并删除了停止词。我使用NaiveBayes作为分类器,但是发生了一个我不知道如何解决的错误。我感谢任何快速的帮助 我的代码是: import nltk from nltk import stem from nltk.corpus import stopword

我是python新手。事实上,我有一个文字袋里的火车数据。这是一个文章集。列车数据的每一行都是一篇文章。它包括2000行。列车数据的标签位于另一个文件中,每个i标签等于列车数据中的i项目。我阅读了整个文件,然后对列车数据进行词干分析,并删除了停止词。我使用NaiveBayes作为分类器,但是发生了一个我不知道如何解决的错误。我感谢任何快速的帮助

我的代码是:

 import nltk
 from nltk import stem
 from nltk.corpus import stopwords
 from sklearn.naive_bayes import MultinomialNB
 stop = stopwords.words('english')

 list_of_articles=[]
 list_of_articles_test=[]
 stemmer=stem.PorterStemmer()
 from sklearn.feature_extraction.text import TfidfTransformer
 from sklearn.feature_extraction.text import CountVectorizer
 count_vect = CountVectorizer()
 tfidf_transformer = TfidfTransformer()

 Label_file = open('D:\\2nd semester\\NLP1\\exercise\\data\\labels_train.txt', 'r')
 data_labels = [line.split(',') for line in Label_file.readlines()]
 with open('D:\\2nd semester\\NLP1\\exercise\\data\\data_train.txt','r') as traindata:
      for line in traindata:
           words_in_article=" ".join([stemmer.stem(w)for w in line.split() if not w in stop])
             list_of_articles.append(words_in_article)


      X_train_counts = count_vect.fit_transform(list_of_articles)

      X_train_tfidf = tfidf_transformer.fit_transform(X_train_counts)

      print(X_train_tfidf)
      print(X_train_tfidf.shape)


   Label_file_test = open('D:\\2nd semester\\NLP1\\exercise\\data\\labels_valid.txt', 'r')
   data_labels_test = [line.split(',') for line in Label_file_test.readlines()]
   with open('D:\\2nd semester\\NLP1\\exercise\\data\\data_valid.txt','r') as testdata:
              for test in testdata:
                words_in_article_test=" ".join([stemmer.stem(w)for w in test.split() if not w in stop])
                list_of_articles_test.append(words_in_article_test)
           X_test_counts =  count_vect.fit_transform(list_of_articles_test)

             X_test_tfidf = tfidf_transformer.fit_transform(X_test_counts)

             print(X_test_tfidf)
             print(X_test_tfidf.shape)


       clf = MultinomialNB().fit(X_train_tfidf, data_labels)
       predicted = clf.predict(X_test_tfidf)
       for doc, category in zip(list_of_articles_test, predicted):
            print('%r => %s' % (doc, data_labels))

       The error:
              Warning (from warnings module):
              File "C:\Python34\lib\site-packages\sklearn\utils\validation.py", line 449
              y = column_or_1d(y, warn=True)
              DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().
               Traceback (most recent call last):
               File "C:/Users/Maryam/Desktop/exercise/tfidf2.py", line 53, in <module>
               predicted = clf.predict(X_test_tfidf)
               File "C:\Python34\lib\site-packages\sklearn\naive_bayes.py", line 64, in predict
               jll = self._joint_log_likelihood(X)
               File "C:\Python34\lib\site-packages\sklearn\naive_bayes.py", line 615, in _joint_log_likelihood
               return (safe_sparse_dot(X, self.feature_log_prob_.T)
               File "C:\Python34\lib\site-packages\sklearn\utils\extmath.py", line 178, in safe_sparse_dot
ret = a * b
              File "C:\Python34\lib\site-packages\scipy\sparse\base.py", line 345, in __mul__
               raise ValueError('dimension mismatch')
               ValueError: dimension mismatch
               >>> 
导入nltk
从nltk导入干
从nltk.corpus导入停止词
从sklearn.naive_bayes导入多项式nb
stop=stopwords.words('english')
文章列表=[]
文章列表\u测试=[]
stemmer=stem.PorterStemmer()
从sklearn.feature_extraction.text导入TFIDF转换器
从sklearn.feature\u extraction.text导入countvectorier
count\u vect=countvectorier()
tfidf_transformer=tfidf transformer()
Label\u file=open('D:\\第二学期\\NLP1\\exercise\\data\\labels\u train.txt','r')
data_labels=[line.split(','),用于Label_文件中的行。readlines()]
以open('D:\\2nd-semmer\\NLP1\\exercise\\data\\data\u train.txt','r')作为列车数据:
对于列车数据中的线路:
单词_in_article=“”.join([stemmer.stem(w)表示行中的w.split(),如果在stop中不是w])
文章列表。附加(文章中的单词)
X_train_counts=计数向量拟合变换(文章列表)
X\u列\u tfidf=tfidf\u变压器。拟合变换(X\u列\u计数)
打印(X\U列\U tfidf)
打印(X_列_tfidf.shape)
Label\u file\u test=open('D:\\第二学期\\NLP1\\exercise\\data\\labels\u valid.txt','r')
数据_labels_test=[line.split(','),用于标签文件中的行_test.readlines()]
以open('D:\\2nd-sement\\NLP1\\exercise\\data\\data\u valid.txt','r')作为测试数据:
对于testdata中的测试:
单词_in_article_test=“”.join([stemmer.stem(w)表示测试中的w.split(),如果在stop中不是w])
文章测试列表。附加(文章测试中的单词)
X\u测试\u计数=计数向量拟合\u变换(文章列表\u测试)
X\u测试\u tfidf=tfidf\u变压器。拟合\u变换(X\u测试\u计数)
打印(X_测试\u tfidf)
打印(X_测试_tfidf.shape)
clf=多项式Nb().fit(X列tfidf,数据标签)
预测=clf.predict(X_测试\u tfidf)
对于文档,zip中的类别(文章列表\u测试,预测):
打印(“%r=>%s%”(文档、数据和标签))
错误:
警告(来自警告模块):
文件“C:\Python34\lib\site packages\sklearn\utils\validation.py”,第449行
y=列_或_1d(y,警告=真)
DataConversionWarning:当需要1d数组时,传递了列向量y。请将y的形状更改为(n_samples,),例如使用ravel()。
回溯(最近一次呼叫最后一次):
文件“C:/Users/Maryam/Desktop/exercise/tfidf2.py”,第53行,在
预测=clf.predict(X_测试\u tfidf)
文件“C:\Python34\lib\site packages\sklearn\naive\u bayes.py”,第64行,在predict中
jll=自联合对数似然(X)
文件“C:\Python34\lib\site packages\sklearn\naive\u bayes.py”,第615行,在联合日志中
返回(安全稀疏点(X,自特性,日志,问题)
文件“C:\Python34\lib\site packages\sklearn\utils\extmath.py”,第178行,安全点
ret=a*b
文件“C:\Python34\lib\site packages\scipy\sparse\base.py”,第345行,在__
提升值错误('维度不匹配')
ValueError:维度不匹配
>>> 

X\u train\u counts
是一个稀疏的共现矩阵,它为文档(矩阵中的行)中的所有单词(矩阵中的列)提供频率计数。换句话说,行
(20552)1
告诉您单词
5252
(词汇表中具有该索引的单词)在文档
20
中发生一次

但是,虽然您只有2000篇文章,但您的共现矩阵有更多的行。这是因为您错误地传递了数据。您的
word\u列表
只是一个单词列表,而它应该是一个文章列表,其中每个文章都是一个(词干)单词字符串。您应该执行以下操作:

list_of_articles = []
for line in traindata:
    words_in_article = " ".join([stemmer.stem(w) for w in line.split() if not w in stop])
    list_of_articles.append(words_in_article) 

X_train_counts = count_vect.fit_transform(list_of_articles)

正如您将看到的,我还根据停止列表调整了您的检查。由于您的停止列表可能由单词组成,而不是词干,您应该检查单词是否在停止列表中,而不是词干。

您是否检查了
fit\u transform
的文档?您的意思是什么?我应该如何检查它?您检查了吗这就是你所指的东西,但我遇到了一个错误。我编辑了我的问题。请你检查一下好吗?另一个问题是标签在另一个文件中。我如何将它与收藏中的每一篇文章进行匹配。标签是数字。如下所示:像这样:1 3 2 1 0 2 3 1…但是each在一个单独的行中,而i标签指的是序列数据中的i文章。我的错误。
fit\u transform
将字符串列表作为其参数。我已经更正了代码。至于标签,你想用它们做什么?如果你训练一个分类器,可以将它们放在一个单独的列表中,只要它们的顺序与你的相同矩阵中的项目。