Nltk: corenlp.py CoreNLPServer melempar pengecualian TypeError

Dibuat pada 22 Jun 2017  ·  21Komentar  ·  Sumber: nltk/nltk

Halo,

Berikut kodenya:

>>> s = nltk.parse.corenlp.CoreNLPServer(path_to_jar='/usr/local/share/stanford/stanford-corenlp-3.8.0.jar', path_to_models_jar='/usr/local/share/stanford/stanford-english-corenlp-2017-06-09-models.jar')
Traceback (most recent call last):
  File "<input>", line 1, in <module>
    s = nltk.parse.corenlp.CoreNLPServer(path_to_jar='/usr/local/share/stanford/stanford-corenlp-3.8.0.jar', path_to_models_jar='/usr/local/share/stanford/stanford-english-corenlp-2017-06-09-models.jar')
  File "/Users/adiep/feedback-sentiment/.env/src/nltk/nltk/parse/corenlp.py", line 69, in __init__
    key=lambda model_name: re.match(self._JAR, model_name)
TypeError: '>' not supported between instances of 'NoneType' and 'NoneType'

Fungsi max melempar pengecualian ini.

Saya pikir yang terjadi adalah key=lambda model_name: re.match(self._JAR, model_name) mengembalikan NoneType karena tidak cocok dengan apa pun. Jadi mengisi daftar NoneType dan max gagal mengurutkannya. Saya menemukan bahwa self._JAR dan model_name dievaluasi sebagai berikut:

>>> type(re.match(r'stanford-corenlp-(\d+)\.(\d+)\.(\d+)\.jar', '/usr/local/share/stanford/stanford-corenlp-3.8.0.jar'))
<class 'NoneType'>

Terima kasih,

pleaseverify resolved stanford api

Komentar yang paling membantu

Tuan yang baik, sekarang berhasil.

Jadi secara keseluruhan, saya harus mengubah re.match menjadi re.search.group dan mematikan server corenlp yang mengambang di latar belakang.

Mungkin harus ada beberapa kode untuk mendeteksi jika ada server corenlp lain yang berjalan? Tidak tahu apakah itu layak dilakukan.

Semua 21 komentar

Apakah fungsi max dianggap sebagai feed nama file dan bukan path lengkap?

Saya mencoba untuk meneruskan folder CoreNLPServer dan nltk tidak dapat menemukannya karena suatu alasan.

Hai,

saya rasa begitu, apa itu jars ?

