软件世界网 购物 网址 三丰软件 | 小说 美女秀 图库大全 游戏 笑话 | 下载 开发知识库 新闻 开发 图片素材
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
移动开发 架构设计 编程语言 Web前端 互联网
开发杂谈 系统运维 研发管理 数据库 云计算 Android开发资料
  软件世界网 -> 云计算 -> solr入门之拼写纠错深入研究及代码Demo -> 正文阅读

[云计算]solr入门之拼写纠错深入研究及代码Demo


昨天粗略的研究了下solr自身的拼写纠错功能,效果不是很好,今天继续研究了其中的依靠文件来纠错和主索引纠错的方式
===================
文件加载方式
配置--
  <lst name="spellchecker">
   <str name="classname">solr.FileBasedSpellChecker</str>
   <str name="name">file</str>
   <!--词典文件(solr.home/conf/spellings.txt),为演示先在文件中添加”周杰伦”-->
   <str name="sourceLocation">spellings.txt</str>
   <str name="characterEncoding">UTF-8</str>
   <!--基于spellings.txt文件生成的拼写索引目录-->
   <str name="spellcheckIndexDir">./spellcheckerFile</str>
    <!-- optional elements with defaults-->
    <str name="distanceMeasure">org.apache.lucene.search.spell.LevensteinDistance</str>
    <str name="accuracy">0.5</str>
 </lst>
  <!--spell 查询器 -->
  <requestHandler name="/spell" class="solr.SearchHandler" startup="lazy">  
    <lst name="defaults">  
      <str name="spellcheck.dictionary">file</str> 
      <str name="spellcheck">on</str>  
      <str name="spellcheck.extendedResults">true</str>              
      <str name="spellcheck.collate">true</str>  
      <str name="spellcheck.collateExtendedResults">true</str>
      <str name="spellcheck.count">10</str>      
    </lst> 
    <!--  <lst name="defaults">
          <str name="spellcheck.dictionary">file</str>
          <str name="spellcheck.count">10</str>
      </lst>-->
    <arr name="last-components">  
      <str>spellcheck</str>  
    </arr>  
  </requestHandler>
词典
放置位置:solr.home\meixin_suggest\conf
[img]http://img.blog.csdn.net/20160401183403364?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
访问链接
http://localhost:8983/solr/meixin_suggest/spell?spellcheck=true&spellcheck.build=true&spellcheck.q=lesht&spellcheck.dictionary=file
[img]http://img.blog.csdn.net/20160401183548958?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
这种方式我只能查出来拼音汉字无法进行纠错,不知道具体的原因啊-----------要有高人,还请指点下
2.从索引纠错的方式

DirectSolrSpellChecker


直接使用Solr 索引做拼写建议,从而避免在使用IndexBasedSpellChecker时对拼写索引的重复构建,确保拼写建议总是最新的。
    <!-- 查询分析器,如果不指定的话,默认会使用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>
       <float name="thresholdTokenFrequency">0.0001</float>
    </lst> 
field:拼写建议域,应避免使用过多的语言处理(近义词,提干),通常使用CopyFiled实现
distanceMeasure:匹配的度量标准,internal表示采用编辑距离(Levenshtein)描述匹配程度,编辑距离越小,两个串的相似度越大。
accuracy:因为是共用Solr索引,为避免SpellCheck与正常用户查询冲突而导致性能问题,使用accuracy设置有效建议的临界值,保证冲突发生时对拼写检查的访问频度。
maxEdits:最大编辑(容错)距离,即可接受的错字拼写范围,值只能是1或2(因为很少有人会连续打错2个以上的字),缺省是2。
minPrefix:Terms应该共享的最小字符个数,只有满足条件的Term才会被列入建议范围。
maxInspections:对可能命中的结果进行校验的最大数目,缺省是5条。
minQueryLength:最小查询长度,小于则不触发查询请求,缺省是4。
maxQueryFrequency:约束Term至少应该在N篇文档中出现,才有资格成为建议目标。可以使用百分比(如 .01,1%),或数值(如4)。
thresholdTokenFrequency:Term在文档集中出现的的最少次数,只有满足条件的Term才会列入建议范围。可以使用百分比或绝对数值表示。
Warm: 测试中对已分词(Tokenizer by mmseg4j)的中文域做拼写检查效果并不理想,只有使用原生态的域(type=string)才能出现拼写效果,可这样有违初衷,尤其在使用 copyfield对长文本域(如描述)关联时。如果大家有解决的方法,请告知。

参阅资料


编辑距离http://baike.baidu.com/view/2020247.html
apache-solr-ref-guide-5.3.pdf
编辑距离(Edit Distance),又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。一般来说,编辑距离越小,两个串的相似度越大。
例如将kitten一字转成sitting:
sitten (k→s)
sittin (e→i)
sitting (→g)
一些测试研究
1.accuracy
<float name="accuracy">0.9</float>
[img]http://img.blog.csdn.net/20160401183751521?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
搜索不到结果
将其调整到0.8时可以搜索到数据但是仅仅只能出错一个汉字或者两个字母
[img]http://img.blog.csdn.net/20160401183820147?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
[img]http://img.blog.csdn.net/20160401183835350?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
前面说过这个spell 是按照编辑距离(Edit Distance)来计算的那么这个值就是 设置的一个 编辑距离计算的阀值
底层应该是用了 char类型的来计算  所以会有一个汉字对照两个字母的情况


现在推理的很明确了accuracy的值每下降0.1就可以纠错一个字母,下降0.2可以纠错一个汉字
也就是说 当 accuracy = 0.7时 应该是可以纠错三个字母,一个汉字的(还不能纠错两个汉字)
[img]http://img.blog.csdn.net/20160401183959069?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
[img]http://img.blog.csdn.net/20160401184010507?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
可以看到汉字是我们料想的对于两个错字不能纠正,但是字母对于三个错字也不能纠正
这是为什么呢??
大家看
maxEdits:最大编辑(容错)距离,即可接受的错字拼写范围,值只能是1或2(因为很少有人会连续打错2个以上的字),缺省是2。
就是因为这个,我们最多只能打错两个字,不论字母还是汉字,但是accuracy理论上设置为0.6就够我们使用了(汉字两个要0.4的容错)
这是accuracy为0.6时成功的图片
好,accuracy参数就研究到这里,更加深入的研究需要我们去看lucene的底层代码了.这个以后在看.
[img]http://img.blog.csdn.net/20160401184049397?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
2.maxEdits
这个上面一个参数时已经研究过了,不在描述了
只能取1或者2
3.minPrefix:Terms应该共享的最小字符个数,只有满足条件的Term才会被列入建议范围。
这个也很好理解,就是最小的重合字符要满足要求
   <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">4</int> 
       <int name="maxInspections">5</int> 
       <int name="minQueryLength">2</int> 
       <float name="maxQueryFrequency">0.01</float>
       <float name="thresholdTokenFrequency">0.0001</float>
    </lst>
根据前三个参数的经验,我们输入两个错字应该可以被纠正,但是 我们设置了minprefix为4即输入喷墨一额及时
不会纠正成功,只有三个重复的字,不满足条件
[img]http://img.blog.csdn.net/20160401184304242?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
4   下面这几个很好理解,不在研究了 
maxInspections:对可能命中的结果进行校验的最大数目,缺省是5条。
minQueryLength:最小查询长度,小于则不触发查询请求,缺省是4。
maxQueryFrequency:约束Term至少应该在N篇文档中出现,才有资格成为建议目标。可以使用百分比(如 .01,1%),或数值(如4)。
thresholdTokenFrequency:Term在文档集中出现的的最少次数,只有满足条件的Term才会列入建议范围。可以使用百分比或绝对数值表示。
使用solrj来操作spell,进行纠错 DEMO
    /**
     * 
     * @描述:获取纠错词语
     * @return
     * @return List<String>
     * @exception
     * @createTime:2016年4月1日
     * @author: songqinghu
     * @throws IOException 
     * @throws SolrServerException 
     */
    private static List<String> getSpellCheck(SolrClient solrClient) throws SolrServerException, IOException{

        //应该先进行正规的查询如果查询不到(结果为0)那么就继续进行词语纠错查询,还查询不到,返回null

        SolrQuery query = new SolrQuery();

        query.set(CommonParams.QT, "/spell");

        query.set(CommonParams.Q, "suggest:安全膜");

        QueryResponse response = solrClient.query(query);

        SpellCheckResponse checkResponse = response.getSpellCheckResponse();

        List<Suggestion> suggestions = checkResponse.getSuggestions();

        List<String> result = new  ArrayList<String>();
        for (Suggestion suggestion : suggestions) {
            //int numFound = suggestion.getNumFound();
            //System.out.println(numFound);
            List<String> alternatives = suggestion.getAlternatives();
            for (String string : alternatives) {
                result.add(string);
            }
        }
        int numFound = result.size();//纠错词个数
        boolean correctlySpelled = checkResponse.isCorrectlySpelled();//这个没啥意义
        System.out.println(correctlySpelled);

        List<Collation> collatedResults = checkResponse.getCollatedResults();//这里也没啥意义
        for (Collation collation : collatedResults) {
           System.out.println(collation.getCollationQueryString()); 
        }

        return result;
    }

......显示全文...
    点击查看全文


上一篇文章           查看所有文章
2016-04-02 21:00:55  
云计算 最新文章
CentOS7上安装Zabbix(快速安装监控工具Zab
十分钟搭建NeuralStyle服务
solr入门之拼写纠错深入研究及代码Demo
3个netty5的例子,简单介绍netty的用法
RedhatOpenshift云平台注册使用
Akka框架——第一节:并发编程简介
Hadoop实战:Linux报tmp磁盘存储不足
linux安装thrift
感觉快更快规划计划高考韩国
solr相似匹配
360图书馆 软件开发资料 文字转语音 购物精选 软件下载 美食菜谱 新闻资讯 电影视频 小游戏 Chinese Culture 股票 租车
生肖星座 三丰软件 视频 开发 短信 中国文化 网文精选 搜图网 美图 阅读网 多播 租车 短信 看图 日历 万年历 2017年11日历
2017-11-18 23:57:55
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  软件世界网 --