Как удалить None из результата функции?

Извините, но я до сих пор не могу решить эту проблему 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:

товар не возвращается сайт магазин квитанция заказ доступен заранее

Никто

Документы по теме

Трассировка (последний последний вызов): файл «NMF.py», строка 49, для темы в диапазоне (len (темы)):

TypeError: объект типа «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

person marin    schedule 17.09.2018    source источник
comment
может просто попробовать for topic in topics: вместо for topic in range(len(topics))   -  person Khalil Al Hooti    schedule 17.09.2018
comment
Не могли бы вы также вставить некоторые образцы данных, чтобы воссоздать ошибку?   -  person amanbirs    schedule 17.09.2018
comment
@amanbirs Готово!   -  person marin    schedule 17.09.2018


Ответы (2)


Как указано в сообщении об ошибке, ваша ошибка возникает в этой строке:

for topic in range(len(topics)): 

потому что python пытается получить длину объекта 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 ""
person Sharku    schedule 17.09.2018

Ваша процедура display_topics ничего не возвращает, однако вы присваиваете ее результат переменной topics, которой затем присваивается значение Null. И вы не можете перебирать объект Null.

person Markus    schedule 17.09.2018
comment
спасибо, но мне просто нужно удалить этот None, чтобы весь скрипт работал... - person marin; 17.09.2018
comment
@marin Хорошо, каким должно быть значение topics? Что это, вы хотите повторить? - person Markus; 17.09.2018
comment
Я хочу получить документы, прикрепленные к каждой теме. Если я сделаю это: напечатайте «Тема 0» docs = np.argsort (document_topics [:, 0]) [:: - 1], это сработает, но если я попытаюсь получить все темы и документы, это не сработает... - person marin; 17.09.2018
comment
Затем вам нужно вернуть эти вещи от display_topics. - person Markus; 17.09.2018