Сбои 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
может сработать, но я этого не пробовал.