solr入门之solr的拼写检查功能的应用级别尝试

今天主要是收集了些拼写检查方面的资料和 尝试使用一下拼写检查的功能--=遇到了不少问题

拼写检查的四种配置眼下我仅仅算是成功了半个吧


---------------------------------

拼写检查功能,能在搜索时,提供一个较好用户体验。所以,主流的搜索引擎都有这个功能。在这之前,笔者先简单的说一下什么是拼写检查,事实上非常好理解。就是你输入的搜索词,可能是你输错了,也有可能在它的检索库里面根本不存在这个词。可是这时候它能给你返回,相似或相近的结果来帮助你校正。



举个样例。假如你在百度里面输入在在线电瓶,可能它的索引库里面就没有,可是它有可能返回在线电影,在线电视,在线观看等等一些词。这些。就用到拼写检查的功能了。

solr作为一种开源的搜索server,对拼写检查,也提供了良好的支持,那么以下笔者就来讲下关于solr4.3的拼写检查的配置,在这之前先说明一点。作为拼写检查用,为了提高校正的准确率,一般对校正的词,不要进行分词,所以用string就好了,拼写检查的配置主要是在solrconfig.xml里面配置.



1,拼写组件SpellCheckComponent配置
2,在SearchHandler   /select里面配置
3,在SearchHandler   /spell里面配置

依照上面3来,就能够高速配置好拼写检查功能了。事实上笔者上面写的4步。事实上仅仅配置2,3步就能够了。另外的第4步用默认值就能够了。在这里把它写出来。仅仅是让大家有个认识


拼写组件SpellCheckComponent它事实上是核心的东西。在他的里面能够配置1至多个拼写检查器,启动的时候全部的检查器都会载入。这次笔者主要介绍的有2个拼写检查器,一个是默认的仅仅对主索引做拼写校正,另外一个是自己定义载入spellings.txt拼写检查库。带拼写校正索引库的检查器,其它的检查器各位道友想要使用的话就自己去看wiki了。

https://cwiki.apache.org/confluence/display/solr/Spell+Checking


1.配置solrconfig.xml文件的拼写检查的几种方式

   <!--拼写检查设置 -->
      <searchComponent name="spellcheck" class="solr.SpellCheckComponent">  

    <!-- 查询分析器。假设不指定的话,默认会使用field字段类型的分词器  -->  
     <str name="queryAnalyzerFieldType">text_spell</str> 
     <lst name="spellchecker"> 
       <str name="name">direct</str> 
       <str name="field">suggest</str> 
       <str name="classname">solr.DirectSolrSpellChecker</str> 
       <str name="distanceMeasure">internal</str> 
       <float name="accuracy">0.5</float> 
       <int name="maxEdits">2</int> 
       <int name="minPrefix">1</int> 
       <int name="maxInspections">5</int> 
       <int name="minQueryLength">2</int> 
       <float name="maxQueryFrequency">0.01</float> 
    </lst> 
     <!--  读取拼写检查库的索引进行校正能够。使用默认配置,取消凝视就可以 -->  
        <lst name="spellchecker">  
            <str name="classname">solr.FileBasedSpellChecker</str><!--这个组件是载入配置文件来完毕的,检查源是文件能够起效的字段呢?-->  
            <str name="name">file</str>  
            <str name="sourceLocation">spellings.txt</str>  
            <str name="characterEncoding">UTF-8</str>  
            <str name="spellcheckIndexDir">spellcheckerFile</str>  
          </lst>  
<!-- ======================================================================================-->

<lst name="spellchecker">  

      <!--  

        Optional, it is required when more than one spellchecker is configured.  

        Select non-default name with spellcheck.dictionary in request handler.  

        ame是可选的,假设仅仅有一个spellchecker能够不写name  

        果有多个spellchecker,须要在Request Handler中指定spellcheck.dictionary  

      -->  

      <str name="name">base</str>  

      <!-- The classname is optional, defaults to IndexBasedSpellChecker -->  

      <str name="classname">solr.IndexBasedSpellChecker</str>  

      <!--  

               Load tokens from the following field for spell checking,  

               analyzer for the field's type as defined in schema.xml are used  

                以下这个field名字指的是拼写检查的根据,也就是说要根据哪个Field来检查用户输入。  

      -->  

      <str name="field">suggest</str>  

            <!-- Optional, by default use in-memory index (RAMDirectory)   

        SpellCheck索引文件的存放位置,是可选的,假设不写默认使用内存模式RAMDirectory。  

        ./spellchecker1指的是:corex\data\spellchecker1  

        -->  

      <str name="spellcheckIndexDir">./spellchecker-base</str>  

      <!-- Set the accuracy (float) to be used for the suggestions. Default is 0.5 -->  

      <str name="accuracy">0.7</str>  