Guci terletak di `/usr/local/share/stanford'

Di sini ls dari dir yang relevan:

(.env) ➜  stanford l
total 2794816
-rwxr-xr-x   1 adiep  admin   5.3K Jun 21 17:20 CoreNLP-to-HTML.xsl*
-rw-r--r--   1 adiep  admin   1.6K Jun 21 17:20 LIBRARY-LICENSES
-rw-r--r--   1 adiep  admin    34K Jun 21 17:20 LICENSE.txt
-rw-r--r--   1 adiep  admin   769B Jun 21 17:20 Makefile
-rw-r--r--   1 adiep  admin   3.6K Jun 21 17:20 README.txt
-rw-r--r--   1 adiep  admin   2.3K Jun 21 17:20 SemgrexDemo.java
-rw-r--r--   1 adiep  admin   1.8K Jun 21 17:20 ShiftReduceDemo.java
-rw-r--r--   1 adiep  admin   5.7K Jun 21 17:20 StanfordCoreNlpDemo.java
-rw-r--r--   1 adiep  admin   195K Jun 21 17:20 StanfordDependenciesManual.pdf
-rw-r--r--   1 adiep  admin   3.9K Jun 21 17:20 build.xml
-rwxr-xr-x   1 adiep  admin   871B Jun 21 17:20 corenlp.sh*
-rw-r--r--   1 adiep  admin   1.2M Jun 21 17:20 ejml-0.23-src.zip
-rw-r--r--   1 adiep  admin   207K Jun 21 17:20 ejml-0.23.jar
-rw-r--r--   1 adiep  admin    89B Jun 21 17:20 input.txt
-rw-r--r--   1 adiep  admin    19K Jun 21 17:20 input.txt.xml
-rw-r--r--   1 adiep  admin    54K Jun 21 17:20 javax.json-api-1.0-sources.jar
-rw-r--r--   1 adiep  admin    83K Jun 21 17:20 javax.json.jar
-rw-r--r--   1 adiep  admin   756K Jun 21 17:20 joda-time-2.9-sources.jar
-rw-r--r--   1 adiep  admin   615K Jun 21 17:20 joda-time.jar
-rw-r--r--   1 adiep  admin   192K Jun 21 17:20 jollyday-0.4.9-sources.jar
-rw-r--r--   1 adiep  admin   209K Jun 21 17:20 jollyday.jar
drwxr-xr-x  10 adiep  admin   340B Jun 21 17:20 patterns/
-rw-r--r--   1 adiep  admin   5.3K Jun 21 17:20 pom.xml
-rw-r--r--   1 adiep  admin   1.3M Jun 21 17:20 protobuf.jar
-rw-r--r--   1 adiep  admin    31K Jun 21 17:20 slf4j-api.jar
-rw-r--r--   1 adiep  admin    10K Jun 21 17:20 slf4j-simple.jar
-rw-r--r--   1 adiep  admin   9.6M Jun 21 17:20 stanford-corenlp-3.8.0-javadoc.jar
-rw-r--r--   1 adiep  admin   346M Jun 21 17:20 stanford-corenlp-3.8.0-models.jar
-rw-r--r--   1 adiep  admin   5.0M Jun 21 17:20 stanford-corenlp-3.8.0-sources.jar
-rw-r--r--   1 adiep  admin   7.6M Jun 21 17:20 stanford-corenlp-3.8.0.jar
-rw-r--r--   1 adiep  admin   991M Jun 21 17:37 stanford-english-corenlp-2017-06-09-models.jar
drwxr-xr-x   5 adiep  admin   170B Jun 21 17:20 sutime/
drwxr-xr-x   6 adiep  admin   204B Jun 21 17:20 tokensregex/
-rw-r--r--   1 adiep  admin   656K Jun 21 17:20 xom-1.2.10-src.jar
-rw-r--r--   1 adiep  admin   306K Jun 21 17:20 xom.jar

Saya tidak mengerti mengapa gagal menemukan jar di folder.

Bisakah Anda mengatur variabel env classpath sebelum memulai server:

os.environ['CLASSPATH'] = '/usr/local/share/stanford'

solusi lain bisa:

os.environ['STANFORD_PARSER'] = '/usr/local/share/stanford'
os.environ['STANFORD_MODELS'] = '/usr/local/share/stanford'

di pengaturan lokal saya, saya mengatur ketiga variabel.

Saya menambahkan ketiganya ke zsh saya dan saya masih mengalami masalah yang sama.

Juga, ketika saya menjalankan tes tox, saya melihat kesalahan yang sama persis.

Tidak tahu seberapa banyak bantuan ini, tetapi saya menambahkan baris untuk mencetak daftar file jar yang dibandingkan.

['/usr/local/share/stanford/stanford-corenlp-3.8.0.jar', '/usr/local/share/stanford/stanford-corenlp-3.8.0.jar']
Traceback (most recent call last):
  File "<input>", line 1, in <module>
    s = nltk.parse.corenlp.CoreNLPServer()
  File "/Users/adiep/feedback-sentiment/.env/src/nltk/nltk/parse/corenlp.py", line 70, in __init__
    key=lambda model_name: re.match(self._JAR, model_name)
TypeError: '>' not supported between instances of 'NoneType' and 'NoneType'

re.match gagal mencocokkan _JAR dengan file jar yang ditemukan.
```>>> impor nltk

impor ulang
s = nltk.parse.corenlp.CoreNLPServer()
['/usr/local/share/stanford/stanford-corenlp-3.8.0.jar', '/usr/local/share/stanford/stanford-corenlp-3.8.0.jar']
Traceback (panggilan terakhir terakhir):
Berkas " ", baris 1, di
s = nltk.parse.corenlp.CoreNLPServer()
File "/Users/adiep/feedback-sentiment/.env/src/nltk/nltk/parse/corenlp.py", baris 70, di __init__
key=lambda model_name: re.match(self._JAR, model_name)
TypeError: '>' tidak didukung antara instance 'NoneType' dan 'NoneType'
jar = '/usr/local/share/stanford/stanford-corenlp-3.8.0.jar'
r_jar = nltk.parse.corenlp.CoreNLPServer._JAR
re.match(r_jar, jar)

