- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在通过 doc2vec
模型使用 gensim
库在 Python 中构建 NLP 聊天应用程序。我有硬编码的文档并给出了一组训练示例,我通过抛出用户问题来测试模型,然后第一步找到最相似的文档。在本例中,我的测试问题是训练示例中文档的精确副本。
import gensim
from gensim import models
sentence = models.doc2vec.LabeledSentence(words=[u'sampling',u'what',u'is',u'tell',u'me',u'about'],tags=["SENT_0"])
sentence1 = models.doc2vec.LabeledSentence(words=[u'eligibility',u'what',u'is',u'my',u'limit',u'how',u'much',u'can',u'I',u'claim'],tags=["SENT_1"])
sentence2 = models.doc2vec.LabeledSentence(words=[u'eligibility',u'I',u'am',u'retiring',u'how',u'much',u'can',u'claim',u'have', u'resigned'],tags=["SENT_2"])
sentence3 = models.doc2vec.LabeledSentence(words=[u'what',u'is',u'my',u'eligibility',u'post',u'my',u'promotion'],tags=["SENT_3"])
sentence4 = models.doc2vec.LabeledSentence(words=[u'what',u'is', u'my',u'eligibility' u'post',u'my',u'promotion'], tags=["SENT_4"])
sentences = [sentence, sentence1, sentence2, sentence3, sentence4]
class LabeledLineSentence(object):
def __init__(self, filename):
self.filename = filename
def __iter__(self):
for uid, line in enumerate(open(filename)):
yield LabeledSentence(words=line.split(), labels=['SENT_%s' % uid])
model = models.Doc2Vec(alpha=0.03, min_alpha=.025, min_count=2)
model.build_vocab(sentences)
for epoch in range(30):
model.train(sentences, total_examples=model.corpus_count, epochs = model.iter)
model.alpha -= 0.002 # decrease the learning rate`
model.min_alpha = model.alpha # fix the learning rate, no decay
model.save("my_model.doc2vec")
model_loaded = models.Doc2Vec.load('my_model.doc2vec')
print (model_loaded.docvecs.most_similar(["SENT_4"]))
结果:
[('SENT_1', 0.043695494532585144), ('SENT_2', 0.0017897281795740128), ('SENT_0', -0.018954679369926453), ('SENT_3', -0.08253869414329529)]
SENT_4
和 SENT_3
的相似度仅为 -0.08253869414329529
,因为它们完全相同,因此它应该为 1。我应该如何提高这个准确性?是否有特定的培训文档方式,我错过了什么?
最佳答案
Word2Vec/Doc2Vec 不适用于玩具大小的示例(例如少量文本、短文本和少量总单词)。许多理想的属性只有通过数百万个单词或数万个文档的训练集才能可靠地实现。
特别是,只有 5 个示例,只有十几个或两个单词,但建模向量有 100 维,训练不会被迫做使单词向量/文档向量有用的主要事情:压缩表示成密集嵌入,其中相似的项目需要在向量空间中逐渐相互靠近,因为没有办法在一个巨大的查找表中保留所有原始变化。由于维度比语料库变体更多,您的相同标记 SENT_3
和 SENT_4
可以采用截然不同的文档向量,并且模型仍然足够大,可以很好地完成其训练任务(本质上是“过度拟合”),而没有强制具有相似向量的相似文本的所需最终状态。
有时,您可以通过更多的训练迭代和更小的模型(就向量大小
而言)从小数据集中挤出更多的意义,但实际上:这些向量需要大的、多样化的数据集变得有意义。
这是主要问题。示例代码中的其他一些低效或错误:
您的代码不使用类LabeledLineSentence
,因此无需在此处包含它 - 它是不相关的样板文件。 (此外,TaggedDocument
是最近 gensim 版本中 words
+tags
文档类的首选名称,而不是 LabeledSentence
.)
您对 alpha
和 min_alpha
的自定义管理不太可能做任何有用的事情。这些最好保留默认值,除非您已经有一些东西可以工作,很好地理解算法,然后想要尝试微妙的优化。
train()
将执行自己的迭代,因此您不需要在外循环中多次调用它。 (编写的这段代码在其第一个循环中以 alpha
值逐渐从 0.03 下降到 0.025 进行 5 次 model.iter
迭代,然后以 0.028 的固定 alpha 进行 5 次迭代,然后在 0.026 处再进行 5 次,然后以 alpha 递减的方式再进行 27 组 5 次迭代,在第 30 次循环时以固定 alpha -0.028 结束。这是一个无意义的结束值 – 学习率永远不应该为负 – 在无意义的末尾进展。即使使用大数据集,这 150 次迭代(大约一半发生在负 alpha
值上)也可能会产生奇怪的结果。)
关于python - 如何提高doc2vec模型中两个文档(句子)的余弦相似度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44581914/
假设我有一个数据集,每行包含一个句子,该句子来自一个非常大的调查(德语和法语)中的一个开放式问题。大多数句子(答案)是合乎逻辑的;即有意义的单词组合。但是,也有一些粗心的受访者只是简单地填写了各种不合
我的 MySQL 数据库中有一个表,其结构如下: CREATE TABLE `papers` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varch
在新的 Edge 浏览器(基于 chromium)中,有一个文本到语音的选项,在阅读页面时它会突出显示正在阅读的句子和单词,就像这样 - 过去我有一个简单的 Windows TTS 应用程序,我通过将
我有一本书的图像文件。我正在编写一个 Web 应用程序,用于加载书籍并一次显示一页。我想知道如何在页面中选择一个句子并显示一条消息。据我所知,它必须具有图像坐标。 请参阅http://epaper.d
我使用的 GPS 输出多个 NMEA 语句,可用于定位数据。 (GPGGA 和 GPRMC)。有什么理由我应该使用一个而不是另一个吗?我应该检查它们并比较数据吗?我可以随便挑一个使用吗? 在这一点上,
我想使用TinyGPS++在 Arduino 上解析 NMEA 数据并在 OLED 显示屏上显示信息。但是,NMEA 数据将通过 USB 接收,而不是使用软件串行和 TX/RX 引脚。 我按照 Tin
我需要删除其中的所有空格。 例如:这是我的代码O/P:Thisismycode 这是我到目前为止的代码。 import java.util.Scanner; public class nospace{
我对 python 很陌生,我不知道如何解决以下问题: 我有两个数据框,我想使用某种 VLOOKUP 函数来将句子与特定关键字相匹配。在下面的示例中,(df1) 3e 句子应与“banana”(df2
这个问题已经有答案了: How slicing in Python works (38 个回答) Python list slice syntax used for no obvious reason
我想在我的表格作者的句子列中找到以 # 开头的单词。我不知道我在寻找什么词,因为我只知道它以 # 开头。 表:作者(姓名,句子) 作者 |句子 艾伯特 |我#want to be #discussin
句子
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 9 年前。 Improve
我目前正在经历免费代码营的第一个 JS 挑战。 我在标题为“句子首字母大写”的挑战中遇到了问题。在这个挑战中,我需要编写一个函数,将给定字符串中单词的每个第一个字母大写,并将所有其他字母小写。 Her
假设我有一个文本,看起来像这样: Some sentence in which a fox jumps over some fence. Another sentence in which a
我是 C++ 的初学者,我想了解有关字符的更多信息,但我遇到了问题。我试图制作一个程序,它复制一个句子并在空格 (' ') 之间添加一个新行 ('\n'),就像一个单词一个单词地分开一个句子. int
我需要将一个句子(例如“Hello world”)复制到一个字符串列表中,意思是复制到一个字符数组中,其中每 2 个单词由 '\0' 分隔。请注意,单词被定义为一行中没有空格的任意数量的字符。 因此,
我有这样一个字符串, my_str ='·in this match, dated may 1, 2013 (the "the match") is between brooklyn centenni
我在列表中有一堆句子,我想使用 nltk 库来阻止它。我可以一次提取一个句子,但是我在从列表中提取句子并将它们重新组合在一起时遇到了问题。我缺少一个步骤吗? nltk 库很新。谢谢! import n
我有一个词和文本。我必须找到所有包含该词的提案。你有什么想法吗? piblic List GetSnetences(string word) { // search all proposals
我正在通过 doc2vec 模型使用 gensim 库在 Python 中构建 NLP 聊天应用程序。我有硬编码的文档并给出了一组训练示例,我通过抛出用户问题来测试模型,然后第一步找到最相似的文档。在
我有以下代码,每 10 个单词拆分一行。 #!/bin/bash while read line do counter=1; for word in $line do
我是一名优秀的程序员,十分优秀!