2015-05-12 4 views
13

पायथन में, मैं समानांतर ग्रंथों के बीच शब्द संरेखण बनाने के लिए NLTK's alignment module का उपयोग कर रहा हूं। Bitexts संरेखित एक समय लेने वाली प्रक्रिया हो सकती है, खासकर जब काफी निगमों पर किया जाता है। एक दिन बैच में संरेखण करना अच्छा होगा और बाद में उन संरेखणों का उपयोग करना अच्छा होगा।बाद में उपयोग के लिए पाइथन एनएलटीके संरेखण मॉडल कैसे बचाएं?

from nltk import IBMModel1 as ibm 
biverses = [list of AlignedSent objects] 
model = ibm(biverses, 20) 

with open(path + "eng-taq_model.txt", 'w') as f: 
    f.write(model.train(biverses, 20)) // makes empty file 

एक बार मैं एक मॉडल बनाने, मैं कैसे (1) यह डिस्क और (2) इसे बाद में पुन: उपयोग करने को बचा सकता है?

उत्तर

7

तत्काल जवाब यह अचार के लिए, https://wiki.python.org/moin/UsingPickle

देखना है लेकिन क्योंकि IBMModel1 एक लैम्ब्डा फ़ंक्शन, यह डिफ़ॉल्ट रूप से यह अचार को pickle/cPickle