```

Sepertinya yang terjadi adalah re.match sedang memberi makan path lengkap, ia mencari file jar di awal string, dan selalu gagal. Saya pikir itu seharusnya memberi makan hanya nama-nama file jar.

Baiklah perbaikannya cukup sederhana.

Saya mengubah re.match(...) menjadi re.search(...).group() jadi alih-alih hanya melihat awal string, itu terlihat di mana-mana.

Berlari ke masalah lain.

Saya pikir ini terkait dengan masalah yang saya miliki sebelumnya dengan CoreNLPparse menggunakan server proxy.

>>> s = nltk.parse.corenlp.CoreNLPServer()
>>> s.url
'http://localhost:9000'
>>> s.start()
Traceback (most recent call last):
  File "<input>", line 1, in <module>
    s.start()
  File "/Users/adiep/feedback-sentiment/.env/src/nltk/nltk/parse/corenlp.py", line 149, in start
    'Could not connect to the server.'
nltk.parse.corenlp.CoreNLPServerError: Could not connect to the server.

Ok, jadi itu masalah proxy. Saya menemukan bahwa Anda dapat mengatur NO_PROXY='localhost' .

Sekarang saya memiliki masalah dengan server yang menolak terhubung.

Saya tidak yakin mengapa, tetapi ketika saya memulai objek server, itu memulai server di port 9000.
Sunting: Ternyata saya memiliki server corenlp yang mengambang di latar belakang. Saya baru saja membunuhnya dan sekarang melakukan ping ke port 9000.
```>>> impor nltk

