Nltk: لا تعمل المعالجة المتعددة و nltk معًا بشكل جيد

تم إنشاؤها على ١٦ أبريل ٢٠١٥  ·  22تعليقات  ·  مصدر: nltk/nltk

بصراحة ، هذه القضية ليست خطيرة بقدر ما هي مثيرة للفضول. لقد اكتشفت أنه عند استيراد NLTK ، سيؤدي ذلك إلى إنهاء أي عملية فرعية لـ Python قبل أوانها على مكالمة الشبكة. رمز المثال:

from multiprocessing import Process
import nltk
import time


def child_fn():
    print "Fetch URL"
    import urllib2
    print urllib2.urlopen("https://www.google.com").read()[:100]
    print "Done"


while True:
    child_process = Process(target=child_fn)
    child_process.start()
    child_process.join()
    print "Child process returned"
    time.sleep(1)

قم بتشغيله مع استيراد NLTK ، وسترى أن استدعاء urlopen () لا يتم تنفيذه أبدًا. قم بالتعليق على السطر import nltk ، وسينفذ بشكل جيد.

لماذا ا؟

* تحرير: هذا خاص ببايثون 2. لم أقم باختباره على 3 حتى الآن.

admin bug inactive multithread / multiprocessing pythonic

التعليق الأكثر فائدة

لست مألوفًا بشكل لا يصدق مع nltk ، لكنني قمت بعمل بحث أعمى قليلاً لمعرفة سبب نجاح / فشل الاختبار. هذا ما كان علي فعله للحزمة __init__.py أجل اجتياز الاختبار:


التفاصيل (انقر للتوسيع)

###########################################################
# TOP-LEVEL MODULES
###########################################################

# Import top-level functionality into top-level namespace

from nltk.collocations import *
from nltk.decorators import decorator, memoize
# from nltk.featstruct import *
# from nltk.grammar import *
from nltk.probability import *
from nltk.text import *
# from nltk.tree import *
from nltk.util import *
from nltk.jsontags import *

# ###########################################################
# # PACKAGES
# ###########################################################

# from nltk.chunk import *
# from nltk.classify import *
# from nltk.inference import *
from nltk.metrics import *
# from nltk.parse import *
# from nltk.tag import *
from nltk.tokenize import *
from nltk.translate import *
# from nltk.sem import *
# from nltk.stem import *

# Packages which can be lazily imported
# (a) we don't import *
# (b) they're slow to import or have run-time dependencies
#     that can safely fail at run time

from nltk import lazyimport
app = lazyimport.LazyModule('nltk.app', locals(), globals())
chat = lazyimport.LazyModule('nltk.chat', locals(), globals())
corpus = lazyimport.LazyModule('nltk.corpus', locals(), globals())
draw = lazyimport.LazyModule('nltk.draw', locals(), globals())
toolbox = lazyimport.LazyModule('nltk.toolbox', locals(), globals())

# Optional loading

try:
    import numpy
except ImportError:
    pass
else:
    from nltk import cluster

# from nltk.downloader import download, download_shell
# try:
#     from six.moves import tkinter
# except ImportError:
#     pass
# else:
#     try:
#         from nltk.downloader import download_gui
#     except RuntimeError as e:
#         import warnings
#         warnings.warn("Corpus downloader GUI not loaded "
#                       "(RuntimeError during import: %s)" % str(e))

# explicitly import all top-level modules (ensuring
# they override the same names inadvertently imported
# from a subpackage)

# from nltk import ccg, chunk, classify, collocations
# from nltk import data, featstruct, grammar, help, inference, metrics
# from nltk import misc, parse, probability, sem, stem, wsd
# from nltk import tag, tbl, text, tokenize, translate, tree, treetransforms, util


ومن المثير للاهتمام ، أن جميع عمليات الاستيراد المعطلة تؤدي في النهاية إلى استيراد tkinter ، والذي أعتقد أنه السبب الأساسي. إذا استبدلت import nltk بـ import tkinter في البرنامج النصي للاختبار ، فسأحصل على تقرير تعطل مشابه جدًا ، وكلاهما يشير إلى tkinter.

مما يمكنني قوله ، هذه الحزم تستورد مباشرة tkinter :

  • nltk.app
  • nltk.draw
  • nltk.sem