<!--何时创建拼写索引:buildOnCommit/buildOnOptimize -->  

   <str name="buildOnCommit">true</str>  

    </lst>  

<!-- 还有一个拼写检查器,使用JaroWinklerDistance距离算法  类 那个主索引的方式应该也是能建立的吧 -->  

    <lst name="spellchecker">  

       <str name="name">jarowinkler</str>  

       <str name="classname">solr.IndexBasedSpellChecker</str>  

       <str name="field">suggest</str>  

       <!-- Use a different Distance Measure -->  

       <str name="distanceMeasure">org.apache.lucene.search.spell.JaroWinklerDistance</str>  

       <str name="spellcheckIndexDir">./spellchecker2</str>  

       <str name="buildOnCommit">true</str>  

     </lst>  


<!-- ======================================================================================-->    
     </searchComponent> 
2.配置solr搜索组件部分---select 和spell部分
 <requestHandler name="/select" class="solr.SearchHandler">
    <!-- default values for query parameters can be specified, these
         will be overridden by parameters in the request
      -->
     <lst name="defaults">
       <str name="echoParams">explicit</str>
       <int name="rows">10</int>
     </lst>
    <!-- 这行代码很重要。假设没有这行,拼写检查。是不起作用的-->  
        <arr name="last-components">  
        <str>spellcheck</str>  
      </arr> 
    </requestHandler>
  <!--spell 查询器 -->
  <requestHandler name="/spell" class="solr.SearchHandler" startup="lazy">  
    <lst name="defaults">  
      <str name="df">suggest</str> <!--默认查询字段--> 
      <str name="spellcheck.dictionary">direct</str>  <!--使用那个组件-->
      <str name="spellcheck">on</str>  
      <str name="spellcheck.extendedResults">true</str>              
      <str name="spellcheck.collate">true</str>  
      <str name="spellcheck.collateExtendedResults">true</str>         
    </lst>  
    <arr name="last-components">  
      <str>spellcheck</str>  
    </arr>  
  </requestHandler>


文件方式说明

对于上面的代码。尽管能够载入多个校正器。可是在拼写检查时,仅仅能指定特定的一个进行校正。那么为什么要配置多个校正检查器呢? 笔者个人感觉这个主要是方便在程序执行能够动态切换校正器。



在spellings.txt里面自己定义的拼写检查词,注意编码的格式一定是要UTF-8无BOM的格式。这里面的词。会在solr服务启动时,自己主动创建spellcheckerFile目录并把内容载入到

本库的data文件夹下

3.solr主界面查询尝试


这是是使用direct方式 来进行尝试的 详细的效果 预计和配置的參数 有非常大的关系


关于其余几种方式--我主要在尝试文件夹的方式的载入今天没有搞定呀

明天的尝试下:

以下是一些原理方面的资料;

一、纠错功能。英文叫做spellcheck。在英文上做纠错比較直接。就是看单词的编辑距离,目标当然就是对于随意一个输入,能在大量正确而靠谱的查询词中找出编辑距离满足要求的一个或者几个。

面对这种spellcheck任务,模型上就是要推算用户输入错误单词w的条件下,是正确单词c的概率。也就是argmaxc P(c|w)。

一般有两种方案:一种。是http://norvig.com/spell-correct.html 介绍的办法,还有一种是lucene-suggest里spellchecker的方法。

 


      1. 第一种,在norvig介绍的方法中,具体的阐述了argmaxc P(c|w)的转换和求解办法。 这个概率不好直接算,但能够依据贝叶斯定理等价于argmaxc P(w|c)*P(c) / P(w)。由于是比較各个c之间的大小所以P(w)能够省略,最后就变成求argmaxc P(w|c)*P(c)即可了。P(c)能够看作是c在文本集合中出现的可能性;P(w|c)意味着本来心里想成是c结果打成了w的概率。

