软件世界网 购物 网址 三丰软件 | 小说 美女秀 图库大全 游戏 笑话 | 下载 开发知识库 新闻 开发 图片素材
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
移动开发 架构设计 编程语言 Web前端 互联网
开发杂谈 系统运维 研发管理 数据库 云计算 Android开发资料
  软件世界网 -> 云计算 -> solr入门之拼写纠错深入研究及代码Demo -> 正文阅读
云计算 最新文章
CentOS7上安装Zabbix(快速安装监控工具Zab
十分钟搭建NeuralStyle服务
solr入门之拼写纠错深入研究及代码Demo
3个netty5的例子,简单介绍netty的用法
RedhatOpenshift云平台注册使用
Akka框架——第一节:并发编程简介
Hadoop实战:Linux报tmp磁盘存储不足
linux安装thrift
感觉快更快规划计划高考韩国
solr相似匹配

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

  2016-04-02 21:01:11

昨天粗略的研究了下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

访问链接
http://localhost:8983/solr/meixin_suggest/spell?spellcheck=true&spellcheck.build=true&spellcheck.q=lesht&spellcheck.dictionary=file

这种方式我只能查出来拼音汉字无法进行纠错,不知道具体的原因啊-----------要有高人,还请指点下
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>

搜索不到结果
将其调整到0.8时可以搜索到数据但是仅仅只能出错一个汉字或者两个字母


前面说过这个spell 是按照编辑距离(Edit Distance)来计算的那么这个值就是 设置的一个 编辑距离计算的阀值
底层应该是用了 char类型的来计算  所以会有一个汉字对照两个字母的情况


现在推理的很明确了accuracy的值每下降0.1就可以纠错一个字母,下降0.2可以纠错一个汉字
也就是说 当 accuracy = 0.7时 应该是可以纠错三个字母,一个汉字的(还不能纠错两个汉字)


可以看到汉字是我们料想的对于两个错字不能纠正,但是字母对于三个错字也不能纠正
这是为什么呢??
大家看
maxEdits:最大编辑(容错)距离,即可接受的错字拼写范围,值只能是1或2(因为很少有人会连续打错2个以上的字),缺省是2。
就是因为这个,我们最多只能打错两个字,不论字母还是汉字,但是accuracy理论上设置为0.6就够我们使用了(汉字两个要0.4的容错)
这是accuracy为0.6时成功的图片
好,accuracy参数就研究到这里,更加深入的研究需要我们去看lucene的底层代码了.这个以后在看.

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即输入喷墨一额及时
不会纠正成功,只有三个重复的字,不满足条件

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  
360图书馆 论文大全 母婴/育儿 软件开发资料 网页快照 文字转语音 购物精选 软件 美食菜谱 新闻中心 电影下载 小游戏 Chinese Culture
生肖星座解梦 三沣玩客 拍拍 视频 开发 Android开发 站长 古典小说 网文精选 搜图网 天下美图 中国文化英文 多播视频 装修知识库
2017-1-19 0:04:49
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  软件世界网 --