首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >建立基于verse主题的古兰经经文检索系统doc2vec嵌入模型需要帮助

建立基于verse主题的古兰经经文检索系统doc2vec嵌入模型需要帮助
EN

Stack Overflow用户
提问于 2019-02-17 05:28:10
回答 1查看 379关注 0票数 1

在我的毕业设计中,我有一个重要的模块,它即将学习一个模型,它帮助我给它一个期望是“伊斯兰”主题的输入/查询,模型的输出是与我的主题相关的“古兰经”的一些词句。

一个例子(阿拉伯语)

查询可能是这样的:برالوالدين或الإحسانبالوالين

预期输出的一些古兰经诗句与前面的查询相关,如下所示:

  • وَاعْبُدُوااللَّهَوَلَاتُشْرِكُوابِهِشَيْئًاوَبِالْوَالِدَيْنِإِحْسَانً
  • وَقُلْلَهُمَاقَوْلًاكَرِيمًا
  • وَوَصَّيْنَاالْإِنْسَانَبِوَالِدَيْهِحُسْنًا

这是一个简单的例子,但请注意,主题本身可能不会在诗篇中被提及,所以它可能比上面的例子更难。

我的数据集

到现在为止。我收集了阿拉伯语、伊斯兰数据,如:

  • 先知穆罕默德的箴言:大约35000份阿拉伯文档,这是数据文件中的一个示例:

حدثناسعيدبنيحيىبنسعيدالقرشي،قالحدثناأبيقال،حدثناأبوبردةبنعبداللهبنأبيبردة،عنأبيبردة،عنأبيموسىرضىاللهعنهقالقالوايارسولاللهأىالإسلامأفضلقال‏“‏منسلمالمسلمونمنلسانهويده‏”‏‏。‏

حدثناعمروبنخالد،قالحدثناالليث،عنيزيد،عنأبيالخير،عنعبداللهبنعمرورضىاللهعنهماأنرجلا،سألالنبيصلىاللهعليهوسلمأىالإسلامخيرقال‏“‏تطعمالطعام،وتقرأالسلامعلىمنعرفتومنلمتعرف‏”‏‏。‏

حدثنامسدد،قالحدثنايحيى،عنشعبة،عنقتادة،عنأنسرضىاللهعنهعنالنبيصلىاللهعليهوسلم‏.‏وعنحسينالمعلم،قالحدثناقتادة،عنأنس،عنالنبيصلىاللهعليهوسلمقال‏“‏لايؤمنأحدكمحتىيحبلأخيهمايحبلنفسه‏”‏‏。‏

حدثناأبواليمان،قالأخبرناشعيب،قالحدثناأبوالزناد،عنالأعرج،عنأبيهريرةرضىاللهعنهأنرسولاللهصلىاللهعليهوسلمقال‏“‏فوالذينفسيبيدهلايؤمنأحدكمحتىأكونأحبإليهمنوالدهوولده‏”‏‏.‏

  • 我也有“古兰经”的含义数据集,大约7000份文件,这里是这份文件的样本:

الحمدللهجملةخبريةقصدبهاالثناءعلىاللهبمضمونهامنانهتعالىمالكلجميعالحمدمنالخلقاومستحقلانيحمدوهواللهعلمعلىالمعبودبحقربالعالمينايمالكجميعالخلقمنالانسوالجنوالملائكةوالدوابوغيرهموكلمنهايطلقعليهعالميقالعالمالانسوعالمالجنالىغيرذلكوغلبفيجمعهبالياءوالنوناوليالعلمعلىغيرهموهومنالعلامةلانهعلامةعلىموجده

الرحمنالرحيمايذيالرحمةوهيارادةالخيرلاهله

ايالجزاءوهويومالقيامةوخصبالذكرلانهلاملكظاهرافيهلاحدالااللهتعالىبدليللمنالملكاليوم؟للهومنقرامالكفمعناهالامركلهفييومالقيامةاوهوموصوفبذلكدائماكغافرالذنبفصحوقوعهصفةلمعرفة

اياكنعبدواياكنستعيناينخصكبالعبادةمنتوحيدوغيرهونطلبالمعونةعلىالعبادةوغيرها

اهدناالصراطالمستقيمايارشدنااليهويبدلمنه

صراطالذينانعمتعليهمبالهدايةويبدلمنالذينبصلتهغيرالمغضوبعليهموهماليهودولاوغيرالضالينوهمالنصارىونكتةالبدلافادةانالمهتدينليسوايهوداولانصارىواللهاعلمبالصوابواليهالمرجعوالمابوصلىاللهعلىسيدنامحمدوعلىالهوصحبهوسلمتسليماكثيرادائماابداوحسبنااللهونعمالوكيلولاحولولاقوةالاباللهالعليالعظيم

  • 我还收集了一位伊斯兰专家的每一节的手工注释主题,他将古兰经的全部经文分为11个主要章节,每一节我都有分章节和分章节,.所以我有一个2列的数据集,第一个是诗歌本身,第二个是它的注释主题。这是一个示例:https://drive.google.com/open?id=1tEYs2QV9AmGQFqSzpvscNtlZfO3fVgCE

注意,在ManualKeyword列中,在-标记之后的主题是-之前的主题的一个小节。

Doc2Vec模型