那就非常好办了,P(c)能够从靠谱的语料中统计。P(w|c)能够用编辑距离来模拟关系,即编辑距离小的概率大。在实现上,对一个输入word,产生出有编辑距离1的字符串,就包含几种情况:删除一个字符、交换临近字符、把一个字符改成还有一个、添加一个字符。这样产生的候选集会比較大,接近80%的纠错要求是满足了。

假设在编辑距离1的基础上再产生编辑距离为2的更大的候选集。差点儿就覆盖全部错别字了。原文讲得比較精细。建模思路也非常清晰。建议细致阅读,这就不细说了。

      2.另外一种方案就是lucene的spellchecker方法。上面方案是把编辑距离的暂时产生到词典中检查。这样的方案就是预先进行词典索引。当然是ngram的,对一个word随意2位或者3位字符进行索引,对用户输入的一个字符。也同理按2或3位产生字符片段,利用OR的关系去检索。命中多的word得分更高最可能是拼写错误的。当然由于是OR查询关系,所以会有非常多也仅仅“沾边”的词也被命中。所以最后除了考虑查询命中高分的。还要对命中的和输入的进行一步编辑距离阈值过滤。举个样例“word”。我们会有n2:wo/n2:or/n2:rd/n3:wor/n3:ord 这些碎片进行索引,当用户输入一个worg,会产生n2:wo/n2:or/n2:rg/n3:wor/n3:org,这些检索条件,会查到非常多work, worth等等。

细节上能够有一些增强,比方单词两头的字符碎片权重更大等等。

这两种求解argmax P(c|w)的办法,norvig的办法比lucene-spellcheck的办法在线上的环节多一些,效率上预计还是差一点,但提供了非常巧妙的求解思路,值得细细品味。


二、相关搜索的功能,学术界研究的比較多。有各种提法,query rewrite,query substitution, query extension等等。算法也五花八门,大多为了结果好看添加了复杂的计算,和针对数据情况的考量。

一般project上须要的是通用的办法,再添加一些特殊的考虑来提高效果。过去以前有幸看到一篇貌似不是非常正规的论文。方法非常easy,思路清晰,非常适合在实际project上应用起来。论文也不记得标题了。只是思想还记得非常清晰:就是寻找query词之间的强弱联系。

普通情况下构成query之间的关联有三种基本的因素:

     1. 字面意思的关联。假设一个query比还有一个query 多了或者少了一个词。那么这两个词肯定是有关联的。长短语是短短语的详细化,反之是泛化。比方“笔记本 内存条 8G”就是“笔记本 内存条”的细化,反过来看“笔记本 内存条”不仅包含“8G”也包含其它容量,是更泛化的查询词。

     2. 用户输入行为的关联;用户在一个会话之中连续输入的多个词之间能够觉得是有关联的,即做一个人的需求反应在查询词上。比方用户查询了“键盘”他可能还有须要去买点别的,比如“鼠标”之类的。假设这种情况出现了多次,那么“键盘”和“鼠标”就能够看成是有强联系的。

     3. 用户点击行为的关联。用户为了找一个东西的时候可能词不正确重复更换查询词,或者不同人用不同的表达,假设都点到一个结果。能够看做用了不同的办法找到相同的东西,殊途同归的味道。那么这些落到同一结果的路径。即query。也能够看做是有强关联的。


这三种是比較通用的关联关系,也非常直接,而且数据能非常easy获得或者被日志记录下来的。除了这几种,还能够依据详细业务情况添加其它关联考虑。最后。我们能够依据经验或者统计分析调整多种关联关系的权重。实现上,对一个query。须要让查那些和它有关联的queries,都能被找出来。于是想到能够用检索系统,传统的检索系统是对文档的内容直接分词出一个个token后建索引,这里是对query,进行特殊“分词”出那些关联的token去建索引。


      最后,假设要把纠错和相关搜索结合在一起,就有非常多综合考虑了。总之相关搜索是检索之外比較影响用户体验的一个服务。值得投入精力把它做好。

转载:http://blog.youkuaiyun.com/lgnlgn/article/details/8760785








