2017-10-31 31 views
1

私の目標は、word2vecを使用してキーワードのセットで最も関連性の高い単語を見つけることです。たとえば、単語が[girl, kite, beach]の場合、word2vecから関連語を出力したいとします。[flying, swimming, swimsuit...]word2vecを使用して最も近い関連単語を見つける

私はword2vecがサラウンド単語の文脈に基づいて単語をベクトル化することを理解しています。だから私は何をしたか、次の関数を使用した:

most_similar_cosmul([girl, kite, beach])

しかし、キーワードのセットに非常に関連していない単語を与えているようだ:

['charade', 0.30288437008857727] 
['kinetic', 0.3002534508705139] 
['shells', 0.29911646246910095] 
['kites', 0.2987399995326996] 
['7-9', 0.2962781488895416] 
['showering', 0.2953910827636719] 
['caribbean', 0.294752299785614] 
['hide-and-go-seek', 0.2939240336418152] 
['turbine', 0.2933803200721741] 
['teenybopper', 0.29288050532341003] 
['rock-paper-scissors', 0.2928623557090759] 
['noisemaker', 0.2927709221839905] 
['scuba-diving', 0.29180505871772766] 
['yachting', 0.2907838821411133] 
['cherub', 0.2905363440513611] 
['swimmingpool', 0.290039986371994] 
['coastline', 0.28998953104019165] 
['Dinosaur', 0.2893030643463135] 
['flip-flops', 0.28784963488578796] 
['guardsman', 0.28728148341178894] 
['frisbee', 0.28687697649002075] 
['baltic', 0.28405341506004333] 
['deprive', 0.28401875495910645] 
['surfs', 0.2839275300502777] 
['outwear', 0.28376665711402893] 
['diverstiy', 0.28341981768608093] 
['mid-air', 0.2829524278640747] 
['kickboard', 0.28234976530075073] 
['tanning', 0.281939834356308] 
['admiration', 0.28123530745506287] 
['Mediterranean', 0.281186580657959] 
['cycles', 0.2807052433490753] 
['teepee', 0.28070521354675293] 
['progeny', 0.2775532305240631] 
['starfish', 0.2775339186191559] 
['romp', 0.27724218368530273] 
['pebbles', 0.2771730124950409] 
['waterpark', 0.27666303515434265] 
['tarzan', 0.276429146528244] 
['lighthouse', 0.2756190896034241] 
['captain', 0.2755546569824219] 
['popsicle', 0.2753356397151947] 
['Pohoda', 0.2751699686050415] 
['angelic', 0.27499720454216003] 
['african-american', 0.27493417263031006] 
['dam', 0.2747344970703125] 
['aura', 0.2740659713745117] 
['Caribbean', 0.2739778757095337] 
['necking', 0.27346789836883545] 
['sleight', 0.2733519673347473] 

これは私が使用したコードです

:これはword2vecのために使用されるトレーニングデータのサンプルである

def train(data_filepath, epochs=300, num_features=300, min_word_count=2, context_size=7, downsampling=1e-3, seed=1, 
    ckpt_filename=None): 
    """ 
    Train word2vec model 
    data_filepath path of the data file in csv format 
    :param epochs: number of times to train 
    :param num_features: increase to improve generality, more computationally expensive to train 
    :param min_word_count: minimum frequency of word. Word with lower frequency will not be included in training data 
    :param context_size: context window length 
    :param downsampling: reduce frequency for frequent keywords 
    :param seed: make results reproducible for random generator. Same seed means, after training model produces same results. 

    :returns path of the checkpoint after training 
    """ 

    if ckpt_filename == None: 
    data_base_filename = os.path.basename(data_filepath) 
    data_filename = os.path.splitext(data_base_filename)[0] 
    ckpt_filename = data_filename + ".wv.ckpt" 

    num_workers = multiprocessing.cpu_count() 
    logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO) 
    nltk.download("punkt") 
    nltk.download("stopwords") 
    print("Training %s ..." % data_filepath) 
    sentences = _get_sentences(data_filepath) 

    word2vec = w2v.Word2Vec(
    sg=1, 
    seed=seed, 
    workers=num_workers, 
    size=num_features, 
    min_count=min_word_count, 
    window=context_size, 
    sample=downsampling 
) 

    word2vec.build_vocab(sentences) 
    print("Word2vec vocab length: %d" % len(word2vec.wv.vocab)) 
    word2vec.train(sentences, total_examples=len(sentences), epochs=epochs) 
    return _save_ckpt(word2vec, ckpt_filename) 

def _save_ckpt(model, ckpt_filename): 
    if not os.path.exists("checkpoints"): 
    os.makedirs("checkpoints") 
    ckpt_filepath = os.path.join("checkpoints", ckpt_filename) 
    model.save(ckpt_filepath) 
    return ckpt_filepath 

def _get_sentences(data_filename): 
    print("Found Data:") 
    sentences = [] 
    print("Reading '{0}'...".format(data_filename)) 
    with codecs.open(data_filename, "r") as data_file: 
    reader = csv.DictReader(data_file) 
    for row in reader: 
     sentences.append(ast.literal_eval((row["highscores"]))) 
    print("There are {0} sentences".format(len(sentences))) 
    return sentences 

if __name__ == "__main__": 
    import argparse 
    parser = argparse.ArgumentParser(description='Train Word2vec model') 
    parser.add_argument('data_filepath', 
         help='path to training CSV file.') 
    args = parser.parse_args() 
    data_filepath = args.data_filepath 
    train(data_filepath) 

word2vec訓練します

