2014-11-25 105 views
1

我請求您的善意幫助和幫助,以解決「Java命令失敗」的錯誤,當我嘗試標記大小爲2 MB的阿拉伯語語料庫時,該錯誤會持續發生。我已經搜索了網站和stanford POS tagger郵件列表。但是,我沒有找到解決方案。我閱讀了一些關於類似問題的帖子,並建議使用內存。我不確定這一點。我仍然擁有19GB的可用內存。我嘗試了所有可能的解決方案,但同樣的錯誤不斷顯示。Java命令在NLTK Stanford POS Tagger中失敗

我有Python的平均命令和Linux上的良好命令。我爲阿拉伯語使用LinuxMint17 KDE 64位,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)) 

如果語句大小小於1MB(= 100,000個單詞),則不會有錯誤。但是當我嘗試要標記2MB語料庫,那麼下面的錯誤信息顯示:

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萬個字我的博士使用研究項目。如果我一次標記10萬字,我將不得不重複3000次。它會殺了我!

我真的很感謝你的幫助。

+0

順便說一句,你過於貪婪地爲300多萬句子做標記和POS標記。我會分批完成它。嘗試每次通話100萬次,然後只運行300次。 – alvas 2014-11-25 01:09:01

+0

@alvas感謝您的評論。事實上,我會做你的建議。但是我忘了在問題中清楚地說明。 – Mohammed 2014-11-25 01:17:04

回答

4

您導入行後添加此行:

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

這將增加最大內存大小Java允許斯坦福POS標註器使用。 '-xmx2G'將最大容許RAM更改爲2GB,而不是默認的512MB。

瞭解更多信息


如果你有興趣在如何調試你的代碼,閱讀見What are the Xms and Xmx parameters when starting JVMs?

所以我們看到,所以看的第一件事是如何在Java中NLTK調用斯坦福惡搞之前初始化命令失敗處理大量的數據時,從https://github.com/nltk/nltk/blob/develop/nltk/tag/stanford.py#L19

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#L65,我們看到沒有值被添加到Java的內存分配。

+0

@elvas非常感謝你的回覆。我做了你的建議。不幸的是,同樣的問題依然存在。等待大約一分鐘後,再次拋出相同的錯誤。 – Mohammed 2014-11-25 01:36:48

+1

你在機器上有多少內存?你嘗試過更大的內存大小,看看有多少標記可以標記?不要貪婪,同時做標記和標記。 – alvas 2014-11-25 01:38:55

+0

@elvas,我有4GB的RAM。當我標記100,000個單詞時,它工作正常。當我嘗試標記200,000個單詞時,它會拋出錯誤。我不貪婪同時進行標記和標記。我不知道如何分開做。你能告訴我怎麼做。 – Mohammed 2014-11-25 01:48:06