من التغييرات المذكورة أعلاه إلى الحزمة الرئيسية __init__ ، هذه هي الواردات التي بها مشاكل ، وكيف تعود إلى استيراد tkinter

  • nltk.featstruct ( sem )
  • nltk.grammar ( featstruct )
  • nltk.tree ( grammar )
  • nltk.chunk ( chunk.named_entity > tree )
  • nltk.parse ( parse.bllip > tree )
  • nltk.tag ( tag.stanford > parse )
  • nltk.classify ( classify.senna > tag )
  • nltk.inference ( inference.discourse > sem ، tag )
  • nltk.stem ( stem.snowball > corpus > corpus.reader.timit > tree )

ال 22 كومينتر

هل لديك استثناءات؟

لا. وضعت عبارة try .. except: حول import urllib2; print... لكن لم أحصل على شيء منها.

أنا أواجه نفس المشكلة بالضبط. لقد فتحت للتو سؤالًا قد يكون مفيدًا لربطه هنا: http://stackoverflow.com/questions/30766419/python-child-process-silently-crashes-when-issuing-an-http-request

عملية الطفل تتعطل بالفعل بصمت دون إشعار آخر.

أنا لا أتفق معك @ oxymor0n ، يبدو أن هذه مشكلة خطيرة بالنسبة لي. هذا يعني في الأساس أنه كلما تم استيراد nltk ، لا توجد طريقة لإصدار طلب من عملية تابعة والتي يمكن أن تكون مزعجة حقًا عند العمل مع واجهات برمجة التطبيقات.

The child process is indeed crashing silently without further notice.

نواجه هذه المشكلة أيضًا مع مزيج من: nltk و gunicorn (مع تحميل nltk عبر Prefork) والقارورة.

قم بإزالة nltk import ، ويعمل كل شيء. ماعدا nltk.

/ ccescherba

ninowalker ، @ oxymor0n إنه أمر غريب ،

Fetch URL
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="de"><head><meta content
Done
Child process returned
Fetch URL
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="de"><head><meta content
Done
Child process returned
Fetch URL
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="de"><head><meta content
Done
Child process returned
Fetch URL
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="de"><head><meta content
Done
Child process returned
Fetch URL
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="de"><head><meta content
Done
Child process returned
Fetch URL
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="de"><head><meta content
Done
Child process returned
Fetch URL
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="de"><head><meta content
Done
Child process returned

هذا هو الناتج المتوقع ، أليس كذلك؟

لا يكسر طلبي مع هذا أيضًا:

alvas<strong i="13">@ubi</strong>:~$ python
Python 2.7.6 (default, Jun 22 2015, 17:58:13) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from multiprocessing import Process
>>> import requests
>>> from pprint import pprint
>>> Process(target=lambda: pprint(
...         requests.get('https://api.github.com'))).start()
>>> <Response [200]>

>>> import nltk
>>> Process(target=lambda: pprint(
...         requests.get('https://api.github.com'))).start()
>>> <Response [200]>

أنا استخدم:

  • بيثون 2.7.6
  • nltk 3.0.3
  • أوبونتو 14.04.2018

واجهت نفس المشكلة التي واجهتها هيستا . لديّ ملف مساعد string_util.python يستورد nltk ، لكنه لا يُستخدم في ملف python الرئيسي الذي يستخدم وحدة معالجة متعددة لبدء زاحف متعدد العمليات. العَرَض هو أن العملية الفرعية تتعطل فقط ولا توجد رسالة خطأ (ولا حتى رسالة استثناء).
بعد التعليق على الواردات والوظائف المتعلقة بـ nltk ، تم حل المشكلة.

تفاصيل:
نظام التشغيل: Yosemite 10.10.5
بايثون: 2.7.10
استرداد محتوى الصفحة: استخدمت urllib2 في البداية ، ثم انتقلت إلى الطلبات لاحقًا.

هذا خطأ خطير للغاية ، وآمل أن يتدخل شخص ما ويصلحه. شكر!

