Как удалить None из результата функции?
Извините, но я до сих пор не могу решить эту проблему. Я использую алгоритм NMF для создания тем корпуса, а затем пытаюсь получить документы, прикрепленные к каждой теме. Но никто не мешает мне! Когда я пытаюсь получить документы, у меня появляется ошибка
Автор сценария:
import pandas
import numpy as np
import pandas as pd
from sklearn.decomposition import NMF
from sklearn.feature_extraction.text import TfidfVectorizer
def display_topics(model, feature_names, n_top_words):
for topic_idx, topic in enumerate(model.components_):
print "Topic %d:" % (topic_idx)
print " ".join([feature_names[i] for i in topic.argsort()[:-n_top_words - 1:-1]])
text = pandas.read_csv('pretraitement_virgile.csv', encoding = 'utf-8')
good_text = text['phrase']
bad_text = text['raw_phrase']
bad_text_list = bad_text.values.tolist()
good_text_list = good_text.values.tolist()
tfidf_vectorizer = TfidfVectorizer()
tfidf = tfidf_vectorizer.fit_transform(good_text_list)
tfidf_feature_names = tfidf_vectorizer.get_feature_names()
topics_number = 3
# Run NMF
nmf = NMF(n_components=topics_number, random_state=1, alpha=.1, l1_ratio=.5, init='nndsvd').fit(tfidf)
document_topics = nmf.fit_transform(tfidf)
n_top_words = 10
print 'NMF topics'
topics = display_topics(nmf, tfidf_feature_names, n_top_words)
print topics
print
print 'Documents per topic'
for topic in range(len(topics)):
if topic == None:
pass
else:
print("Topic {}:".format(topic))
docs = np.argsort(document_topics[:, topic])[::-1]
for mail in docs[:3]:
bad_text_list_n = " ".join(bad_text_list[mail].split(",")[:2])
print (" ".join(good_text_list[mail].split(",")[:2]) + ',' + bad_text_list_n)
Я попытался поставить условие, чтобы игнорировать имя, но оно не работает. У меня все еще та же ошибка.
Тема 0:
заказ отменить дату доставки не хочу хранить всегда далеко вперед
Тема 1:
товар не сломан только прибыл посылка получила цвет доставлен
Тема 2:
товар не возвращается на сайт магазина квитанция заказа доступна заранее
Никто
Документы по теме
Traceback (последний вызов был последним): файл "NMF.py", строка 49, для темы в диапазоне (len(themes)):
Ошибка типа: объект типа 'NoneType' не имеет len()
Мне нужен этот результат:
Тема 0:
заказ отменить дату доставки не хочу хранить всегда далеко вперед
Тема 1:
товар не сломан только прибыл посылка получила цвет доставлен
Тема 2:
товар не возвращается на сайт магазина квитанция заказа доступна заранее
Документы по теме
Тема 0:
текст текст текст
текст текст текст
текст текст текст
Тема 1:
текст текст текст
текст текст текст
текст текст текст
Тема 2:
текст текст текст
текст текст текст
текст текст текст
Некоторые (глупые) данные приводят пример:
phrase,raw_phrase
delicious fruit mango, the mango is a delicious fruit
important object computer, the computer is an important object
popular banana fruit, banana is a popular fruit
pen important thing, pen is an important thing
purple grape, the grape is purple
phone world object, the phone is a worldwide object
2 ответа
Как указано в сообщении об ошибке, ваша ошибка происходит в этой строке:
for topic in range(len(topics)):
потому что питон пытается получить длину объекта topics
, быть None
Типа у него нет длины.
Если вы хотите пропустить весь цикл, когда topics
является Null
ты можешь использовать:
for topic in topics:
и изменить все topics[topic]
чтобы просто topic
Или, если вы хотите поймать эту ошибку, вы можете написать:
try:
l = len(topics)
except TypeError:
# do somthing about it like:
l = 0
for topic in range(l):
# go on in topic loop
Или вы можете проверить None после создания topics
объект с:
if variable is None:
topics = #something else or empty with ""
Ваша процедура display_topics
ничего не возвращает, но вы присваиваете результат переменной topics
, который затем устанавливается в Null
, И вы не можете перебрать Null
объект.