Сбои Java-команд в NLTK Stanford POS Tagger

Я прошу вашей любезной помощи и помощи в устранении ошибки "Java Command Fails", которая выдается каждый раз, когда я пытаюсь пометить арабский корпус размером 2 мегабайта. Я искал в Интернете и в списке рассылки Stanford POS tagger. Однако я не нашел решения. Я прочитал некоторые сообщения о проблемах, подобных этому, и было предложено, чтобы память использовалась. Я не уверен в этом. Тем не менее у меня есть 19 ГБ свободной памяти. Я перепробовал все возможные варианты решения, но та же ошибка продолжает появляться.

У меня средняя команда на Python и хорошая команда на Linux. Я использую LinuxMint17 KDE 64-bit, Python3.4, NLTK alpha и Stanford POS tagger для арабского языка. Это мой код:

import nltk
from nltk.tag.stanford import POSTagger
arabic_postagger = POSTagger("/home/mohammed/postagger/models/arabic.tagger", "/home/mohammed/postagger/stanford-postagger.jar", encoding='utf-8')

print("Executing tag_corpus.py...\n")


# Import corpus file
print("Importing data...\n")

file = open("test.txt", 'r', encoding='utf-8').read()
text = file.strip()

print("Tagging the corpus. Please wait...\n")

tagged_corpus = arabic_postagger.tag(nltk.word_tokenize(text))

ЕСЛИ РАЗМЕР КОРПУСА МЕНЬШЕ 1 МБ ( = 100 000 слов), ОШИБКА НЕ БУДЕТ. Но когда я пытаюсь пометить 2MB CORPUS, то показано следующее сообщение об ошибке:

Traceback (most recent call last):
File "/home/mohammed/experiments/current/tag_corpus2.py", line 17, in <module>
tagged_lst = arabic_postagger.tag(nltk.word_tokenize(text))
File "/usr/local/lib/python3.4/dist-packages/nltk-3.0a3-py3.4.egg/nltk/tag/stanford.py", line 59, in tag
return self.batch_tag([tokens])[0]
File "/usr/local/lib/python3.4/dist-packages/nltk-3.0a3-py3.4.egg/nltk/tag/stanford.py", line 81, in batch_tag
stdout=PIPE, stderr=PIPE)
File "/usr/local/lib/python3.4/dist-packages/nltk-3.0a3-py3.4.egg/nltk/internals.py", line 171, in java
raise OSError('Java command failed!')
OSError: Java command failed!

Я намерен отметить 300 миллионов слов, которые будут использованы в моей диссертации. исследовательский проект. Если я буду помечать 100 тысяч слов одновременно, мне придется повторить задание 3000 раз. Это убьет меня!

Я действительно ценю вашу помощь.

1 ответ

После ваших строк импорта добавьте эту строку:

nltk.internals.config_java(options='-xmx2G')

Это увеличит максимальный объем ОЗУ, который позволяет использовать Java Stanford POS Tagger. '-xmx2G' изменяет максимально допустимый объем ОЗУ на 2 ГБ вместо стандартных 512 МБ.

См. Какие параметры Xms и Xmx при запуске JVM? для дополнительной информации


Если вы заинтересованы в том, как отлаживать ваш код, читайте дальше.

Итак, мы видим, что команда не справляется с обработкой огромного количества данных, поэтому первое, на что нужно обратить внимание, это то, как инициализируется Java в NLTK перед вызовом тега Stanford, с https://github.com/nltk/nltk/blob/develop/nltk/tag/stanford.py:

from nltk.internals import find_file, find_jar, config_java, java, _java_options

Мы видим, что nltk.internals Пакет обрабатывает различные конфигурации и параметры Java.

Затем мы взглянем на https://github.com/nltk/nltk/blob/develop/nltk/internals.py и увидим, что для выделения памяти для Java не добавляется значение no.

В версии 3.9.2 StanfordTagger конструктор класса принимает параметр с именем java_options который может быть использован для установки памяти для POSTagger, а также для NERTagger.

Например pos_tagger = StanfordPOSTagger('models/english-bidirectional-distsim.tagger', path_to_jar='stanford-postagger-3.9.2.jar', java_options='-mx3g')

Я нашел ответ @alvas, чтобы не работать, потому что StanfordTagger переопределял мои настройки памяти с помощью встроенного по умолчанию 1000m, Возможно, используя nltk.internals.config_java после инициализации StanfordPOSTagger может сработать, но я этого не пробовал.

Другие вопросы по тегам