我正在尝试使用 joblib 从 s3 加载我保存的模型
import pandas as pd
import numpy as np
import json
import subprocess
import sqlalchemy
from sklearn.externals import joblib
ENV = 'dev'
model_d2v = load_d2v('model_d2v_version_002', ENV)
def load_d2v(fname, env):
model_name = fname
if env == 'dev':
try:
model=joblib.load(model_name)
except:
s3_base_path='s3://sd-flikku/datalake/doc2vec_model'
path = s3_base_path+'/'+model_name
command = "aws s3 cp {} {}".format(path,model_name).split()
print('loading...'+model_name)
subprocess.call(command)
model=joblib.load(model_name)
else:
s3_base_path='s3://sd-flikku/datalake/doc2vec_model'
path = s3_base_path+'/'+model_name
command = "aws s3 cp {} {}".format(path,model_name).split()
print('loading...'+model_name)
subprocess.call(command)
model=joblib.load(model_name)
return model
Run Code Online (Sandbox Code Playgroud)
但我正面临这个错误:
from sklearn.externals import joblib
ImportError: …Run Code Online (Sandbox Code Playgroud) 我正在尝试比较我的Doc2Vec(通过tf)和gensims实现的实现.从视觉上看,gensim的表现更好.
我运行以下代码来训练gensim模型和下面的那个用于tensorflow模型.我的问题如下:
window=5gensim中的参数是否意味着我在两边使用两个词来预测中间的一个?或者两边都是5.事情是有相当多的文件小于长度10.model = Doc2Vec(dm=1, dm_concat=1, size=100, window=5, negative=10, hs=0, min_count=2, workers=cores)
model.build_vocab(corpus)
epochs = 100
for i in range(epochs):
model.train(corpus)
Run Code Online (Sandbox Code Playgroud)
batch_size = 512
embedding_size = 100 # Dimension of the embedding vector.
num_sampled = 10 # Number of negative examples to sample.
graph = tf.Graph()
with graph.as_default(), tf.device('/cpu:0'):
# Input data.
train_word_dataset = tf.placeholder(tf.int32, shape=[batch_size])
train_doc_dataset = tf.placeholder(tf.int32, shape=[batch_size/context_window])
train_labels = tf.placeholder(tf.int32, shape=[batch_size/context_window, 1])
# The variables
word_embeddings = tf.Variable(tf.random_uniform([vocabulary_size,embedding_size],-1.0,1.0)) …Run Code Online (Sandbox Code Playgroud) 我正在尝试构建一个文档检索模型,该模型返回按查询或搜索字符串的相关性排序的大多数文档.为此,我使用gensim中的模型训练了一个doc2vec模型Doc2Vec.我的数据集采用pandas数据集的形式,每个文档都将每个文档存储为字符串.这是我到目前为止的代码
import gensim, re
import pandas as pd
# TOKENIZER
def tokenizer(input_string):
return re.findall(r"[\w']+", input_string)
# IMPORT DATA
data = pd.read_csv('mp_1002_prepd.txt')
data.columns = ['merged']
data.loc[:, 'tokens'] = data.merged.apply(tokenizer)
sentences= []
for item_no, line in enumerate(data['tokens'].values.tolist()):
sentences.append(LabeledSentence(line,[item_no]))
# MODEL PARAMETERS
dm = 1 # 1 for distributed memory(default); 0 for dbow
cores = multiprocessing.cpu_count()
size = 300
context_window = 50
seed = 42
min_count = 1
alpha = 0.5
max_iter = 200
# BUILD MODEL
model = gensim.models.doc2vec.Doc2Vec(documents = …Run Code Online (Sandbox Code Playgroud) 我正在使用Gensim Doc2Vec模型,尝试集中部分客户支持对话.我的目标是为支持团队提供自动回复建议.
图1:显示了在下一个对话行中回答用户问题的示例对话,从而可以轻松提取数据:
在谈话期间,"你好"和"我们的办公室位于纽约市"应该被建议
图2:描述了问题和答案不同步的对话
在谈话期间,"你好"和"我们的办公室位于纽约市"应该被建议
图3:描述了一个对话,其中答案的上下文是随着时间的推移建立的,并且为了分类目的(我假设),一些行是冗余的.
在对话过程中,"这里是免费试用帐户的链接"应该被建议
每个会话行(简化)我有以下数据:
谁写了行(用户或代理),文本,时间戳
我正在使用以下代码来训练我的模型:
from gensim.models import Doc2Vec
from gensim.models.doc2vec import TaggedLineDocument
import datetime
print('Creating documents',datetime.datetime.now().time())
context = TaggedLineDocument('./test_data/context.csv')
print('Building model',datetime.datetime.now().time())
model = Doc2Vec(context,size = 200, window = 10, min_count = 10, workers=4)
print('Training...',datetime.datetime.now().time())
for epoch in range(10):
print('Run number :',epoch)
model.train(context)
model.save('./test_data/model')
Run Code Online (Sandbox Code Playgroud)
问:我应该如何构建我的训练数据以及可以应用哪些启发式方法从原始数据中提取它?
我要去看这篇论文http://cs.stanford.edu/~quocle/paragraph_vector.pdf
它说明了这一点
"对图矢量和单词矢量进行平均或连接以预测上下文中的下一个单词.在实验中,我们使用连接作为组合矢量的方法."
连接或平均如何工作?
示例(如果第1段包含word1和word2):
word1 vector =[0.1,0.2,0.3]
word2 vector =[0.4,0.5,0.6]
concat method
does paragraph vector = [0.1+0.4,0.2+0.5,0.3+0.6] ?
Average method
does paragraph vector = [(0.1+0.4)/2,(0.2+0.5)/2,(0.3+0.6)/2] ?
Run Code Online (Sandbox Code Playgroud)
也是从这张图片:
据说:
段落标记可以被认为是另一个单词.它充当记忆,记住当前上下文中缺少的内容 - 或段落的主题.出于这个原因,我们经常将此模型称为段落向量的分布式存储模型(PV-DM).
段落标记是否等于段落向量等于on?
请帮助我了解如何之差TaggedDocument和LabeledSentence的gensim作品.我的最终目标是使用Doc2Vec模型和任何分类器进行文本分类.我关注这个博客!
class MyLabeledSentences(object):
def __init__(self, dirname, dataDct={}, sentList=[]):
self.dirname = dirname
self.dataDct = {}
self.sentList = []
def ToArray(self):
for fname in os.listdir(self.dirname):
with open(os.path.join(self.dirname, fname)) as fin:
for item_no, sentence in enumerate(fin):
self.sentList.append(LabeledSentence([w for w in sentence.lower().split() if w in stopwords.words('english')], [fname.split('.')[0].strip() + '_%s' % item_no]))
return sentList
class MyTaggedDocument(object):
def __init__(self, dirname, dataDct={}, sentList=[]):
self.dirname = dirname
self.dataDct = {}
self.sentList = []
def ToArray(self):
for fname in …Run Code Online (Sandbox Code Playgroud) 我有两个目录,我想从中读取他们的文本文件并标记它们,但我不知道如何通过它TaggedDocument.我认为它可以用作TaggedDocument([Strings],[Labels]),但这显然不起作用.
这是我的代码:
from gensim import models
from gensim.models.doc2vec import TaggedDocument
import utilities as util
import os
from sklearn import svm
from nltk.tokenize import sent_tokenize
CogPath = "./FixedCog/"
NotCogPath = "./FixedNotCog/"
SamplePath ="./Sample/"
docs = []
tags = []
CogList = [p for p in os.listdir(CogPath) if p.endswith('.txt')]
NotCogList = [p for p in os.listdir(NotCogPath) if p.endswith('.txt')]
SampleList = [p for p in os.listdir(SamplePath) if p.endswith('.txt')]
for doc in CogList:
str = open(CogPath+doc,'r').read().decode("utf-8")
docs.append(str)
print docs
tags.append(doc)
print "###########" …Run Code Online (Sandbox Code Playgroud) 我正在尝试遵循这里提到的官方Doc2Vec Gensim教程 - https://github.com/RaRe-Technologies/gensim/blob/develop/docs/notebooks/doc2vec-lee.ipynb
我修改了第10行中的代码以确定给定查询的最佳匹配文档,每次运行时,我得到一个完全不同的结果集.我在笔记本第10行的新代码是:
inferred_vector = model.infer_vector(['only', 'you', 'can', 'prevent', 'forest', 'fires'])
sims = model.docvecs.most_similar([inferred_vector], topn=len(model.docvecs))
rank = [docid for docid, sim in sims]
print(rank)
每次运行这段代码时,我都会获得与此查询匹配的不同文档集:"只有您可以防止森林火灾".差别很明显,似乎并不匹配.
Doc2Vec不适合查询和信息提取吗?还是有bug?
我有一个文档集合,每个文档都随着时间的推移而快速增长.任务是在任何固定时间找到类似的文件.我有两种可能的方法:
矢量嵌入(word2vec,GloVe或fasttext),对文档中的单词矢量求平均,并使用余弦相似度.
词袋:tf-idf或其变体,如BM25.
其中一个会产生明显更好的结果吗?是否有人对文件相似性进行了tf-idf与平均word2vec的定量比较?
是否有另一种方法,允许在添加更多文本时动态优化文档的向量?
是否有一个预先训练的,具有大数据集的doc2vec模型,例如Wikipedia或类似模型?
doc2vec ×10
gensim ×7
nlp ×5
word2vec ×5
python ×4
gensym ×1
joblib ×1
nltk ×1
python-3.x ×1
tensorflow ×1
text-mining ×1
tf-idf ×1