我正在尝试从gensim包运行doc2vec库。我的问题是,当我训练并保存模型时,模型文件很大(2.5 GB),我尝试使用此行:
model.estimate_memory()
Run Code Online (Sandbox Code Playgroud)
但这并没有改变任何东西。我也尝试过更改max_vocab_size以减少空间。但是没有运气。有人可以帮我解决这个问题吗?
我是doc2vec的新手.我最初试图理解doc2vec,下面提到的是我使用Gensim的代码.正如我所希望的,我得到了两个文件的训练模型和文档向量.
但是,我想知道在几个时代重新训练模型的好处以及如何在Gensim中进行训练?我们可以使用iter或alpha参数来做,还是我们必须单独训练它for loop?请让我知道如何更改以下代码以训练20个epoches的模型.
此外,我有兴趣知道word2vec模型还需要多次训练迭代.
# Import libraries
from gensim.models import doc2vec
from collections import namedtuple
# Load data
doc1 = ["This is a sentence", "This is another sentence"]
# Transform data
docs = []
analyzedDocument = namedtuple('AnalyzedDocument', 'words tags')
for i, text in enumerate(doc1):
words = text.lower().split()
tags = [i]
docs.append(analyzedDocument(words, tags))
# Train model
model = doc2vec.Doc2Vec(docs, size = 100, window = 300, min_count = 1, workers = 4)
# Get the vectors …Run Code Online (Sandbox Code Playgroud) 我目前的doc2vec代码如下.
# Train doc2vec model
model = doc2vec.Doc2Vec(docs, size = 100, window = 300, min_count = 1, workers = 4, iter = 20)
Run Code Online (Sandbox Code Playgroud)
我也有一个word2vec代码如下.
# Train word2vec model
model = word2vec.Word2Vec(sentences, size=300, sample = 1e-3, sg=1, iter = 20)
Run Code Online (Sandbox Code Playgroud)
我很感兴趣,同时使用DM和DBOW在doc2vec两者跳过克和CBOW在word2vec.
在Gensim中,我找到了下面提到的句子: "通过word2vec的"skip-gram和CBOW模型",使用分层softmax或负抽样,生成具有深度学习的单词向量"
因此,我很困惑使用分层softmax或负抽样.请告诉我这两种方法有什么不同.
另外,我有兴趣知道在dm,DBOW,Skip-gram和CBOW方面需要改变哪些参数才能使用分层softmax和/或负采样?
我的应用程序是一个推荐系统:)
我有一个包含 6000 个观察值的数据集;其示例如下:
job_id job_title job_sector
30018141 Secondary Teaching Assistant Education
30006499 Legal Sales Assistant / Executive Sales
28661197 Private Client Practitioner Legal
28585608 Senior hydropower mechanical project manager Engineering
28583146 Warehouse Stock Checker - Temp / Immediate Start Transport & Logistics
28542478 Security Architect Contract IT & Telecoms
Run Code Online (Sandbox Code Playgroud)
目标是根据职位预测每一行的职位部门。
首先,我对该job_title列应用了一些预处理:
def preprocess(document):
lemmatizer = WordNetLemmatizer()
stemmer_1 = PorterStemmer()
stemmer_2 = LancasterStemmer()
stemmer_3 = SnowballStemmer(language='english')
# Remove all the special characters
document = re.sub(r'\W', ' ', document)
# …Run Code Online (Sandbox Code Playgroud) 我训练了一个gensim.models.doc2vec.Doc2Vec模型
d2v_model = Doc2Vec(句子,大小= 100,window = 8,min_count = 5,workers = 4)我可以通过docvec = d2v_model.docvecs [0]获得文档向量
如何从训练有素的模型中获取单词向量?
我正在使用预先训练的 doc2vec BOW 模型(美联社新闻)。我正在做以下事情:
import gensim.models as g
start_alpha=0.01
infer_epoch=1000
model="\\apnews_dbow\\doc2vec.bin"
m = g.Doc2Vec.load(model)
text='this is a sample text'
vec=m.infer_vector(text,alpha=start_alpha, steps=infer_epoch)
Run Code Online (Sandbox Code Playgroud)
但是,如果我再次计算相同文本的 vec,那么我会得到相同文本的不同向量表示。为什么会发生这种情况以及我该如何避免这种情况。如果我给出完全相同的文本,我希望返回相同的向量。我尝试关注这篇文章,但似乎没有帮助。
我有一个现有的 gensim Doc2Vec 模型,我正在尝试对训练集和模型进行迭代更新。
我接受新文件,并照常执行预处理:
stoplist = nltk.corpus.stopwords.words('english')
train_corpus= []
for i, document in enumerate(corpus_update['body'].values.tolist()):
train_corpus.append(gensim.models.doc2vec.TaggedDocument([word for word in gensim.utils.simple_preprocess(document) if word not in stoplist], [i]))
Run Code Online (Sandbox Code Playgroud)
然后我加载原始模型,更新词汇表,并重新训练:
#### Original model
## model = gensim.models.doc2vec.Doc2Vec(dm=0, size=300, hs=1, min_count=10, dbow_words= 1, negative=5, workers=cores)
model = Doc2Vec.load('pvdbow_model_6_06_12_17.doc2vec')
model.build_vocab(train_corpus, update=True)
model.train(train_corpus, total_examples=model.corpus_count, epochs=model.iter)
Run Code Online (Sandbox Code Playgroud)
然后我通过附加新数据来更新训练集 Pandas 数据框,并重置索引。
corpus = corpus.append(corpus_update)
corpus = corpus.reset_index(drop=True)
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试将 infer_vector() 与更新的模型一起使用时:
inferred_vector = model1.infer_vector(tokens)
sims = model.docvecs.most_similar([inferred_vector], topn=len(model.docvecs))
Run Code Online (Sandbox Code Playgroud)
结果质量很差,表明模型和训练集数据框的索引不再匹配。
当我将它与未更新的训练集数据框(再次使用更新的模型)进行比较时,结果很好 - 但是,显然我错过了新文档。
无论如何都要更新两者,因为我希望能够在不完全重新训练模型的情况下对模型进行频繁更新?
目前,我正在尝试将 dask 与 gensim 配合使用来进行 NLP 文档计算,并且在将我的语料库转换为“ TaggedDocument ”时遇到问题。
因为我尝试了很多不同的方法来解决这个问题,所以我将列出我的尝试。
每次处理这个问题的尝试都会遇到略有不同的困境。
df.info()
<class 'dask.dataframe.core.DataFrame'>
Columns: 5 entries, claim_no to litigation
dtypes: object(2), int64(3)
Run Code Online (Sandbox Code Playgroud)
claim_no claim_txt I CL ICC lit
0 8697278-17 battery comprising interior battery active ele... 106 2 0
Run Code Online (Sandbox Code Playgroud)
>>tagged_document[0]
>>TaggedDocument(words=['battery', 'comprising', 'interior', 'battery', 'active', 'elements', 'battery', 'cell', 'casing', 'said', 'cell', 'casing', 'comprising', 'first', 'casing', 'element', 'first', 'contact', 'surface', 'second', 'casing', 'element', 'second', 'contact', 'surface', 'wherein', 'assembled', 'position', 'first', 'second', 'contact', 'surfaces', 'contact', 'first', 'second', …Run Code Online (Sandbox Code Playgroud) 我正在使用 Doc2vec 构建词汇表,但出现错误“AttributeError:模块‘gensim.utils’没有属性‘smart_open’”。我该如何解决这个问题?
这是针对 Databricks 平台上的笔记本,在 Python 3 中运行。过去,我尝试在本地 Jupyter Notebook 上运行代码,但出现了相同的错误。
我还搜索了https://radimrehurek.com/gensim/models/doc2vec.html但找不到与 smart_open 相关的任何内容。
model = Doc2Vec(window=5, min_count=1, size=50, sample=1e-5, negative=5, workers=1)
model.build_vocab(sentences.to_array())
Run Code Online (Sandbox Code Playgroud)
我分别运行了以上几行。第一行工作正常。第二个说: AttributeError: module 'gensim.utils' has no attribute 'smart_open'
我想知道如何在生产中部署 doc2vec 模型来创建词向量作为分类器的输入特征。具体来说,doc2vec 模型在语料库上进行如下训练。
dataset['tagged_descriptions'] = datasetf.apply(lambda x: doc2vec.TaggedDocument(
words=x['text_columns'], tags=[str(x.ID)]), axis=1)
model = doc2vec.Doc2Vec(vector_size=100, min_count=1, epochs=150, workers=cores,
window=5, hs=0, negative=5, sample=1e-5, dm_concat=1)
corpus = dataset['tagged_descriptions'].tolist()
model.build_vocab(corpus)
model.train(corpus, total_examples=model.corpus_count, epochs=model.epochs)
Run Code Online (Sandbox Code Playgroud)
然后将其转储到 pickle 文件中。词向量用于训练分类器(例如随机森林)来预测电影情绪。
现在假设在生产中,有一个文档包含一些全新的词汇。话虽如此,他们并不在 doc2vec 模型训练期间在场的人中。我想知道如何处理这样的情况。
作为旁注,我知道更新 gensim Doc2Vec 模型和Gensim 的训练文档:如何使用以前的 word2vec 模型重新训练 doc2vec 模型。然而,我希望能对此事有更多的了解。