Многопоточность в NLTK WordNetLemmatizer?

Я пытаюсь использовать многопоточность, чтобы ускорить процесс. Я использую wordnetlemmatizer для лемматизации слов, и эти слова могут быть в дальнейшем использованы sentiwordnet для вычисления тональности текста. Моя функция анализа настроений, в которой я использую WordNetLemmatizer, выглядит следующим образом:

import nltk
from nltk.corpus import sentiwordnet as swn

def SentimentA(doc, file_path):
    sentences = nltk.sent_tokenize(doc)
    # print(sentences)
    stokens = [nltk.word_tokenize(sent) for sent in sentences]
    taggedlist = []
    for stoken in stokens:
        taggedlist.append(nltk.pos_tag(stoken))
    wnl = nltk.WordNetLemmatizer()
    score_list = []
    for idx, taggedsent in enumerate(taggedlist):
        score_list.append([])
        for idx2, t in enumerate(taggedsent):
            newtag = ''
            lemmatized = wnl.lemmatize(t[0])
            if t[1].startswith('NN'):
                newtag = 'n'
            elif t[1].startswith('JJ'):
                newtag = 'a'
            elif t[1].startswith('V'):
                newtag = 'v'
            elif t[1].startswith('R'):
                newtag = 'r'
            else:
                newtag = ''
            if (newtag != ''):
                synsets = list(swn.senti_synsets(lemmatized, newtag))

                score = 0
                if (len(synsets) > 0):
                    for syn in synsets:
                        score += syn.pos_score() - syn.neg_score()
                    score_list[idx].append(score / len(synsets))
    return SentiCal(score_list)

После запуска 4 потоков я получаю следующую ошибку для первых 3 потоков, а последний поток работает отлично.

AttributeError: 'WordNetCorpusReader' object has no attribute '_LazyCorpusLoader__args'

Я уже пытался импортировать пакет NLTK локально, как указано в этой проблеме, и пробовал решение, приведенное на этой странице.


person Shivansh bhandari    schedule 30.05.2018    source источник
comment
LazyCorpusLoader должен оценить перед пулом =) Я отвечу сегодня, через 10 часов, если никто не ответит.   -  person alvas    schedule 31.05.2018


Ответы (1)


Быстрый взлом:

import nltk
from nltk.corpus import sentiwordnet as swn
# Do this first, that'll do something eval() 
# to "materialize" the LazyCorpusLoader
next(swn.all_senti_synsets()) 

# Your other code here. 

Подробности позже... Все еще печатаю

person alvas    schedule 31.05.2018
comment
когда я использую приведенную выше подсказку, я получаю сообщение об ошибке: AttributeError: 'SentiWordNetCorpusReader' object has no attribute 'words'. Но у WordNet есть атрибут Words, который я использовал так же, как вы показали выше. Я все еще получаю ту же ошибку. Как ни странно, оба потока запускаются, когда я напечатал переменную lemmatized в своем коде. - person Shivansh bhandari; 31.05.2018
comment
Извините, это должно быть next(swn.all_senti_synsets()) для sentiwordnet и next(wn.words()) для wordnet. - person alvas; 31.05.2018
comment
Когда я увеличиваю количество потоков и запускаю его для большего количества документов, некоторые потоки все еще останавливаются из-за той же ошибки. Не могли бы вы рассказать мне об этом? - person Shivansh bhandari; 01.06.2018
comment
Помните, что многопоточность Python является своего рода подделкой, и сериализованные выходные данные передаются. Нелегко отладить, что не так, если вы не поделитесь полным кодом и набором данных, а кто-то другой не попытается воспроизвести проблему. - person alvas; 02.06.2018