2016-03-01 9 views
7

मुझे gensim का उपयोग करके ट्वीट्स पर word2vec प्रतिनिधित्व को प्रशिक्षित करने की आवश्यकता है। अधिकांश ट्यूटोरियल और कोड के विपरीत मैंने जीन्सिम पर देखा है कि मेरा डेटा कच्चा नहीं है, लेकिन पहले से ही प्रीप्रोसेस्ड किया गया है। मेरे पास एक टेक्स्ट दस्तावेज़ में एक शब्दकोश है जिसमें 65k शब्द हैं (एक "अज्ञात" टोकन और एक ईओएल टोकन) और ट्वीट्स को इस शब्दकोश में इंडेक्स के साथ एक numpy मैट्रिक्स के रूप में सहेजा जाता है। डेटा स्वरूप का एक सरल उदाहरण नीचे देखा जा सकता है:पूर्वनिर्धारित शब्दकोश और शब्द-सूचकांक डेटा पर Gensim word2vec

dict.txt

you 
love 
this 
code 

ट्वीट्स (5 अज्ञात है और 6 EOL)

[[0, 1, 2, 3, 6], 
[3, 5, 5, 1, 6], 
[0, 1, 3, 6, 6]] 

मैं अनिश्चित कैसे मुझे इंडेक्स प्रतिनिधित्व को संभालना चाहिए। एक आसान तरीका सिर्फ इंडेक्स की सूची को तारों की सूची में परिवर्तित करना है (यानी [0, 1, 2, 3, 6] -> ['0', '1', '2', '3', '6 ']) जैसा कि मैंने इसे word2vec मॉडल में पढ़ा है। हालांकि, यह gensim के रूप में अक्षम होना चाहिए तो उदाहरण के लिए इस्तेमाल आंतरिक सूचकांक देखने की कोशिश करेगा '2'।

मैं इस डेटा को कैसे लोड करूं और gensim का उपयोग करके कुशल तरीके से word2vec प्रतिनिधित्व कैसे बना सकता हूं?

उत्तर

7

gensim में एक Word2Vec मॉडल प्रारंभ करने में सामान्य तरीके से [1]

model = Word2Vec(sentences, size=100, window=5, min_count=5, workers=4) 

सवाल यह है कि, sentences क्या है? sentences शब्दों/टोकन के पुनरावृत्तियों के एक पुनरावर्तक माना जाता है। यह आपके पास numpy मैट्रिक्स की तरह है, लेकिन प्रत्येक पंक्ति अलग-अलग लंबाई का हो सकता है।

यदि आप gensim.models.word2vec.LineSentence के लिए प्रलेखन को देखते हैं, तो यह आपको वाक्यों के रूप में एक टेक्स्ट फ़ाइलों को लोड करने का एक तरीका देता है। एक संकेत के रूप में, दस्तावेज के अनुसार, यह

एक वाक्य = एक पंक्ति लेता है; पहले से ही preprocessed शब्द और सफेद जगह से अलग शब्द।

जब यह कहते हैं words already preprocessed, यह कम आवरण स्टेमिंग, stopword छानने और अन्य सभी पाठ सफाई प्रक्रियाओं के लिए बात कर रहा है। आपके मामले में आप वाक्यों की अपनी सूची में 5 और 6 नहीं चाहते हैं, इसलिए आपको उन्हें फ़िल्टर करने की आवश्यकता है।

यह देखते हुए कि आपके पास पहले से ही numpy मैट्रिक्स है, मानते हैं कि प्रत्येक पंक्ति एक वाक्य है, फिर इसे 2 डी सरणी में डालना बेहतर है और सभी 5 और 6 फ़िल्टर करें। परिणामी 2 डी सरणी को मॉडल को आरंभ करने के लिए सीधे sentences तर्क के रूप में उपयोग किया जा सकता है। एकमात्र पकड़ यह है कि जब आप प्रशिक्षण के बाद मॉडल से पूछना चाहते हैं, तो आपको टोकन के बजाय सूचकांक इनपुट करने की आवश्यकता है।

