在我的毕业设计中,我有一个重要的模块,它即将学习一个模型,它帮助我给它一个期望是“伊斯兰”主题的输入/查询,模型的输出是与我的主题相关的“古兰经”的一些词句。
一个例子(阿拉伯语)
查询可能是这样的:برالوالدين或الإحسانبالوالين
预期输出的一些古兰经诗句与前面的查询相关,如下所示:
这是一个简单的例子,但请注意,主题本身可能不会在诗篇中被提及,所以它可能比上面的例子更难。
我的数据集
到现在为止。我收集了阿拉伯语、伊斯兰数据,如:
حدثناسعيدبنيحيىبنسعيدالقرشي،قالحدثناأبيقال،حدثناأبوبردةبنعبداللهبنأبيبردة،عنأبيبردة،عنأبيموسىرضىاللهعنهقالقالوايارسولاللهأىالإسلامأفضلقال“منسلمالمسلمونمنلسانهويده”。
حدثناعمروبنخالد،قالحدثناالليث،عنيزيد،عنأبيالخير،عنعبداللهبنعمرورضىاللهعنهماأنرجلا،سألالنبيصلىاللهعليهوسلمأىالإسلامخيرقال“تطعمالطعام،وتقرأالسلامعلىمنعرفتومنلمتعرف”。
حدثنامسدد،قالحدثنايحيى،عنشعبة،عنقتادة،عنأنسرضىاللهعنهعنالنبيصلىاللهعليهوسلم.وعنحسينالمعلم،قالحدثناقتادة،عنأنس،عنالنبيصلىاللهعليهوسلمقال“لايؤمنأحدكمحتىيحبلأخيهمايحبلنفسه”。
حدثناأبواليمان،قالأخبرناشعيب،قالحدثناأبوالزناد،عنالأعرج،عنأبيهريرةرضىاللهعنهأنرسولاللهصلىاللهعليهوسلمقال“فوالذينفسيبيدهلايؤمنأحدكمحتىأكونأحبإليهمنوالدهوولده”.
الحمدللهجملةخبريةقصدبهاالثناءعلىاللهبمضمونهامنانهتعالىمالكلجميعالحمدمنالخلقاومستحقلانيحمدوهواللهعلمعلىالمعبودبحقربالعالمينايمالكجميعالخلقمنالانسوالجنوالملائكةوالدوابوغيرهموكلمنهايطلقعليهعالميقالعالمالانسوعالمالجنالىغيرذلكوغلبفيجمعهبالياءوالنوناوليالعلمعلىغيرهموهومنالعلامةلانهعلامةعلىموجده
الرحمنالرحيمايذيالرحمةوهيارادةالخيرلاهله
ايالجزاءوهويومالقيامةوخصبالذكرلانهلاملكظاهرافيهلاحدالااللهتعالىبدليللمنالملكاليوم؟للهومنقرامالكفمعناهالامركلهفييومالقيامةاوهوموصوفبذلكدائماكغافرالذنبفصحوقوعهصفةلمعرفة
اياكنعبدواياكنستعيناينخصكبالعبادةمنتوحيدوغيرهونطلبالمعونةعلىالعبادةوغيرها
اهدناالصراطالمستقيمايارشدنااليهويبدلمنه
صراطالذينانعمتعليهمبالهدايةويبدلمنالذينبصلتهغيرالمغضوبعليهموهماليهودولاوغيرالضالينوهمالنصارىونكتةالبدلافادةانالمهتدينليسوايهوداولانصارىواللهاعلمبالصوابواليهالمرجعوالمابوصلىاللهعلىسيدنامحمدوعلىالهوصحبهوسلمتسليماكثيرادائماابداوحسبنااللهونعمالوكيلولاحولولاقوةالاباللهالعليالعظيم
注意,在ManualKeyword列中,在-标记之后的主题是-之前的主题的一个小节。
Doc2Vec模型
在多次尝试实现我的目标之后,我阅读了doc2vec模型,阅读了它的论文,并在阿拉伯任务上看到了它的一些实现。我认为,如果我训练一个关于整个阿拉伯语伊斯兰数据集的doc2vec模型,我现在收集的这些数据集和任何其他与这个领域相关的数据集,我的问题就会得到解决。
经过培训后,我的模型是使用它嵌入每个手册注释的主题individuality (为了澄清:我将像这样的每一行أركان الاسلام-التوحيد-الكافرون-افتراؤهم علي الله و تكذيبهم و جدالهم分离成单个短语
أركان الاسلام
التوحيد
الكافرون
افتراؤهم علي الله وتكذيبهم وجدالهم然后用一个向量嵌入/表示每一个主题,然后使用我训练的模型将用户的查询(预计超过一个单词)嵌入到它的向量中。然后计算查询向量与每个主题向量之间的余弦相似度。因此,我可以映射主题,它得到了最大的相似性,它的相关经文,并检索到他们的用户。
我的密码
读“古兰经”意义后的和“ hadithsDocumentsList”中先知数据的俗语
#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函数从我的模型中获得类似的文档。产出绝对不是我所期望的。而且模型的精度很差。
我不知道什么是正确的参数,如dm,dbow_words,size,window,alpha,应该传递给模型以达到最高的精度。我不太了解每个参数的功能,需要帮助来调优每个参数。我还想知道我的数据集是否足以构建这个模型,还是我需要增加它?收集或传递给模型时是否有任何不准确或错误?
你的建议或意见是什么?
发布于 2019-02-17 22:18:10
注意:我不懂阿拉伯语,所以不能解释你的示例文本片段。
许多Doc2Vec发表的工作都使用了数万到数百万个培训文档的数据集,但有时人们会用更小的数据集来报告一些成功。
所以,你的7,000个条目“古兰经意义”数据集,如果我正确地理解原诗到最近的书面解释(在解释更有可能匹配‘查询’文本),是有道理的,特别是如果与其他注解一起扩展。
对于模型训练参数应该是什么,没有普遍的好指南--它根据数据的大小/质量以及最终目标而有很大差异。最佳实践是找出一些定量的、可重复的方法来得分模型的向量,这与你的最终目标很好地相关。
(例如,在某些查询中,可能有越来越多的结果“应该”排在更高的位置,而不是其他结果。然后,根据这些“正确”的黄金标准首选项中的多少来对任何模型进行评分,并尝试许多模型参数的排列以找到得分最高的模型。)
您的性能可能对适当的标记化和合成文档构造策略非常敏感,以确保从有限的数据中获得最大的价值。(例如,确保同一单词的不同形式一起规范化,而不是保持独立,然后可能没有达到min_count的截止。或者,将同一节的多个注解组合成一个有意义的多元/丰富的文档,而不是零碎的几个单词的文档。)
模型参数的一些一般趋势:
dm=0)工作得很快&很好,特别是在较短的文档中。(在纯PV中,不存在逐字训练,因此window是不相关的。如果在PV-DM dm=1模式下,或者使用dbow_words=1在windows中添加逐字训练,那么window也是相关的,并且通常更长的窗口使向量更多地涉及一般主题,而不是狭窄的可替代实体。)min_count)或频繁单词的更积极的下采样(较小的sample参数)。如果您正在使用infer_vector(),请确保使用最新版本的gensim (已经对默认值进行了重要的修复和更改)。一定要对文本进行预处理/规范化/标记,这与在培训期间对infer_vector()所做的相同(因为未知的单词将被忽略,从而使推理更加随机。更长的文本更像训练数据(与几个单词相比较),推理效果更好,并且可能受益于更多的推理epochs (特别是在非常短的文档中)。
https://stackoverflow.com/questions/54730414
复制相似问题