أعتقد أن هذه مشكلة خطيرة إذا كنت تمارس البرمجة اللغوية العصبية على مستوى الإنتاج. نحن نستخدم عمال Rq (http://python-rq.org/) ، لتشغيل عدة خطوط أنابيب NLP ، والتي يتم قتلها بصمت عند إجراء مكالمات عبر الشبكة. آمل أن يكون هناك إصلاح قريبًا. شكر!

sasinda : قد ترغب في إجراء مكالمة على القائمة البريدية nltk-dev لمعرفة ما إذا كان يمكنك لفت الانتباه إلى هذه المشكلة.

sasinda لست متأكدًا من كيفية عمل Rq تمامًا ولكن في مشروع NLP الخاص بمستوى الإنتاج الخاص بي ، تمكنت من حل هذه المشكلة عن طريق بدء كل عملية في مترجم Python المنفصل والمعزول ، باستخدام برنامج نصي شل لتوليدها عند بدء التشغيل. في هذه الحالة ، لا يتعين على Python أبدًا أن تتفرع ولا يحدث الانهيار الصامت من nltk. ربما هذا يمكن أن يساعد في هذه الأثناء.

لقد اكتشفت أن إجراء الاستيراد على مستوى الوظيفة يؤدي إلى تجنب المشكلة.

بمعنى آخر ، هذا يعمل:

def split(words):
    import nltk
    return nltk.word_tokenize(words)

وهذا لا:

import nltk
def split(words):
    return nltk.word_tokenize(words)

شكرا mpenkov. هل هذا يحل المشكلة؟

stevenbird لا أعتقد ذلك. إنه حل بديل ، لكنه ليس حلاً.

IMHO ، إذا كان استيراد مكتبة جهة خارجية يكسر أحد مكونات مكتبة Python القياسية ، فإن شيئًا غير مقدس يحدث في مكان ما ، ويجب إصلاحه.

mpenkov لست متأكدًا تمامًا من سبب كود @ oxymor0n الأصلي:

from multiprocessing import Process
import nltk
import time
import urllib2

# HACK
urllib2.build_opener(urllib2.HTTPHandler())

def child_fn():
    print "Fetch URL"
    import urllib2
    print urllib2.urlopen("https://www.google.com").read()[:100]
    print "Done"


while True:
    child_process = Process(target=child_fn)
    child_process.start()
    child_process.join()
    print "Child process returned"
    time.sleep(1)

mpenkovninowalker، @ oxymor0nsasindawenbowang هل كل ما زالوا يواجهون نفس المشكلة؟

لم أتمكن من تكرار المشكلة على جهازي:

from multiprocessing import Process
import nltk
import time

def child_fn():
    print "Fetch URL"
    import urllib2
    print urllib2.urlopen("https://www.google.com").read()[:100]
    print "Done"


while True:
    child_process = Process(target=child_fn)
    child_process.start()
    child_process.join()
    print "Child process returned"
    time.sleep(1)

يعطيني:

Fetch URL
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="en-SG"><head><meta cont
Done
Child process returned
Fetch URL
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="en-SG"><head><meta cont
Done
Child process returned
Fetch URL
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="en-SG"><head><meta cont
Done

انا على:

  • بايثون 2.7.12
  • NLTK 3.2.5
  • أوبونتو 16.04.3

alvations لقد مر وقت طويل منذ أن وجدت هذه المشكلة.
لقد نسيت حتى قاعدة المشروع التي كانت تواجه هذه المشكلة ، لذلك لم أستطع إخبارك ما إذا كانت المشكلة لا تزال قائمة أم لا.
آسف!

alvations أنا أيضًا لا أتذكر أي من

قمت بتشغيل الكود الخاص بك على جهازي ولم أتمكن من تكرار المشكلة.

بايثون 2.7.12
nltk 3.2.1
macOS 10.12.6

alvations أنا أيضًا لا أعمل في هذا المشروع بعد الآن. لكن استخدم أحد تلك الحلول.
لقد جربت الكود الخاص بك ولكن لا تزال العملية الفرعية تخرج مع وجود خطأ في المقطع (رمز الخروج 11) بالنسبة لي (المخارج في السطر: urllib2.urlopen ("https://www.google.com") .read () [: 100])

لقد عملت مع urllib3 (https://urllib3.readthedocs.io/en/latest/) بالرغم من ذلك.

  • nltk (3.2.5)
  • urllib3 (1.22)
  • نظام التشغيل Mac OSX 10.12.16
  • Python 2.7.13 | Continuum Analytics، Inc. | (افتراضي ، 20 ديسمبر 2016 ، 23:05:08)
    [GCC 4.2.1 متوافق Apple LLVM 6.0 (clang-600.0.57)] على داروين

بقدر ما أستطيع أن أقول ، يبدو أن هذه المشكلة تؤثر على macOS. باستخدام Python 3.6 حتى الآن ،

  • macOS 10.13 (فشل)
  • Centos 7.2 (نجح)
  • Ubuntu 16.04 (نجح)

سكربت OP المعدل لـ python3:

from multiprocessing import Process
import nltk
import time


def child_fn():
    from urllib.request import urlopen
    print("Fetch URL")
    print(urlopen("https://www.google.com").read()[:100])
    print("Done")


child_process = Process(target=child_fn)
child_process.start()
child_process.join()
print("Child process returned")
time.sleep(1)

انتاج:

Fetch URL
Child process returned

يتم إنهاء العملية الفرعية بشكل غير متوقع ، وتتلقى مخرجات مماثلة لما شوهد في منشور Stack Overflow .

أعتقد أن هذا أمر محير للعقل. قد يكون له علاقة بالتعامل مع الخيوط على نظام MacOS.

لست مألوفًا بشكل لا يصدق مع nltk ، لكنني قمت بعمل بحث أعمى قليلاً لمعرفة سبب نجاح / فشل الاختبار. هذا ما كان علي فعله للحزمة __init__.py أجل اجتياز الاختبار:


التفاصيل (انقر للتوسيع)

###########################################################
# TOP-LEVEL MODULES
###########################################################

# Import top-level functionality into top-level namespace

from nltk.collocations import *
from nltk.decorators import decorator, memoize
# from nltk.featstruct import *
# from nltk.grammar import *
from nltk.probability import *
from nltk.text import *
# from nltk.tree import *
from nltk.util import *
from nltk.jsontags import *

# ###########################################################
# # PACKAGES
# ###########################################################

# from nltk.chunk import *
# from nltk.classify import *
# from nltk.inference import *
from nltk.metrics import *
# from nltk.parse import *
# from nltk.tag import *
from nltk.tokenize import *
from nltk.translate import *
# from nltk.sem import *
# from nltk.stem import *

# Packages which can be lazily imported
# (a) we don't import *
# (b) they're slow to import or have run-time dependencies
#     that can safely fail at run time

from nltk import lazyimport
app = lazyimport.LazyModule('nltk.app', locals(), globals())
chat = lazyimport.LazyModule('nltk.chat', locals(), globals())
corpus = lazyimport.LazyModule('nltk.corpus', locals(), globals())
draw = lazyimport.LazyModule('nltk.draw', locals(), globals())
toolbox = lazyimport.LazyModule('nltk.toolbox', locals(), globals())

# Optional loading

try:
    import numpy
except ImportError:
    pass
else:
    from nltk import cluster

# from nltk.downloader import download, download_shell
# try:
#     from six.moves import tkinter
# except ImportError:
#     pass
# else:
#     try:
#         from nltk.downloader import download_gui
#     except RuntimeError as e:
#         import warnings
#         warnings.warn("Corpus downloader GUI not loaded "
#                       "(RuntimeError during import: %s)" % str(e))

# explicitly import all top-level modules (ensuring
# they override the same names inadvertently imported
# from a subpackage)

# from nltk import ccg, chunk, classify, collocations
# from nltk import data, featstruct, grammar, help, inference, metrics
# from nltk import misc, parse, probability, sem, stem, wsd
# from nltk import tag, tbl, text, tokenize, translate, tree, treetransforms, util


ومن المثير للاهتمام ، أن جميع عمليات الاستيراد المعطلة تؤدي في النهاية إلى استيراد tkinter ، والذي أعتقد أنه السبب الأساسي. إذا استبدلت import nltk بـ import tkinter في البرنامج النصي للاختبار ، فسأحصل على تقرير تعطل مشابه جدًا ، وكلاهما يشير إلى tkinter.

مما يمكنني قوله ، هذه الحزم تستورد مباشرة tkinter :

  • nltk.app
  • nltk.draw
  • nltk.sem

من التغييرات المذكورة أعلاه إلى الحزمة الرئيسية __init__ ، هذه هي الواردات التي بها مشاكل ، وكيف تعود إلى استيراد tkinter

  • nltk.featstruct ( sem )
  • nltk.grammar ( featstruct )
  • nltk.tree ( grammar )
  • nltk.chunk ( chunk.named_entity > tree )
  • nltk.parse ( parse.bllip > tree )
  • nltk.tag ( tag.stanford > parse )
  • nltk.classify ( classify.senna > tag )
  • nltk.inference ( inference.discourse > sem ، tag )
  • nltk.stem ( stem.snowball > corpus > corpus.reader.timit > tree )

شكرًا @ rpkilby ، هذا مفيد جدًا!

يبدو أن هذه المشكلة https://stackoverflow.com/questions/16745507/tkinter-how-to-use-threads-to-preventing-main-event-loop-from-freezing

أعتقد أن العبث كان نقطة ألم لنا لبعض الوقت. ربما سيكون من الجيد أن نجد بديلًا لها.

أنا موافق. سيكون الحل الأقصر مدى هو دفن واردات tkinter داخل الفئات والطرق التي تحتاج إلى tkinter ، وتجنب استيرادها من خلال البرامج التي لا تحتاج إليها. لقد فعلنا بالفعل شيئًا مشابهًا لـ numpy.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات