在 Gensim.Doc2Vec 中应用 Similar 函数
applying the Similar function in Gensim.Doc2Vec
我正在尝试让 doc2vec 函数在 python 3 中工作。
我有以下代码:
tekstdata = [[ index, str(row["StatementOfTargetFiguresAndPoliciesForTheUnderrepresentedGender"])] for index, row in data.iterrows()]
def prep (x):
low = x.lower()
return word_tokenize(low)
def cleanMuch(data, clean):
output = []
for x, y in data:
z = clean(y)
output.append([str(x), z])
return output
tekstdata = cleanMuch(tekstdata, prep)
def tagdocs(docs):
output = []
for x,y in docs:
output.append(gensim.models.doc2vec.TaggedDocument(y, x))
return output
tekstdata = tagdocs(tekstdata)
print(tekstdata[100])
vectorModel = gensim.models.doc2vec.Doc2Vec(tekstdata, size = 100, window = 4,min_count = 3, iter = 2)
ranks = []
second_ranks = []
for x, y in tekstdata:
print (x)
print (y)
inferred_vector = vectorModel.infer_vector(y)
sims = vectorModel.docvecs.most_similar([inferred_vector], topn=1001, restrict_vocab = None)
rank = [docid for docid, sim in sims].index(y)
ranks.append(rank)
据我所知,在 rank 函数之前,所有功能都有效。
我得到的错误是我的列表中没有零,例如我放入的文件列表中没有 10 个:
File "C:/Users/Niels Helsø/Documents/github/Speciale/Test/Data prep.py", line 59, in <module>
rank = [docid for docid, sim in sims].index(y)
ValueError: '10' is not in list
我觉得是类似的功能不行。
该模型根据我的数据(1000 个文档)进行训练并构建一个带标签的词汇表。
我主要使用的文档是这样的:
Gensim dokumentation
Torturial
希望有人能提供帮助。如果需要任何其他信息,请告诉我。
最好
尼尔斯
如果您得到 ValueError: '10' is not in list
,您可以相信 '10'
不在列表中。那么,您是否查看了列表,看看其中包含什么,是否符合您的预期?
从您的代码摘录中不清楚是否曾调用过 tagdocs()
,因此不清楚 tekstdata
提供给 Doc2Vec
时的形式。意图有点复杂,没有任何东西可以显示数据以其原始原始形式出现的内容。
但是您提供给 TaggedDocument
的 tags
可能不是所需的标签列表,而是一个简单的字符串,它将被解释为字符列表。因此,即使您提供 '10'
的 tags
,它也会被视为 ['1', '0']
– 而 len(vectorModel.doctags)
将只是 10(对于 10 个单-数字串)。
对您的设置的单独评论:
- 1000 个文档对于
Doc2Vec
来说非常小,其中大多数已发布的结果使用数万到数百万个文档
- 10-20 的
iter
在 Doc2Vec
工作中更常见(更大的值可能对较小的数据集有帮助)
infer_vector()
通常在其可选参数中使用非默认值时效果更好,尤其是 steps
大得多 (20-200) 或起始 alpha
更像批量训练默认值 (0.025
)
我正在尝试让 doc2vec 函数在 python 3 中工作。 我有以下代码:
tekstdata = [[ index, str(row["StatementOfTargetFiguresAndPoliciesForTheUnderrepresentedGender"])] for index, row in data.iterrows()]
def prep (x):
low = x.lower()
return word_tokenize(low)
def cleanMuch(data, clean):
output = []
for x, y in data:
z = clean(y)
output.append([str(x), z])
return output
tekstdata = cleanMuch(tekstdata, prep)
def tagdocs(docs):
output = []
for x,y in docs:
output.append(gensim.models.doc2vec.TaggedDocument(y, x))
return output
tekstdata = tagdocs(tekstdata)
print(tekstdata[100])
vectorModel = gensim.models.doc2vec.Doc2Vec(tekstdata, size = 100, window = 4,min_count = 3, iter = 2)
ranks = []
second_ranks = []
for x, y in tekstdata:
print (x)
print (y)
inferred_vector = vectorModel.infer_vector(y)
sims = vectorModel.docvecs.most_similar([inferred_vector], topn=1001, restrict_vocab = None)
rank = [docid for docid, sim in sims].index(y)
ranks.append(rank)
据我所知,在 rank 函数之前,所有功能都有效。 我得到的错误是我的列表中没有零,例如我放入的文件列表中没有 10 个:
File "C:/Users/Niels Helsø/Documents/github/Speciale/Test/Data prep.py", line 59, in <module>
rank = [docid for docid, sim in sims].index(y)
ValueError: '10' is not in list
我觉得是类似的功能不行。 该模型根据我的数据(1000 个文档)进行训练并构建一个带标签的词汇表。 我主要使用的文档是这样的: Gensim dokumentation Torturial
希望有人能提供帮助。如果需要任何其他信息,请告诉我。 最好 尼尔斯
如果您得到 ValueError: '10' is not in list
,您可以相信 '10'
不在列表中。那么,您是否查看了列表,看看其中包含什么,是否符合您的预期?
从您的代码摘录中不清楚是否曾调用过 tagdocs()
,因此不清楚 tekstdata
提供给 Doc2Vec
时的形式。意图有点复杂,没有任何东西可以显示数据以其原始原始形式出现的内容。
但是您提供给 TaggedDocument
的 tags
可能不是所需的标签列表,而是一个简单的字符串,它将被解释为字符列表。因此,即使您提供 '10'
的 tags
,它也会被视为 ['1', '0']
– 而 len(vectorModel.doctags)
将只是 10(对于 10 个单-数字串)。
对您的设置的单独评论:
- 1000 个文档对于
Doc2Vec
来说非常小,其中大多数已发布的结果使用数万到数百万个文档 - 10-20 的
iter
在Doc2Vec
工作中更常见(更大的值可能对较小的数据集有帮助) infer_vector()
通常在其可选参数中使用非默认值时效果更好,尤其是steps
大得多 (20-200) 或起始alpha
更像批量训练默认值 (0.025
)