尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

YodaQA核心流水线代码深度剖析:QuestionCAS到AnswerHitlistCAS的数据流全程走读

YodaQA核心流水线代码深度剖析:QuestionCAS到AnswerHitlistCAS的数据流全程走读 YodaQA核心流水线代码深度剖析QuestionCAS到AnswerHitlistCAS的数据流全程走读【免费下载链接】yodaqaA Question Answering system built on top of the Apache UIMA framework.项目地址: https://gitcode.com/gh_mirrors/yo/yodaqaYodaQA 是一个基于 Apache UIMA 框架开源构建的事实型问答QA系统能够从 Freebase、DBpedia 知识库和维基百科文本中实时抽取信息并回答问题。本文带你完整走读 YodaQA 的核心流水线一个问题如何从QuestionCAS问题公共分析结构出发经过问题解析、答案生产、答案分析最终汇聚为AnswerHitlistCAS答案命中列表并输出排名靠前的答案全程覆盖关键源码文件与数据流转逻辑。️ YodaQA 数据流全景5 种 CAS 的接力之旅在 UIMA 中CASCommon Analysis Structure是贯穿整条流水线的数据容器每个分析组件Analysis Engine都在同一个 CAS 上读写标注。YodaQA 的巧妙之处在于用5 种 CAS 的分裂—汇聚来组织并行分析QuestionCAS ── QuestionAnalysis ── 并行答案生产 ── 多个 CandidateAnswerCAS │ v AnswerAnalysis ── AnswerCASMerger ── AnswerHitlistCAS └── 三轮 Scoring 输出CAS 类型角色类比理解QuestionCAS承载问题文本及全部问题侧标注订单原始需求SearchResultCAS一次搜索结果 问题侧副本Question 视图调研资料CandidateAnswerCAS单个候选答案 问题视图副本候选方案AnswerHitlistCAS去重合并后的答案清单 特征向量最终候选名单Passages 视图SearchResultCAS 内只含相关句子的子视图精读摘录这套设计的官方说明见设计文档doc/HIGHLEVEL.md全部 CAS 类型定义集中在src/main/typesystem/目录下的 5 个 XML 文件如QuestionTypes_TS.xml、CandidateAnswerTypes_TS.xml、AnswerHitlistTypes_TS.xml。 第一步Question Reader —— 问题的入口流水线的起点是Collection Reader它把问题文本读入一个全新的 QuestionCAS并将问题文本设为 SOFA整个 CAS 的文档。项目提供多种入口代码位于src/main/java/cz/brmlab/yodaqa/io/目录Web 交互WebQuestionReader.javaio/web/从 Web 界面的QuestionDashboard中取出待答问题写入问题文本、QuestionInfo来源、唯一 ID以及用户手工指定的 Concept/Clue机器批量TSVQuestionReader.java、JSONQuestionReader.javaio/collection/用于评测集批量跑分命令行交互InteractiveQuestionReader.javaio/interactive/。Reader 同时负责创建仪表盘记录答案来源、片段、文档等信息都会冗余存到flow/dashboard/QuestionDashboard.java供 Web 界面展示答题细节。 第二步Question Analysis —— 把问题读透QuestionAnalysisAE.javaanalysis/question/是一个聚合分析引擎它在 QuestionCAS 上串行运行两组组件第一组通用 NLP 基础标注来自 DKpro 对 Stanford NLP、OpenNLP 等模型的绑定分词OpenNlpSegmenter句法解析 词性StanfordParser词形还原LanguageToolLemmatizer命名实体识别OpenNlpNamedEntities第二组QA 专属特征生成器它们把通用标注转化为问答可用的线索标注类型含义示例问题Terry Pratchett 写的第几本书→ 第 1 本Clue线索用于检索的关键信息first、book、Terry PratchettConcept概念线索命中维基标题/别名后的话题Terry Pratchett 的维基条目SV选择动词在线索之间选择答案的谓语writtenFocus焦点答案主体的主要约束词bookLAT词汇答案类型答案应当可类型强转到的词who、actor、bookSubject主题答案的主要话题实体Terry Pratchett对应的生成器类依次为SVGenerator.java、FocusGenerator.java、SubjectGenerator.java、LATByFocus.java、ClueBy*.java等均在analysis/question/最后由CluesMergeByText.java去重、ClassClassifier.java完成问题分类。 记住两条主线Clue Concept负责去哪找答案LAT负责答案长什么样才算对——这是后续所有阶段的灵魂。 第三步Answer Production —— 多路并行的答案生产这是数据流中CAS 分裂最剧烈的阶段。YodaQA.javapipeline/中的createAnswerProducerDescription()用FixedParallelFlowController并行挂接了 5 条答案生产支线结构化支线DBpediaOntologyAnswerProducer.java、DBpediaPropertyAnswerProducer.java、FreebaseOntologyAnswerProducer.javapipeline/structured/——直接把知识图谱中的关系值作为候选答案全文支线SolrFullAnswerProducer.javapipeline/solrfull/与SolrDocAnswerProducer.javapipeline/solrd oc/文档标题即答案。以全文支线为例SolrFullAnswerProducer内部又并行发起 3 路搜索见其createPassageProducerDescription()Solr 全文检索SolrFullPrimarySearch.java——用 Clues 查询维基百科索引标题命中检索titleInClue 策略Bing 检索BingFullPrimarySearch.java结果经 SQLite 缓存见provider/sqlite/BingResultsCache.java。搜索命中文档后流程进入结果分析 → 片段抽取 → 答案抽取的三级加工PassageExtractorAE.javaanalysis/passextract/按线索匹配度抽取相关句子覆盖到 Passages 视图并用PassScoreSimple.java等打分器筛出 PickedPassagesPassageAnalysisAE.javaanalysis/passage/对精选片段做深度解析StanfordParser、词形还原、命名实体然后由 4 个互补的答案抽取器生成CandidateAnswer 标注CanByNPSurprise.java没被线索覆盖的名词短语CanByNESurprise.java没被线索覆盖的命名实体CanByLATSubject.javaThe is 答案 这类句型CanByBIOTaggerAE.javaanalysis/passage/biotagger/CRF 序列标注B-I-O把答案当作命名实体识别是精度最高的一路最后CanMergeByText.java合并同文本答案CanBlacklist.java过滤语言学噪声。随后AnswerGenerator.javapipeline/solrfull/把每个 CandidateAnswer 标注孵化成一个独立的CandidateAnswerCASSOFA 是答案文本本身并携带Question视图问题标注副本和Result视图来源信息。⚠️ 一个关键细节每个并行支线最终都会产出一个带isLast标记的 CAS。YodaQA.java注释明确提醒——如果你新增支线必须同步调大AnswerCASMerger的islast-barrier参数否则汇聚器会提前收工。 第四步Answer Analysis —— 给候选答案验明正身AnswerAnalysisAE.javaanalysis/answer/在每个 CandidateAnswerCAS 上运行核心任务是类型强转Type Coercion即判断这个答案在类型上配不配得上问题的 LAT对答案片段重新解析FindReqParse.java StanfordParser限制 50 token 控制开销生成答案侧 LATLATByWnInstance.javaWordNet 实例、LATByDBpediaWN.java、LATByNE.java命名实体类型、LATByQuantity.java数量型答案等LATMatchTyCor.javaanalysis/tycor/执行 LAT 匹配打分——问题的 book 与答案侧 novel → book 的上下位链在这里对接QuestionClassFeatures.java补充问题分类相关特征AnswerClueOverlap.java记录答案与问题的线索重合度。至此每个候选答案都携带了我是什么类型 我与问题有多契合的完整特征包。 第五步AnswerCASMerger —— 百川归海AnswerCASMerger.javapipeline/是整条流水线的汇聚点它把所有 CandidateAnswerCAS 压缩回单个 AnswerHitlistCAS双视图结构新建 CAS 含Question视图拷贝第一个输入 CAS 的问题标注和AnswerHitlist视图存放Answer特征结构按文本去重同文本答案的特征向量AnswerFV合并、LAT 并集、来源资源AnswerResource去重合并、snippet ID 用LinkedHashSet合并多来源加成同一答案若来自 2 种以上来源片段、文档标题、DBpedia 本体、Freebase……打上OriginMultiple特征相位记忆进入 Phase 1/2 时把上一轮打分Phase0Score/Phase1Score回填为confidence作为下一轮分类器的输入特征isLast 屏障hasNext()只在看到的 isLast 数 ≥ barrier 且收齐全部 CAS时才返回 true保证并行支线不丢数据。 第六步三轮 Scoring 序列化断点 —— 精准排序的艺术回到YodaQA.java的buildPipeline()你会发现流水线被切成Phase 0 / 1 / 2 三段每段末尾都有序列化/打分检查点这正是 README 强调的可断点续跑设计阶段关键组件做什么Phase 0AnswerScoringAEscoringPhase用决策森林AnswerScoreDecisionForest.java做首次打分排名可经save_answerfvs落盘Phase 1AnswerCASSplitterTop-25→AnswerTextMerger→EvidenceDiffusion砍掉长尾噪声文本等价答案合并部分等价答案如国家与首都互相证据扩散传递分数再做单正例打分Phase 2AnswerEvidencingAEanalysis/ansevid/对 Top-N 精英答案重新孵化 CAS做额外检索取证如线索答案共现计数SolrHitsCounter.java特征回填后再打分三个阶段分别对应load_answerfvs/load_answer1fvs/load_answer2fvs系统属性设置后流水线可从对应检查点恢复跳过前面的昂贵阶段——这对训练分类器模型data/ml/下有完整的训练脚本与特征导出工具至关重要。 核心源码文件速查表流程环节关键文件仓库内相对路径流水线总装src/main/java/cz/brmlab/yodaqa/pipeline/YodaQA.java问题入口Websrc/main/java/cz/brmlab/yodaqa/io/web/WebQuestionReader.java问题分析src/main/java/cz/brmlab/yodaqa/analysis/question/QuestionAnalysisAE.java全文答案生产src/main/java/cz/brmlab/yodaqa/pipeline/solrfull/SolrFullAnswerProducer.java结构化答案生产src/main/java/cz/brmlab/yodaqa/pipeline/structured/DBpediaOntologyAnswerProducer.java片段分析src/main/java/cz/brmlab/yodaqa/analysis/passage/PassageAnalysisAE.java答案分析src/main/java/cz/brmlab/yodaqa/analysis/answer/AnswerAnalysisAE.javaCAS 汇聚器src/main/java/cz/brmlab/yodaqa/pipeline/AnswerCASMerger.java打分引擎src/main/java/cz/brmlab/yodaqa/analysis/ansscore/AnswerScoringAE.java证据取证src/main/java/cz/brmlab/yodaqa/analysis/ansevid/AnswerEvidencingAE.javaCAS 类型定义src/main/typesystem/QuestionTypes_TS.xml、src/main/typesystem/AnswerHitlistTypes_TS.xml高层设计文档doc/HIGHLEVEL.md、doc/KNOWLEDGE.md 快速上手5 分钟跑通 YodaQA 问答流水线想亲手观察这条数据流按 READMEREADME.md操作即可建议 8GB 以上内存获取代码git clone https://gitcode.com/gh_mirrors/yo/yodaqa安装 Java JDK 后执行./gradlew check先跑一次echo | ./gradlew run触发 NLP 模型与资源下载数百 MB启动交互式前端./gradlew run -q或 Web 前端./gradlew web -q后访问http://localhost:4567/想看它思考加上-Dorg.slf4j.simpleLogger.log.cz.brmlab.yodaqadebug——README 强烈推荐数据源Solr 维基索引、DBpedia FUSEKI 等可用 Docker 一键部署脚本见data/scripts/与data/docker-compose.yml。批量评测可参考data/eval/下的 curated 测试集与train-and-eval.sh。✅ 总结一句话记住 YodaQA 的数据流Reader 造一个 QuestionCAS → 分析器往里面塞 Clue/LAT/Focus → 5 条支线并行把它裂变成成百上千个 CandidateAnswerCAS → Merger 用 isLast 屏障聚变回一个 AnswerHitlistCAS → 三轮 Scoring 与证据扩散层层精炼 → Writer 输出 Top 答案。理解了视图View承载来源信息、isLast 标记协调并行、序列化检查点支持断点续训这三件法宝你就能读懂 YodaQA 几乎所有流水线代码并照着这套模式构建自己的 UIMA 问答系统。【免费下载链接】yodaqaA Question Answering system built on top of the Apache UIMA framework.项目地址: https://gitcode.com/gh_mirrors/yo/yodaqa创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表