11

मैं Word2Vec के लिए स्पार्क साइट के example देख रहा था:स्पार्क Word2vec वेक्टर गणित

val input = sc.textFile("text8").map(line => line.split(" ").toSeq) 

val word2vec = new Word2Vec() 

val model = word2vec.fit(input) 

val synonyms = model.findSynonyms("country name here", 40) 

मैं कैसे इस तरह के रूप राजा दिलचस्प वेक्टर करते हैं - आदमी + औरत = रानी। मैं model.getVectors उपयोग कर सकते हैं, लेकिन यकीन है कि आगे बढ़ने के लिए कैसे नहीं।

+0

क्या आप अभी भी उत्तर स्वीकार कर सकते हैं, अभी भी? धन्यवाद ... – desertnaut

उत्तर

-2

यहाँ छद्म कोड है। https://spark.apache.org/docs/1.4.0/api/java/org/apache/spark/mllib/feature/Word2VecModel.html

  1. w2v_map = model.getVectors() # this gives u a map {word:vec}
  2. my_vector = w2v_map.get('king') - w2v_map.get('man') + w2v_map.get('queen') # do vector algebra here
  3. most_similar_word_to_vector = model.findSynonyms(my_vector, 10) # they have an api to get synonyms for word, and one for vector

संपादित करें: https://spark.apache.org/docs/1.4.0/api/java/org/apache/spark/mllib/feature/Word2VecModel.html#findSynonyms(org.apache.spark.mllib.linalg.Vector,%20int)

+2

वेक्टर मैच कैसे करें यह स्पष्ट नहीं है। ब्रीज़ या स्पार्क वेक्टर? यह प्रश्न का एक प्रमुख घटक है .... – user3803714

+2

सार्वजनिक स्कैला .uple2 <स्ट्रिंग, ऑब्जेक्ट> findSynonyms (वेक्टर वेक्टर, int num) आप सूचीबद्ध इस विधि के साथ वेक्टर मैच करते हैं: https: // स्पार्क। apache.org/docs/1.4.0/api/java/org/apache/spark/mllib/feature/Word2VecModel.html#findSynonyms(org.apache.spark.mllib.linalg.Vector,%20int) – jxieeducation

13

यहाँ pyspark में एक उदाहरण है, जो मुझे लगता है कि है सीधा है पूर्ण कार्यान्वयन के लिए, दस्तावेज़ पढ़ें स्काला के बंदरगाह के लिए - कुंजीका प्रयोग होता है +७५७१५९३२१०।

सबसे पहले, हम उदाहरण के रूप में मॉडल ट्रेन:

from pyspark import SparkContext 
from pyspark.mllib.feature import Word2Vec 

sc = SparkContext() 
inp = sc.textFile("text8_lines").map(lambda row: row.split(" ")) 

k = 220   # vector dimensionality 
word2vec = Word2Vec().setVectorSize(k) 
model = word2vec.fit(inp) 

k शब्द वैक्टर की आयामी स्वरूप है - (100 डिफ़ॉल्ट मान है) उच्च बेहतर है, लेकिन आप स्मृति की आवश्यकता होगी, और सबसे बड़ी संख्या मैं अपने मशीन के साथ जा सकते हैं था 220 (संपादित करें: प्रासंगिक प्रकाशनों में विशिष्ट मूल्यों 300 और 1000 के बीच कर रहे हैं)

के बाद हम मॉडल को प्रशिक्षित किया है, हम इस प्रकार एक साधारण समारोह को परिभाषित कर सकते हैं:

def getAnalogy(s, model): 
    qry = model.transform(s[0]) - model.transform(s[1]) - model.transform(s[2]) 
    res = model.findSynonyms((-1)*qry,5) # return 5 "synonyms" 
    res = [x[0] for x in res] 
    for k in range(0,3): 
     if s[k] in res: 
      res.remove(s[k]) 
    return res[0] 

अब, यहाँ देशों के साथ कुछ उदाहरण और उनकी राजधानियों हैं:

s = ('france', 'paris', 'portugal') 
getAnalogy(s, model) 
# u'lisbon' 

