python-3.x - 这种使用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
解决方案
您没有提及是否收到任何错误或不满意的结果,因此很难知道您可能需要什么样的帮助。
您涉及Word2Vec
模型的特定代码行大致正确:看似有用的参数(如果您有足够大的数据集来训练 300 维向量),以及正确的步骤。所以真正的证据是你的结果是否可以接受。
关于您事先尝试使用Phrases
bigram-creation :
在添加这种额外的预处理复杂性之前,您应该让事情通常正常工作并取得有希望的结果。
该参数
max_vocab_size=50
被严重误导,可能使短语步骤毫无意义。这max_vocab_size
是对班级统计多少单词/二元组的硬性上限,作为限制其内存使用的一种方式。(只要已知单词/二元组的数量达到此上限,就会修剪许多低频单词/二元组——实际上,每次修剪的所有单词/二元组中的大部分,都会放弃很多准确性以换取内存使用上限。)max_vocab_size
默认值gensim
是 40,000,000 - 但word2phrase.c
gensim 方法所基于的 Google 源代码中的默认值是 500,000,000 。通过使用 just50
,它并不会真正学到任何有用的东西,只要 50 个单词/bigrams 在许多修剪中幸存下来。
关于您的get_mat()
功能和以后的DataFrame
代码,我不知道您想用它做什么,所以不能提供任何意见。
推荐阅读
- python - 将 hachoir 库的衍生物安装到 Google Colab 中
- mysql - 在 MySQL 中获取“错误 1452(23000):无法添加或更新子行”
- javascript - 为什么 Google Maps .getCenter() 返回无效坐标?
- javascript - GSAP + AdHelper 模板导致“未定义 lib”
- php - 在 Heroku 上安装 PECL 库
- deep-learning - 使用参数共享计算卷积神经网络中的权重数量
- restframeworkmongoengine - 与同一个django rest框架项目相关的多个mongoDB
- haskell - 试图在 Haskell 中的列表前面添加一个元组但收到错误?
- linux - 是否有 Linux 系统调用通过其主要/次要数字打开 deivce 文件?
- dns - 如何正确地将子域(w.example.com)指向(ns1.w.example.com)