ValueError: np.nan является недействительным документом, ожидаемым байтом или строкой Unicode - PullRequest
0 голосов
/ 06 апреля 2019

Я пытаюсь выполнить анализ настроений в Uber-Review. Я использовал Naive Bays Sklearn для анализа настроений, я использовал данные триангуляции от kaggle на reviwes, Но данные теста находятся в листе xlsx, я использовал pandas для создания фрейма данных,

import pandas as pd
test=pd.read_excel("uber.xlsx",sep="\t",encoding="ISO-8859-1");
test.head(3)

так как он вернул объект d: type, я преобразовал его в список, используя

test_text = []
for comments in comments_t:
    test_text.append(comments) 

Мой код для классификации текста на основе данных обучения:

# Training Phase
from sklearn.naive_bayes import BernoulliNB
classifier = BernoulliNB().fit(train_documents,labels)

def sentiment(word):
    return classifier.predict(count_vectorizer.transform([word]))

но при прогнозировании возвращает это значение ошибки:

/anaconda3/lib/python3.7/site-packages/sklearn/feature_extraction/text.py in transform(self, raw_documents)
   1084 
   1085         # use the same matrix-building strategy as fit_transform
-> 1086         _, X = self._count_vocab(raw_documents, fixed_vocab=True)
   1087         if self.binary:
   1088             X.data.fill(1)

/anaconda3/lib/python3.7/site-packages/sklearn/feature_extraction/text.py in _count_vocab(self, raw_documents, fixed_vocab)
    940         for doc in raw_documents:
    941             feature_counter = {}
--> 942             for feature in analyze(doc):
    943                 try:
    944                     feature_idx = vocabulary[feature]

/anaconda3/lib/python3.7/site-packages/sklearn/feature_extraction/text.py in <lambda>(doc)
    326                                                tokenize)
    327             return lambda doc: self._word_ngrams(
--> 328                 tokenize(preprocess(self.decode(doc))), stop_words)
    329 
    330         else:

/anaconda3/lib/python3.7/site-packages/sklearn/feature_extraction/text.py in decode(self, doc)
    141 
    142         if doc is np.nan:
--> 143             raise ValueError("np.nan is an invalid document, expected byte or "
    144                              "unicode string.")
    145 

ValueError: np.nan is an invalid document, expected byte or unicode string.

Я пытался решить в соответствии с этим:

https://stackoverflow.com/questions/39303912/tfidfvectorizer-in-scikit-learn-valueerror-np-nan-is-an-invalid-document

1 Ответ

0 голосов
/ 08 апреля 2019

Данные, которые я нашел в Kaggle для Uber: https://www.kaggle.com/purvank/uber-rider-reviews-dataset/downloads/Uber_Ride_Reviews.csv/2

, теперь приходят к вашей проблеме

import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import BernoulliNB

df = pd.read_csv('Uber_Ride_Reviews.csv')
df.head()
Out[7]: 
                                     ride_review    ...      sentiment
0  I completed running New York Marathon requeste...    ...              0
1  My appointment time auto repairs required earl...    ...              0
2  Whether I using Uber ride service Uber Eats or...    ...              0
3  Why hard understand I trying retrieve Uber cab...    ...              0
4  I South Beach FL I staying major hotel ordered...    ...              0


df.columns
Out[8]: Index(['ride_review', 'ride_rating', 'sentiment'], dtype='object')

vect  = CountVectorizer()
vect1 = vect.fit_transform(df['ride_review'])

classifier = BernoulliNB()
classifier.fit(vect1,df['sentiment'])

# predicting new comment it is giving O/p
new_test_= vect.transform(['uber ride is very good']) 
classifier.predict(new_test_)
Out[5]: array([0], dtype=int64)

 # but when applying your function sentiment you are only passing word, you need to 
 #passclassifier as well as Countvectorizer instance 

def sentiment(word, classifier, vect):
    return classifier.predict(vect.transform([word]))

#calling above function for new sentiment
sentiment('uber ride is very good', vect, classifier)
O/p --> Out[10]: array([0], dtype=int64)
...