1

Вообще, мой питон код выполняет следующие три шагаscikit узнать латентное размещение дирихль рвется многопроцессорными и URL запросов

  1. прогон несколько процессов скрести результаты поиска из поисковой системы
  2. скрести текст из каждого URL в списке (без многопроцессорного) с использованием библиотеки запросов на питона
  3. запустить fit_partial метод LDA объекта класса из scikit узнать библиотеку

программа прекрасно работает, когда я только scarped всего 50 ~ 80 URLs, но , когда есть много ссылок, программа зависает на шаге 3 после завершения трех до восьми fit_partial метод и формат печати

[Parallel(n_jobs=4)]: Done 4 out of 4 | elapsed: 0.1s finished 
[Parallel(n_jobs=4)]: Done 4 out of 4 | elapsed: 0.1s finished 
[Parallel(n_jobs=4)]: Done 4 out of 4 | elapsed: 0.1s finished 
[Parallel(n_jobs=4)]: Done 4 out of 4 | elapsed: 0.1s finished 

Если я проверяю ресурсоемкий процесс использований, все процессы питона есть zero cpu usages

Когда я делюсь над тремя шагами на два файла python (один скрипт python делает шаги 1 и 2 и сохраняет результат в виде файлов с использованием дампа сокета, а другой скрипт делает шаг 3 после загрузки сохраненных файлов), второй Файл python (который содержит шаг 3) работает нормально и не вызывает проблем.

Итак, я провел два моделирования. В первом симуляторе я опускаю только шаг 2. Во втором шаге 1 только для моделирования. В каждом симуляторе я загрузил сохраненный результат шагов 1 и 2 вместо того, чтобы выполнять фактический шаг.

Первая симуляция прошла нормально, но вторая симуляция была повешена.

Который дает заключение о том, что шаг 2 вызывает шаг 3 для зависания. пыльника код для шага 2. Все результаты добавляются в объект словаря, который использует URL-адреса в качестве ключей

def parse_information(url): 

print(url) 

try: 
    response = requests.get(url, verify=False) 
except: 
    raise Exception("requests exception") 

obj_bs = BeautifulSoup(response.text, "html.parser") 

meta_refresh = obj_bs.find("meta", {"http-equiv": "refresh"}) 

if meta_refresh is not None: 
    refresh_url = meta_refresh["content"].lower().rsplit("url=")[1] 
    rup = urlparse(refresh_url) 
    if rup.netloc == "": 
     up = urlparse(url) 
     return parse_information(up.scheme + "://" + up.netloc + refresh_url) 
    return parse_information(refresh_url) 

meta_charset = obj_bs.find(lambda tag: tag.name == 'meta' and 'charset' in tag.attrs) 
http_equivs = obj_bs.findAll(lambda tag: tag.name == 'meta' and 'http-equiv' in tag.attrs) 

if meta_charset is not None: 
    response.encoding = meta_charset["charset"] 
elif len(http_equivs) > 0: 
    content_charset = "" 
    for http_equiv in http_equivs: 
     if http_equiv["http-equiv"].lower() == "content-type": 
      content_charset = http_equiv["content"] 
      break 
    if content_charset != "": 
     parse_charset = content_charset.split("charset=") 
     if len(parse_charset) > 1: 
      response.encoding = parse_charset[1] 
    else: 
     response.encoding = "shift_jis" 
else: 
    response.encoding = "shift_jis" 
obj_bs = BeautifulSoup(response.text, "html.parser") 

info_dict = dict(title="", h1="", keywords="", description="", h2="") 

tag_title = obj_bs.find("title") 
info_dict["title"] = tag_title.text if tag_title is not None else "" 

tag_h1 = obj_bs.find("h1") 
info_dict["h1"] = tag_h1.text if tag_h1 is not None else "" 

tags_h2 = obj_bs.findAll("h2") 
info_dict["h2"] = "|".join([tag_h2.text.strip("\t\r\n ") for tag_h2 in tags_h2]) if len(tags_h2) > 0 else "" 

metas = obj_bs.findAll(lambda tag: tag.name == 'meta' and 'name' in tag.attrs) 

for meta in metas: 
    if meta["name"] == "keywords": 
     info_dict["keywords"] = meta.get("content", "") 
    elif meta["name"] == "description": 
     info_dict["description"] = meta.get("content", "") 

htot = html2text.HTML2Text() 
htot.ignore_links = True 
htot.images_to_alt = True 
htot.ignore_emphasis = True 

pure_text = htot.handle(response.text).lower() 

noun_dict = japanese_noun_dict(pure_text) 

if len(noun_dict) == 0: 
    num_nouns = 0 
else: 
    num_nouns = reduce(lambda a, b: a + b, noun_dict.values()) 

return {"info": info_dict, "noun": {"num": num_nouns, "freq": noun_dict}} 

Бельего код для шага 3. g_result_lda.model является scikit учиться латентным размещение дирихля объекта класса. corpus_data является матрица документа слова, созданный из URL-адреса текстов

g_result_lda = TextLDA(documents=corpus_data, n_topics=n_topic) 

len_corpus = len(g_result_lda.corpus_data) 

# g_result_lda.model.fit(g_result_lda.corpus_data) 

start_index = 0 

while start_index < len_corpus: 

    end_index = start_index + 20 if start_index + 20 < len_corpus else len_corpus 
    g_result_lda.model.partial_fit(g_result_lda.corpus_data[start_index:end_index]) 
    start_index = start_index +20 

Кто-нибудь есть какие-либо идеи, что является причиной этой проблемы? Имеет ли библиотека scikit-learn конфликт с библиотекой запросов?

Я учусь питона на OSX

ответ

0

Я просто решил проблему построения сервера RPC с RabbitMQ. Я использовал библиотеку Pika для использования RabbitMQ и сделал сервер с BlockingConnection. Сервер работает исключительно на одном потоке и процесс, ожидая одного запроса, и когда он получает запрос, он анализирует LDA с мультипроцессором и возвращает результат.

 Смежные вопросы

  • Нет связанных вопросов^_^