s = ('china', 'beijing', 'russia') 
getAnalogy(s, model) 
# u'moscow' 

s = ('spain', 'madrid', 'greece') 
getAnalogy(s, model) 
# u'athens' 

s = ('germany', 'berlin', 'portugal') 
getAnalogy(s, model) 
# u'lisbon' 

s = ('japan', 'tokyo', 'sweden') 
getAnalogy(s, model)  
# u'stockholm' 

s = ('finland', 'helsinki', 'iran') 
getAnalogy(s, model) 
# u'tehran' 

s = ('egypt', 'cairo', 'finland') 
getAnalogy(s, model) 
# u'helsinki' 

परिणाम हमेशा सही नहीं हैं - मैं प्रयोग करने के लिए आप के लिए छोड़ देंगे, लेकिन वे और अधिक प्रशिक्षण के साथ बेहतर हो डेटा और वृद्धि की वेक्टर आयामी स्वरूप k

समारोह में for पाश प्रविष्टियों को इनपुट क्वेरी खुद के हैं निकाल देता है, के रूप में मैंने देखा है कि अक्सर सही जवाब पहले आमतौर पर इनपुट शर्तों में से एक होने के साथ लौटे सूची में दूसरा एक था,।

+2

क्या आप कृपया निर्दिष्ट कर सकते हैं आप यहां -1 से गुणा क्यों कर रहे हैं: res = model.findSynonyms ((- 1) * qry, 5) # वापसी 5 "समानार्थी" भी, क्या आप अपने getAnalogy फ़ंक्शन में लूप के बारे में कुछ टिप्पणियां लिख सकते हैं। – user3803714

+2

उसी डेटासेट के साथ उदाहरण अपेक्षित काम नहीं करता था। res = getAnalogy (s, model) प्रिंट "परिणाम है:" + res o/p है: परिणाम है: montpellier – user3803714

+3

1) '' -1' 'केवल' 'qry' 'आदेश सहज रखने के लिए है; आप इस आदेश को बदल सकते हैं और इसे हटा सकते हैं 2) पहले से ही '' '' लूप के बारे में टिप्पणियां प्रदान कर चुके हैं; इसे हटाने का प्रयास करें और सभी '' res'' (केवल '' res [0] '' के बजाय यह देखने के लिए कि यह आवश्यक क्यों है 3) पहले से ही कहा गया है कि परिणाम हमेशा सही नहीं होते हैं, लेकिन वे '' k'' (कागजात कम से कम '' = 300'' का उपयोग करते हैं); इसके अलावा, सटीक परिणाम यादृच्छिक बीज पर निर्भर करते हैं। ** सभी ** में, उत्तर शब्द 2vec गणित के बारे में बिल्कुल है, जो सवाल था। – desertnaut

1

वैल w2v_map = sameModel.getVectors // इस ua नक्शा देता है {शब्द: vec}

val (king, man, woman) = (w2v_map.get("king").get, w2v_map.get("man").get, w2v_map.get("women").get) 

    val n = king.length 

    //daxpy(n: Int, da: Double, dx: Array[Double], incx: Int, dy: Array[Double], incy: Int); 
    blas.saxpy(n,-1,man,1,king,1) 

    blas.saxpy(n,1,woman,1,king,1) 

    val vec = new DenseVector(king.map(_.toDouble)) 

    val most_similar_word_to_vector = sameModel.findSynonyms(vec, 10) //they have an api to get synonyms for word, and one for vector 
    for((synonym, cosineSimilarity) <- most_similar_word_to_vector) { 
    println(s"$synonym $cosineSimilarity") 
    } 

और झटका के रूप में चल परिणाम:

महिलाओं .628454885964967 फिलिप .5539534290356802 हेनरी .5520055707837214 vii 0.5455116413024774 एलिज़ाबेथ 0.5290 994886254643 रानी 0.5162519562606844 पुरुष 0.5133851770249461 .5127030522678778 आठ .5104392579985102 ज्येष्ठ 0 wenceslaus।510425791249559