s = nltk.parse.corenlp.CoreNLPServer(verbose=True)
[Ditemukan stanford-corenlp-(\d+).(\d+).(\d+).jar: /usr/local/share/stanford/stanford-corenlp-3.8.0.jar]
[Ditemukan stanford-corenlp-(\d+).(\d+).(\d+).jar: /usr/local/share/stanford/stanford-corenlp-3.8.0.jar]
[Ditemukan stanford-corenlp-(\d+).(\d+).(\d+)-models.jar: /usr/local/share/stanford/stanford-corenlp-3.8.0-models.jar]
s.mulai()
[Ditemukan Java: /usr/bin/java]
[Ditemukan Java: /usr/bin/java]
HTTPConnectionPool(host='localhost', port=59023): Percobaan ulang maksimum terlampaui dengan url: /live (Disebabkan oleh NewConnectionError(': Gagal membuat koneksi baru: [Errno 61] Koneksi ditolak',))
HTTPConnectionPool(host='localhost', port=59023): Percobaan ulang maksimum terlampaui dengan url: /live (Disebabkan oleh NewConnectionError(': Gagal membuat koneksi baru: [Errno 61] Koneksi ditolak',))
HTTPConnectionPool(host='localhost', port=59023): Percobaan ulang maksimum terlampaui dengan url: /live (Disebabkan oleh NewConnectionError(': Gagal membuat koneksi baru: [Errno 61] Koneksi ditolak',))
HTTPConnectionPool(host='localhost', port=59023): Percobaan ulang maksimum terlampaui dengan url: /live (Disebabkan oleh NewConnectionError(': Gagal membuat koneksi baru: [Errno 61] Koneksi ditolak',))
HTTPConnectionPool(host='localhost', port=59023): Percobaan ulang maksimum terlampaui dengan url: /live (Disebabkan oleh NewConnectionError(': Gagal membuat koneksi baru: [Errno 61] Koneksi ditolak',))
HTTPConnectionPool(host='localhost', port=59023): Percobaan ulang maksimum terlampaui dengan url: /live (Disebabkan oleh NewConnectionError(': Gagal membuat koneksi baru: [Errno 61] Koneksi ditolak',))
HTTPConnectionPool(host='localhost', port=59023): Percobaan ulang maksimum terlampaui dengan url: /live (Disebabkan oleh NewConnectionError(': Gagal membuat koneksi baru: [Errno 61] Koneksi ditolak',))
HTTPConnectionPool(host='localhost', port=59023): Percobaan ulang maksimum terlampaui dengan url: /live (Disebabkan oleh NewConnectionError(': Gagal membuat koneksi baru: [Errno 61] Koneksi ditolak',))
HTTPConnectionPool(host='localhost', port=59023): Percobaan ulang maksimum terlampaui dengan url: /live (Disebabkan oleh NewConnectionError(': Gagal membuat koneksi baru: [Errno 61] Koneksi ditolak',))
HTTPConnectionPool(host='localhost', port=59023): Percobaan ulang maksimum terlampaui dengan url: /live (Disebabkan oleh NewConnectionError(': Gagal membuat koneksi baru: [Errno 61] Koneksi ditolak',))
HTTPConnectionPool(host='localhost', port=59023): Percobaan ulang maksimum terlampaui dengan url: /live (Disebabkan oleh NewConnectionError(': Gagal membuat koneksi baru: [Errno 61] Koneksi ditolak',))
HTTPConnectionPool(host='localhost', port=59023): Percobaan ulang maksimum terlampaui dengan url: /live (Disebabkan oleh NewConnectionError(': Gagal membuat koneksi baru: [Errno 61] Koneksi ditolak',))
HTTPConnectionPool(host='localhost', port=59023): Percobaan ulang maksimum terlampaui dengan url: /live (Disebabkan oleh NewConnectionError(': Gagal membuat koneksi baru: [Errno 61] Koneksi ditolak',))
HTTPConnectionPool(host='localhost', port=59023): Percobaan ulang maksimum terlampaui dengan url: /live (Disebabkan oleh NewConnectionError(': Gagal membuat koneksi baru: [Errno 61] Koneksi ditolak',))
HTTPConnectionPool(host='localhost', port=59023): Percobaan ulang maksimum terlampaui dengan url: /live (Disebabkan oleh NewConnectionError(': Gagal membuat koneksi baru: [Errno 61] Koneksi ditolak',))
HTTPConnectionPool(host='localhost', port=59023): Percobaan ulang maksimum terlampaui dengan url: /live (Disebabkan oleh NewConnectionError(': Gagal membuat koneksi baru: [Errno 61] Koneksi ditolak',))
HTTPConnectionPool(host='localhost', port=59023): Percobaan ulang maksimum terlampaui dengan url: /live (Disebabkan oleh NewConnectionError(': Gagal membuat koneksi baru: [Errno 61] Koneksi ditolak',))
HTTPConnectionPool(host='localhost', port=59023): Percobaan ulang maksimum terlampaui dengan url: /live (Disebabkan oleh NewConnectionError(': Gagal membuat koneksi baru: [Errno 61] Koneksi ditolak',))
HTTPConnectionPool(host='localhost', port=59023): Percobaan ulang maksimum terlampaui dengan url: /live (Disebabkan oleh NewConnectionError(': Gagal membuat koneksi baru: [Errno 61] Koneksi ditolak',))
HTTPConnectionPool(host='localhost', port=59023): Percobaan ulang maksimum terlampaui dengan url: /live (Disebabkan oleh NewConnectionError(': Gagal membuat koneksi baru: [Errno 61] Koneksi ditolak',))
HTTPConnectionPool(host='localhost', port=59023): Percobaan ulang maksimum terlampaui dengan url: /live (Disebabkan oleh NewConnectionError(': Gagal membuat koneksi baru: [Errno 61] Koneksi ditolak',))
HTTPConnectionPool(host='localhost', port=59023): Percobaan ulang maksimum terlampaui dengan url: /live (Disebabkan oleh NewConnectionError(': Gagal membuat koneksi baru: [Errno 61] Koneksi ditolak',))
HTTPConnectionPool(host='localhost', port=59023): Percobaan ulang maksimum terlampaui dengan url: /live (Disebabkan oleh NewConnectionError(': Gagal membuat koneksi baru: [Errno 61] Koneksi ditolak',))
HTTPConnectionPool(host='localhost', port=59023): Percobaan ulang maksimum terlampaui dengan url: /live (Disebabkan oleh NewConnectionError(': Gagal membuat koneksi baru: [Errno 61] Koneksi ditolak',))
HTTPConnectionPool(host='localhost', port=59023): Percobaan ulang maksimum terlampaui dengan url: /live (Disebabkan oleh NewConnectionError(': Gagal membuat koneksi baru: [Errno 61] Koneksi ditolak',))
HTTPConnectionPool(host='localhost', port=59023): Percobaan ulang maksimum terlampaui dengan url: /live (Disebabkan oleh NewConnectionError(': Gagal membuat koneksi baru: [Errno 61] Koneksi ditolak',))
HTTPConnectionPool(host='localhost', port=59023): Percobaan ulang maksimum terlampaui dengan url: /live (Disebabkan oleh NewConnectionError(': Gagal membuat koneksi baru: [Errno 61] Koneksi ditolak',))
HTTPConnectionPool(host='localhost', port=59023): Percobaan ulang maksimum terlampaui dengan url: /live (Disebabkan oleh NewConnectionError(': Gagal membuat koneksi baru: [Errno 61] Koneksi ditolak',))
HTTPConnectionPool(host='localhost', port=59023): Percobaan ulang maksimum terlampaui dengan url: /live (Disebabkan oleh NewConnectionError(': Gagal membuat koneksi baru: [Errno 61] Koneksi ditolak',))
HTTPConnectionPool(host='localhost', port=59023): Percobaan ulang maksimum terlampaui dengan url: /live (Disebabkan oleh NewConnectionError(': Gagal membuat koneksi baru: [Errno 61] Koneksi ditolak',))
Traceback (panggilan terakhir terakhir):
Berkas " ", baris 1, di
s.mulai()
File "/Users/adiep/feedback-sentiment/.env/src/nltk/nltk/parse/corenlp.py", baris 150, di awal
'Tidak dapat terhubung ke server.'
nltk.parse.corenlp.CoreNLPServerError: Tidak dapat terhubung ke server.
```

Tuan yang baik, sekarang berhasil.

Jadi secara keseluruhan, saya harus mengubah re.match menjadi re.search.group dan mematikan server corenlp yang mengambang di latar belakang.

Mungkin harus ada beberapa kode untuk mendeteksi jika ada server corenlp lain yang berjalan? Tidak tahu apakah itu layak dilakukan.

Sepertinya jika Anda tidak menggunakan dengan klausa, membuat objek server, dan tidak menghentikannya, python menghapus objek tetapi bukan server yang sebenarnya. Apa yang saya lakukan adalah bahwa saya memulai server di juru bahasa saya dan lupa menjalankan s.stop() .

Kami perlu mendokumentasikan cara kerja Stanford CoreNLP API sehingga kami memberi tahu orang-orang untuk tidak memulai server di dalam Python.

Atau, saya pikir jika kita menggunakan trik __all__ , mungkin kita dapat mengizinkan akses terbatas ke apa yang ada di dalam nltk.parse.corenlp dan mencegah pengguna mengakses CoreNLPServer . Objek level terendah yang harus digunakan pengguna adalah GenericCoreNLPParser .

BTW, @dimazest apakah CoreNLPServer hanya digunakan untuk lingkungan pengujian?

Ya, itu hanya digunakan dalam tes.

Halo - Saya pikir saya mengalami masalah terkait dengan yang disebutkan di sini.

Saya baru-baru ini mulai menggunakan paket ini dan saya menggunakan StanfordNERTagger, yang mengembalikan kesalahan penghentian.

/usr/local/lib/python2.7/dist-packages/nltk/tag/stanford.py:183: DeprecationWarning: 
The StanfordTokenizer will be deprecated in version 3.2.5.
Please use nltk.tag.corenlp.CoreNLPPOSTagger or nltk.tag.corenlp.CoreNLPNERTagger instead.

Perhatikan bahwa saya pikir ada kesalahan ketik dalam peringatan ini. Saya harus mengimpor dari nltk.tag.stanford untuk menemukan CoreNLPNERTagger .

Jadi saya sudah mencoba untuk beralih ke fungsi baru dan sepertinya saya tidak bisa membuatnya berfungsi.
Sebelumnya saya punya:

    stanfordClassifier = '/root/stanford-ner-2017-06-09/classifiers/english.muc.7class.distsim.crf.ser.gz'
    stanfordNerPath = '/root/stanford-ner-2017-06-09/stanford-ner.jar'
    st = StanfordNERTagger(stanfordClassifier, stanfordNerPath, encoding='utf8')
    tokens = nltk.tokenize.word_tokenize(text) 
    ner_tags = st.tag(tokens)

Yang sekarang telah saya ubah menjadi

    stanfordClassifier = '/root/stanford-ner-2017-06-09/classifiers/english.muc.7class.distsim.crf.ser.gz'
    stanfordNerPath = '/root/stanford-ner-2017-06-09/stanford-ner.jar'
    with CoreNLPServer(stanfordNerPath, stanfordClassifier) as server:
        st = CoreNLPNERTagger(url=server.url)
        tokens = nltk.tokenize.word_tokenize(text) 
        ner_tags = st.tag(tokens)

Namun, kode ini mengembalikan kesalahan ini: CoreNLPServerError: Could not connect to the server.

Saya tidak dapat menemukan dokumentasi di mana pun tentang bagaimana saya seharusnya memanggil CoreNLPNERTagger dan bagaimana panggilan itu berbeda dari StanfordNERTagger sudah usang.

Bantuan apa pun sangat dihargai. Terima kasih!

Hai, maaf tidak ada dokumentasi. API telah berubah, inilah yang perlu Anda lakukan. Lihat #1510, ini berisi diskusi panjang tentang cara memulai server.

Perubahan utama: NLTK tidak memulai server CoreNLP, Anda harus memulainya. Lihat https://stanfordnlp.github.io/CoreNLP/corenlp-server.html untuk penjelasan terperinci, tetapi perintahnya harus seperti:

# Run the server using all jars in the current directory (e.g., the CoreNLP home directory)
java -mx4g -cp "*" edu.stanford.nlp.pipeline.StanfordCoreNLPServer -port 9000 -timeout 15000

Buka http://localhost :9000/ untuk memastikan server berjalan.

Sekarang Anda siap menggunakan klien corenlp NLTK:

tagger = CoreNLPNERTagger(url='http://localhost:9000')
tokens = tagger.tag(text)

Tolong beri tahu saya jika berhasil.

Ya! Ini bekerja. Terima kasih banyak atas bantuannya.

Terima kasih @dimazest , @alvations

Untuk beberapa alasan, saya tidak dapat terhubung ke server. Adakah yang bisa membantu saya? Berikut kode yang saya jalankan.

dari nltk.parse.corenlp impor CoreNLPServer
server = CoreNLPServer("stanford-corenlp-4.0.0.jar",,"stanford-corenlp-4.0.0-models.jar",verbose=True)
server.mulai()

dari nltk.parse.corenlpnltk.pa impor CoreNLPparser
parser = CoreNLPparser()
parse = next(parser.raw_parse("Saya meletakkan buku di kotak di atas meja."))

server.stop()

Saya menjalankannya dalam file di dalam folder yang saya unduh untuk CoreNLP sehingga saya tidak perlu khawatir tentang jalur abs atau apa pun.
Inilah yang dihasilkannya:

[Ditemukan Java: /usr/bin/java]
[Ditemukan Java: /usr/bin/java]
Traceback (panggilan terakhir terakhir):
File "/Users/benstevens/Desktop/Bernstein2/Ben/stanford-corenlp-4.0.0/BenTest.py", baris 4, di
server.mulai()
File "/Users/benstevens/Library/Python/3.8/lib/python/site-packages/nltk/parse/corenlp.py", baris 153, di awal
menaikkan CoreNLPServerError("Tidak dapat terhubung ke server.")
nltk.parse.corenlp.CoreNLPServerError: Tidak dapat terhubung ke server.

Saya akan sangat menghargai bantuan apa pun.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat