首页 > 解决方案 > 这种使用skip-gram的文本训练是否正确?

问题描述

我仍然是神经网络和 NLP 的初学者。在这段代码中,我正在使用 skip-gram 训练干净的文本(一些推文)。但我不知道我是否做得对。谁能告诉我这个skip-gram文本训练的正确性?任何帮助表示赞赏。

这是我的代码:

from nltk import word_tokenize

from gensim.models.phrases import Phrases, Phraser

sent = [row.split() for row in X['clean_text']]

phrases = Phrases(sent, max_vocab_size = 50, progress_per=10000)

bigram = Phraser(phrases)

sentences = bigram[sent]

from gensim.models import Word2Vec

w2v_model = Word2Vec(window=5,
                     size = 300,
                     sg=1)

w2v_model.build_vocab(sentences)


w2v_model.train(sentences, total_examples=w2v_model.corpus_count, epochs=25)


del sentences #to reduce memory usage


def get_mat(model, corpus, size):

    vecs = np.zeros((len(corpus), size))

    n = 0

    for i in corpus.index:
        vecs[i] = np.zeros(size).reshape((1, size))
        for word in str(corpus.iloc[i,0]).split():
            try:
                vecs[i] += model[word]
                #n += 1
            except KeyError:
                continue

    return vecs

X_sg = get_vectors(w2v_model, X, 300)

del X

X_sg=pd.DataFrame(X_sg)
X_sg.head()
from sklearn import preprocessing
scale = preprocessing.normalize
X_sg=scale(X_sg)

for i in range(len(X_sg)):
    X_sg[i]+=1 #I did this because some weights where negative! So could not 
               #apply LSTM on them later

标签: python-3.xword2vec

解决方案


您没有提及是否收到任何错误或不满意的结果,因此很难知道您可能需要什么样的帮助。

您涉及Word2Vec模型的特定代码行大致正确:看似有用的参数(如果您有足够大的数据集来训练 300 维向量),以及正确的步骤。所以真正的证据是你的结果是否可以接受。

关于您事先尝试使用Phrasesbigram-creation :

  • 在添加这种额外的预处理复杂性之前,您应该让事情通常正常工作并取得有希望的结果。

  • 该参数max_vocab_size=50被严重误导,可能使短语步骤毫无意义。这max_vocab_size是对班级统计多少单词/二元组的硬性上限,作为限制其内存使用的一种方式。(只要已知单词/二元组的数量达到此上限,就会修剪许多低频单词/二元组——实际上,每次修剪的所有单词/二元组中的大部分,都会放弃很多准确性以换取内存使用上限。)max_vocab_size默认值gensim是 40,000,000 - 但word2phrase.cgensim 方法所基于的 Google 源代码中的默认值是 500,000,000 。通过使用 just 50,它并不会真正学到任何有用的东西,只要 50 个单词/bigrams 在许多修剪中幸存下来。

关于您的get_mat()功能和以后的DataFrame代码,我不知道您想用它做什么,所以不能提供任何意见。


推荐阅读