标题SpringBoot智能在线预约挂号系统研究AI更换标题第1章引言介绍智能在线预约挂号系统的研究背景、意义、国内外研究现状及论文创新点。1.1研究背景与意义阐述智能在线预约挂号系统对提升医疗服务效率的重要性。1.2国内外研究现状分析国内外智能在线预约挂号系统的研究与应用情况。1.3研究方法及创新点概述本文采用的技术路线、研究方法及主要创新点。第2章相关理论总结智能在线预约挂号系统相关理论,包括系统架构、开发技术等。2.1系统架构设计理论介绍系统架构设计的基本原则和常用方法。2.2SpringBoot开发框架理论阐述SpringBoot框架的特点、优势及其在系统开发中的应用。2.3数据库设计与管理理论介绍数据库设计原则、数据模型及数据库管理系统。2.4网络安全与数据保护理论讨论网络安全威胁、数据保护技术及其在系统中的应用。第3章SpringBoot智能在线预约挂号系统设计详细介绍系统的设计方案,包括功能模块划分、数据库设计等。3.1系统功能模块设计划分系统功能模块,如用户管理、挂号管理、医生排班等。3.2数据库设计与实现设计数据库表结构,确定字段类型、主键及外键关系。3.3用户界面设计设计用户友好的界面,提升用户体验。3.4系统安全设计阐述系统安全策略,包括用户认证、数据加密等。第4章系统实现与测试介绍系统的实现过程,包括编码、测试及优化等。4.1系统编码实现采用SpringBoot框架进行系统编码实现。4.2系统测试方法介绍系统测试的方法、步骤及测试用例设计。4.3系统性能测试与分析对系统进行性能测试,分析测试结果并提出优化建议。4.4系统优化与改进根据测试结果对系统进行优化和改进,提升系统性能。第5章研究结果呈现系统实现后的效果,包括功能实现、性能提升等。5.1系统功能实现效果展示系统各功能模块的实现效果,如挂号成功界面等。5.2系统性能提升效果对比优化前后的系统性能
在金融行业中,对信用风险的判断是核心环节之一,其结果对机构的信贷政策和风险控制策略有直接影响。本文将围绕如何借助机器学习方法,尤其是Sklearn工具包,建立用于判断信用状况的预测系统。文中将涵盖逻辑回归、支持向量机等常见方法,并通过实际操作流程进行说明。 一、机器学习基本概念 机器学习属于人工智能的子领域,其基本理念是通过数据自动学习规律,而非依赖人工设定规则。在信贷分析中,该技术可用于挖掘历史数据中的潜在规律,进而对未来的信用表现进行预测。 二、Sklearn工具包概述 Sklearn(Scikit-learn)是Python语言中广泛使用的机器学习模块,提供多种数据处理和建模功能。它简化了数据清洗、特征提取、模型构建、验证与优化等流程,是数据科学项目中的常用工具。 三、逻辑回归模型 逻辑回归是一种常用于分类任务的线性模型,特别适用于二类问题。在信用评估中,该模型可用于判断借款人是否可能违约。其通过逻辑函数将输出映射为0到1之间的概率值,从而表示违约的可能性。 四、支持向量机模型 支持向量机是一种用于监督学习的算法,适用于数据维度高、样本量小的情况。在信用分析中,该方法能够通过寻找最佳分割面,区分违约与非违约客户。通过选用不同核函数,可应对复杂的非线性关系,提升预测精度。 五、数据预处理步骤 在建模前,需对原始数据进行清理与转换,包括处理缺失值、识别异常点、标准化数值、筛选有效特征等。对于信用评分,常见的输入变量包括收入水平、负债比例、信用历史记录、职业稳定性等。预处理有助于减少噪声干扰,增强模型的适应性。 六、模型构建与验证 借助Sklearn,可以将数据集划分为训练集和测试集,并通过交叉验证调整参数以提升模型性能。常用评估指标包括准确率、召回率、F1值以及AUC-ROC曲线。在处理不平衡数据时,更应关注模型的召回率与特异性。 七、集成学习方法 为提升模型预测能力,可采用集成策略,如结合多个模型的预测结果。这有助于降低单一模型的偏差与方差,增强整体预测的稳定性与准确性。 综上,基于机器学习的信用评估系统可通过Sklearn中的多种算法,结合合理的数据处理与模型优化,实现对借款人信用状况的精准判断。在实际应用中,需持续调整模型以适应市场变化,保障预测结果的长期有效性。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值