22751473,"[""lover"", ""sweetheart"", ""couple"", ""dietary"", ""meal""]" 
28738542,"[""mallotus"", ""villosus"", ""shishamo"", ""smelt"", ""dried"", ""fish"", ""spirinchus"", ""lanceolatus""]" 
25163686,"[""Snow"", ""Removal"", ""snow"", ""clearing"", ""female"", ""females"", ""woman"", ""women"", ""blower"", ""snowy"", ""road"", ""operate""]" 
32837025,"[""milk"", ""breakfast"", ""drink"", ""cereal"", ""eating""]" 
23828321,"[""jogging"", ""female"", ""females"", ""lady"", ""woman"", ""women"", ""running"", ""person""]" 
22874156,"[""lover"", ""sweetheart"", ""heterosexual"", ""couple"", ""man"", ""and"", ""woman"", ""consulting"", ""hear"", ""listening""] 

は、予測のために、私は単にキーワードのセットについては、以下の機能を使用する:私はword2vecと関連するキーワードを見つけることが可能であるかどうかを疑問に思った

most_similar_cosmul 

。そうでなければ、どの機械学習モデルがこれに適しているでしょうか。任意の洞察が

+0

word2vecとその他の関連情報を実装するためにどのようなテクニックを使用しているかをご指定ください。 – Tanu

+0

word2vecのトレーニングとトレーニングのコードを追加しました –

答えて

1

most_similar()/most_similar_cosmul()に、['girl', 'kite', 'beach']ように、複数の正ワードの例を供給する、それらの単語のためのベクターをする平均-一緒に最初に非常に有用であろう、次いで平均に最も類似した単語のリストが返されます。それらは、単一の単語の単純なチェックよりも、単語のいずれかに明らかに関連していない可能性があります。したがって:

most_similar()(またはmost_similar_cosmul())を1つの単語に入力すると、どのような結果が得られますか?彼らはあなたが気にかけているように、言葉に関連したような言葉ですか?

もしそうでなければ、マルチワード類似性を試す前に修正する必要がある設定で深刻な問題があります。

Word2Vecは(1)多くのトレーニングデータから通常の結果を得ます。 (2)自然言語文。十分なデータがあれば、epochsのトレーニングパス(したがってデフォルト)は5です。時代遅れの繰り返しを使用することでデータを補うことはできますが、より小さなベクトルsizeを使用することで若干補うことができます。

データ量は不明です。また、あなたの例の行は自然な自然言語の文ではありません。他のいくつかの前処理/並べ替えが適用されているようです。それは援助よりも傷ついているかもしれません。

ワードベクトルは、多くの場合、より低頻度語捨てることで改善する(デフォルト5上記min_count増加し、むしろ2にそれを減らすよりも)低頻度語が良いのベクトルを取得するのに十分な例を持っていません - たとえ多くの反復を繰り返しても、単語の使用法の具体例である傾向があります。ではなく、さまざまな例から得られる一般化可能な広範な表現です。これらの弱い言葉がトレーニングデータに残っていることを維持することによって、他の頻繁な単語のトレーニングが妨げられます。(あなたが最も類似したランクに属しているとは思わないという言葉を得たとき、それはその少数の出現状況を考慮すると、それらの座標への道が、

複数単語の平均からではなく1単語のチェックで良い結果が得られた場合は、より多くのデータや調整されたトレーニングパラメータを使用して結果が改善される可能性があります。あなたが良い結果を考えることをより厳密に定義する必要があることを達成するために。 (あなたの既存のリストはそれほど悪くはありません:それは太陽/砂浜/ビーチ活動に関連する多くの言葉を含んでいます。)一方、Word2Vecへのあなたの期待は高すぎるかもしれません。 ['girl', 'kite', 'beach']の平均は、個々の単語自体と比較して、それらの所望の単語に必然的に閉ざされているか、または多くのデータセット/パラメータの調整によってのみ達成可能である。

+0

詳細な回答ありがとうございました。上記の質問のいくつかに答えるには 1.上記の言葉でmost_similarまたはmost_similar_cosmulを呼び出すと、確かに個々の入力単語に関連する単語がいくつか表示されますが、多くの単語は「接続」または「表示関係」になりませんキーワードのセット。私は、 "カイト"、 "女の子"、 "飛行"が同じ行に多い場合、 "飛ぶ"という言葉の確率は、 "女の子"、 "カイト"の場合に増加すると仮定しました。 2.トレーニングデータの場合は、約410,000行あります。 3.確かに、最も類似した言葉の私の結果は、グループよりも個人にとって良いです。 –

+1

ああ、そうです。 1行あたり5〜10ワードの41万行はまだ2〜4百万ワードであり、これはword2vecにとっては一種のものです。そして、あなたの行は自然な自然言語の文章のようには見えません。それは、通常の単語2ベータ配列をさらに損なう可能性があります。問題の原因となる低頻度の単語や、単語の平均が必ずしもあなたが望むものを見つけるとは限らないという問題は残っています。しかし、私は(1)より多くのデータを考えます。 (2)メタパラメータのより多くの調整。 (3)他の形の「近さ」(たぶん平均に近づくのではなく、最も近い単語など)は、それぞれあなたの目標に近づけるかもしれません。がんばろう! – gojomo

+0

ありがとうございました。ちょうど最後の質問です。 word2vecでは文章形式が本当に重要ですか?私はword2vecがニューラルネットワークとウィンドウで動作することを覚えているからです。それがRNNならば、単語の順序(文のように)が重要になります。文の代わりにタグのリストを与えれば、それは意図したとおりに動作してはいけませんか? –

関連する問題