हम (https://github.com/nltk/nltk/blob/develop/nltk/align/ibm1.py#L74 और https://github.com/nltk/nltk/blob/develop/nltk/align/ibm1.py#L104 देखें) तो संभव नहीं है dill का उपयोग करेंगे। सबसे पहले, dill इंस्टॉल करें देखें Can Python pickle lambda functions?

$ pip install dill 
$ python 
>>> import dill as pickle 
फिर

:

>>> import dill 
>>> import dill as pickle 
>>> from nltk.corpus import comtrans 
>>> from nltk.align import IBMModel1 
>>> bitexts = comtrans.aligned_sents()[:100] 
>>> ibm = IBMModel1(bitexts, 20) 
>>> with open('model1.pk', 'wb') as fout: 
...  pickle.dump(ibm, fout) 
... 
>>> exit() 

मसालेदार मॉडल का उपयोग करने के लिए:

>>> import dill as pickle 
>>> from nltk.corpus import comtrans 
>>> bitexts = comtrans.aligned_sents()[:100] 
>>> with open('model1.pk', 'rb') as fin: 
...  ibm = pickle.load(fin) 
... 
>>> aligned_sent = ibm.align(bitexts[0]) 
>>> aligned_sent.words 
['Wiederaufnahme', 'der', 'Sitzungsperiode'] 

आप IBMModel1 वस्तु है, जो एक है अचार की कोशिश करते हैं लैम्ब्डा फ़ंक्शन, आप इसके साथ समाप्त हो जाएंगे:

>>> import cPickle as pickle 
>>> from nltk.corpus import comtrans 
>>> from nltk.align import IBMModel1 
>>> bitexts = comtrans.aligned_sents()[:100] 
>>> ibm = IBMModel1(bitexts, 20) 
>>> with open('model1.pk', 'wb') as fout: 
...  pickle.dump(ibm, fout) 
... 
Traceback (most recent call last): 
    File "<stdin>", line 2, in <module> 
    File "/usr/lib/python2.7/copy_reg.py", line 70, in _reduce_ex 
    raise TypeError, "can't pickle %s objects" % base.__name__ 
TypeError: can't pickle function objects 

(नोट: उपरोक्त कोड स्निपेट 3.0.0 NLTK संस्करण से आता है):

python3 में NLTK 3.0.0 के साथ, आप भी एक ही समस्या है क्योंकि IBMModel1 एक लैम्ब्डा फ़ंक्शन का सामना करना पड़ेगा

[email protected]:~$ python3 
Python 3.4.0 (default, Apr 11 2014, 13:05:11) 
[GCC 4.8.2] on linux 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import pickle 
>>> from nltk.corpus import comtrans 
>>> from nltk.align import IBMModel1 
>>> bitexts = comtrans.aligned_sents()[:100] 
>>> ibm = IBMModel1(bitexts, 20) 
>>> with open('mode1.pk', 'wb') as fout: 
...  pickle.dump(ibm, fout) 
... 
Traceback (most recent call last): 
    File "<stdin>", line 2, in <module> 
_pickle.PicklingError: Can't pickle <function IBMModel1.train.<locals>.<lambda> at 0x7fa37cf9d620>: attribute lookup <lambda> on nltk.align.ibm1 failed' 

>>> import dill 
>>> with open('model1.pk', 'wb') as fout: 
...  dill.dump(ibm, fout) 
... 
>>> exit() 

[email protected]:~$ python3 
Python 3.4.0 (default, Apr 11 2014, 13:05:11) 
[GCC 4.8.2] on linux 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import dill 
>>> from nltk.corpus import comtrans 
>>> with open('model1.pk', 'rb') as fin: 
...  ibm = dill.load(fin) 
... 
>>> bitexts = comtrans.aligned_sents()[:100] 
>>> aligned_sent = ibm.aligned(bitexts[0]) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'IBMModel1' object has no attribute 'aligned' 
>>> aligned_sent = ibm.align(bitexts[0]) 
>>> aligned_sent.words 
['Wiederaufnahme', 'der', 'Sitzungsperiode'] 

(नोट: python3 में, picklecPickle है, http://docs.pythonsprints.com/python3_porting/py-porting.html देखें)

+0

मैं मुझे यकीन नहीं है कि आपने क्या प्रयास किया है, लेकिन मैंने कोई भेड़िया नहीं देखा और वेनिला अचार के साथ "मॉडल" को चुनने में कोई समस्या नहीं थी। – alexis

+0

@alexis यह दिलचस्प है, क्या आपको अद्यतन उत्तर के समान त्रुटि मिली? – alvas

+0

अभी तक इसे आजमाने का मौका नहीं मिला है; लेकिन मैंने पाइथन 2 के साथ पिकलिंग का परीक्षण किया होगा, जो विभिन्न अनुभवों को समझाएगा (मुझे अभी तक एहसास नहीं हुआ कि मॉड्यूल इतना बदल गया है)। जब मैं कोशिश करता हूं तो मैं आपको बता दूंगा। – alexis

3

आप एलाइनर मॉडल बचत पर चर्चा है, लेकिन अपने प्रश्न के बारे में अधिक हो रहा है आपके द्वारा गठबंधन किए गए गठित bitexts को सहेजना: "एक दिन बैच में संरेखण करना अच्छा होगा और बाद में उन संरेखणों का उपयोग करना अच्छा होगा।" मैं इस सवाल का जवाब देने जा रहा हूं।

एनएलटीके पर्यावरण में, कॉर्पस-जैसे संसाधन का उपयोग करने का सबसे अच्छा तरीका यह है कि इसे कॉर्पस रीडर के साथ एक्सेस किया जाए। NLTK कोष के साथ लेखकों नहीं आता है, लेकिन प्रारूप NLTK के AlignedCorpusReader द्वारा समर्थित उत्पन्न करने के लिए बहुत आसान है: (NLTK 3 संस्करण)

model = ibm(biverses, 20) # As in your question 

out = open("folder/newalignedtext.txt", "w") 
for pair in biverses: 
    asent = model.align(pair) 
    out.write(" ".join(asent.words)+"\n") 
    out.write(" ".join(asent.mots)+"\n") 
    out.write(str(asent.alignment)+"\n") 

out.close() 

यह है कि। आप बाद में फिर से लोड है और वास्तव में अपने गठबंधन वाक्य का उपयोग के रूप में आप comtrans कोष का उपयोग करेंगे कर सकते हैं:

from nltk.corpus.reader import AlignedCorpusReader 

mycorpus = AlignedCorpusReader(r"folder", r".*\.txt") 
biverses_reloaded = mycorpus.aligned_sents() 

आप देख सकते हैं, तो आप एलाइनर वस्तु ही जरूरत नहीं है। संरेखित वाक्यों को कॉर्पस रीडर, के साथ लोड किया जा सकता है और जब तक आप एम्बेडेड संभावनाओं का अध्ययन नहीं करना चाहते हैं तो संरेखक स्वयं बेकार है।

टिप्पणी: मुझे यकीन नहीं है कि मैं संरेखक ऑब्जेक्ट को "मॉडल" कहूंगा। एनएलटीके 2 में, नए पाठ को संरेखित करने के लिए संरेखक स्थापित नहीं किया गया है - इसमें align() विधि भी नहीं है। एनएलटीके 3 में फंक्शन align() नया टेक्स्ट संरेखित कर सकता है लेकिन केवल अगर पायथन 2 से उपयोग किया जाता है; पाइथन 3 में यह अलग-अलग प्रकार की वस्तुओं की तुलना करने के लिए कड़े नियमों की वजह से टूट गया है। यदि फिर भी आप संरेखण को अचार और पुनः लोड करने में सक्षम होना चाहते हैं, तो मुझे इसे अपने उत्तर में जोड़ने में खुशी होगी; मैंने जो देखा है उससे वैनिला cPickle के साथ किया जा सकता है।

+0

संरेखक फ़ंक्शन एक मॉडल है क्योंकि यह स्रोत भाषा शब्द दिए गए प्रत्येक लक्षित भाषा शब्द की संभावना सीखता है। यद्यपि इसे एक बड़ी हैश तालिका के रूप में स्टोर करना संभव है, यह कोड का लेखक है जिसने इसे लैम्ब्डा फ़ंक्शन के रूप में स्टोर करने का निर्णय लिया है जो डिफ़ॉल्ट डिफॉल्ट देता है। https://github.com/nltk/nltk/blob/develop/nltk/align/ibm1.py#L74 – alvas

+0

इसलिए सीखे की संभावना को देखते हुए, संभावित डेटा को नए डेटा में असाइन करना संभव है, यही कारण है कि इसे मॉडल कहा जाता है। हालांकि, मैं आपसे सहमत हूं कि मॉडल को सहेजना स्वाभाविक नहीं है क्योंकि नया डेटा दिया गया है, आप बस संभावना मॉडल का पुनर्निर्माण कर सकते हैं। सैद्धांतिक स्पष्टीकरण के लिए http://www.cs.columbia.edu/~mcollins/courses/nlp2011/notes/ibm12.pdf देखें। – alvas

+0

बीटीडब्ल्यू, 'nltk.align' पायथन 3 में नहीं टूटा हुआ है। – alvas

1

आप चाहते हैं, और जैसे कि यह, आप एक AlignedSent सूची के रूप में यह स्टोर कर सकते हैं यह लग रहा है, तो:

from nltk.align import IBMModel1 as IBM 
from nltk.align import AlignedSent 
import dill as pickle 

biverses = [list of AlignedSent objects] 
model = ibm(biverses, 20) 

for sent in range(len(biverses)): 
    biverses[sent].alignment = model.align(biverses[sent]).alignment 

उसके बाद, आप अचार के रूप में डिल के साथ इसे बचा सकते हैं:

with open('alignedtext.pk', 'wb') as arquive: 
    pickle.dump(biverses, arquive) 
संबंधित मुद्दे