在多次尝试实现我的目标之后,我阅读了doc2vec模型,阅读了它的论文,并在阿拉伯任务上看到了它的一些实现。我认为,如果我训练一个关于整个阿拉伯语伊斯兰数据集的doc2vec模型,我现在收集的这些数据集和任何其他与这个领域相关的数据集,我的问题就会得到解决。

经过培训后,我的模型是使用它嵌入每个手册注释的主题individuality (为了澄清:我将像这样的每一行أركان الاسلام-التوحيد-الكافرون-افتراؤهم علي الله و تكذيبهم و جدالهم分离成单个短语

代码语言:javascript
复制
أركان الاسلام
التوحيد
الكافرون
افتراؤهم علي الله وتكذيبهم وجدالهم

然后用一个向量嵌入/表示每一个主题,然后使用我训练的模型将用户的查询(预计超过一个单词)嵌入到它的向量中。然后计算查询向量与每个主题向量之间的余弦相似度。因此,我可以映射主题,它得到了最大的相似性,它的相关经文,并检索到他们的用户。

我的密码

读“古兰经”意义后的和“ hadithsDocumentsList”中先知数据的俗语

代码语言:javascript
复制
#Converting docuemnts list into tagged documents (each document is splited)
tagged_data = [gensim.models.doc2vec.TaggedDocument(words=_d.split(),
                              tags=[str(i)]) for i, _d in enumerate(hadithsDocumentsList)]

cores = multiprocessing.cpu_count()     #Getting number of cores

model = Doc2Vec(dm=1, size=200, window=10, workers=6)    #Initialize the model
model.build_vocab(tagged_data)      #Bulding vocabulary
print("model.corpus_count" , model.corpus_count)

#Training the model
model.train(tagged_data, total_examples=model.corpus_count, epochs=10)


#Saving Model
model.save("HadithAndTafserModel")
print("Model Saved")

model= Doc2Vec.load("HadithAndTafserModel")

testData = " رسول الله محمد".split()
testDataVector = model.infer_vector(testData)
print("Query Vector: ", testDataVector)

mostSemilarDocs = model.wv.most_similar([testDataVector])
print("MOST SIMILAR DOCUMENTS: \n")
print(mostSemilarDocs)

在对模型进行训练并从我的选择中获取查询的向量之后,并使用most_similar函数从我的模型中获得类似的文档。产出绝对不是我所期望的。而且模型的精度很差。

我不知道什么是正确的参数,如dmdbow_wordssizewindowalpha,应该传递给模型以达到最高的精度。我不太了解每个参数的功能,需要帮助来调优每个参数。我还想知道我的数据集是否足以构建这个模型,还是我需要增加它?收集或传递给模型时是否有任何不准确或错误?

你的建议或意见是什么?

EN

回答 1

Stack Overflow用户

发布于 2019-02-17 22:18:10

注意:我不懂阿拉伯语,所以不能解释你的示例文本片段。

许多Doc2Vec发表的工作都使用了数万到数百万个培训文档的数据集,但有时人们会用更小的数据集来报告一些成功。

所以,你的7,000个条目“古兰经意义”数据集,如果我正确地理解原诗到最近的书面解释(在解释更有可能匹配‘查询’文本),是有道理的,特别是如果与其他注解一起扩展。

对于模型训练参数应该是什么,没有普遍的好指南--它根据数据的大小/质量以及最终目标而有很大差异。最佳实践是找出一些定量的、可重复的方法来得分模型的向量,这与你的最终目标很好地相关。

(例如,在某些查询中,可能有越来越多的结果“应该”排在更高的位置,而不是其他结果。然后,根据这些“正确”的黄金标准首选项中的多少来对任何模型进行评分,并尝试许多模型参数的排列以找到得分最高的模型。)

您的性能可能对适当的标记化和合成文档构造策略非常敏感,以确保从有限的数据中获得最大的价值。(例如,确保同一单词的不同形式一起规范化,而不是保持独立,然后可能没有达到min_count的截止。或者,将同一节的多个注解组合成一个有意义的多元/丰富的文档,而不是零碎的几个单词的文档。)

模型参数的一些一般趋势:

  • 使用更少的数据--更少的文档、更小的词汇表、更小的文档--您可能需要减少向量大小和/或增加训练时代的数量。
  • 通常普通的PV模式(dm=0)工作得很快&很好,特别是在较短的文档中。(在纯PV中,不存在逐字训练,因此window是不相关的。如果在PV-DM dm=1模式下,或者使用dbow_words=1在windows中添加逐字训练,那么window也是相关的,并且通常更长的窗口使向量更多地涉及一般主题,而不是狭窄的可替代实体。)
  • 较大的语料库可能会受益于更具有攻击性的稀有词丢弃(较高的min_count)或频繁单词的更积极的下采样(较小的sample参数)。

如果您正在使用infer_vector(),请确保使用最新版本的gensim (已经对默认值进行了重要的修复和更改)。一定要对文本进行预处理/规范化/标记,这与在培训期间对infer_vector()所做的相同(因为未知的单词将被忽略,从而使推理更加随机。更长的文本更像训练数据(与几个单词相比较),推理效果更好,并且可能受益于更多的推理epochs (特别是在非常短的文档中)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54730414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档