अब आपके पास एक सवाल यह है कि मॉडल सीधे पूर्णांक लेता है। Python संस्करण में यह प्रकार के लिए जांच नहीं करता है, और बस अद्वितीय टोकन को पास करता है। उस मामले में आपके अद्वितीय सूचकांक ठीक काम करेंगे। लेकिन ज्यादातर समय आप अपने मॉडल को प्रशिक्षित करने के लिए सी-एक्सटेंडेड रूटीन का उपयोग करना चाहते हैं, जो एक बड़ा सौदा है क्योंकि यह 70x प्रदर्शन दे सकता है। [2] मुझे लगता है कि उस मामले में सी कोड स्ट्रिंग प्रकार की जांच कर सकता है, जिसका अर्थ है कि एक स्ट्रिंग-टू-इंडेक्स मैपिंग संग्रहीत है।

क्या यह अक्षम है?मुझे नहीं लगता, क्योंकि आपके पास मौजूद तार संख्याएं हैं, जो वास्तविक टोकन से आम तौर पर बहुत कम हैं (मानते हैं कि वे 0 से कॉम्पैक्ट इंडेक्स हैं)। इसलिए मॉडल आकार में छोटे होंगे, जो अंत में मॉडल के क्रमिकरण और deserialization में कुछ प्रयास बचाएगा। आपने अनिवार्य रूप से इनपुट टोकन को एक छोटे स्ट्रिंग प्रारूप में एन्कोड किया है और इसे word2vec प्रशिक्षण से अलग किया है, और word2vec मॉडल प्रशिक्षण और प्रशिक्षण से पहले इस एन्कोडिंग को नहीं पता था।

मेरा दर्शन try the simplest way first है। मैं सिर्फ मॉडल के पूर्णांक के नमूना परीक्षण इनपुट फेंक दूंगा और देखें कि क्या गलत हो सकता है। आशा करता हूँ की ये काम करेगा।

[1] https://radimrehurek.com/gensim/models/word2vec.html

[2] http://rare-technologies.com/word2vec-in-python-part-two-optimizing/

+0

मैं पुष्टि कर सकता हूं कि मैं बस मॉडल में पूर्णांक इनपुट नहीं कर सकता। जैसा कि मूल पोस्ट (शायद स्पष्ट रूप से पर्याप्त नहीं है) में बताया गया है, यह स्ट्रिंग्स को पूर्णांक को मैप करके बस काम करता है। – pir

+0

जिज्ञासा से, आप 2 डी numpy सरणी से '5' और' 6' कैसे फ़िल्टर करेंगे? प्रत्येक पंक्ति में हमेशा एक ही आकार होना चाहिए। यह शब्द 2vec को प्रदान करने के लिए मैट्रिक्स पर पुनरावृत्ति करते समय किया जा सकता है, लेकिन यह बहुत अक्षम लगता है। – pir

1

मैं एक ही मुद्दा था।

>>> model = Word2Vec(arr_str) 
ValueError: The truth value of an array with more than one element is ambiguous. 
Use a.any() or a.all() 

मेरे समाधान पाठ के रूप में पूर्णांकों की सरणी लिखने के लिए और उसके बाद LineSentence साथ word2vec का उपयोग किया गया था: यहां तक ​​कि के माध्यम से

>>> arr_str = np.char.mod('%d', arr) 

तार के सरणी में कनवर्ट करने के लिए एक अपवाद जब Word2Vec चल कारण होता है।

import numpy as np 
from gensim.models import Word2Vec 
from gensim.models.word2vec import LineSentence 

np.savetxt('train_data.txt', arr, delimiter=" ", fmt="%s") 
sentences = LineSentence('train_data.txt') 
model = Word2Vec(sentences) 
संबंधित मुद्दे