热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:Solr文本分析剖析文本分析分词器详解自定义文本分析字段及分词器

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Solr文本分析剖析文本分析分词器详解自定义文本分析字段及分词器相关的知识,希望对你有一定的参考价值。 一.概述  Solr文本分析消除了索引词项与用

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Solr文本分析剖析文本分析分词器详解自定义文本分析字段及分词器相关的知识,希望对你有一定的参考价值。



一.概述

  Solr文本分析消除了索引词项与用户搜索词项之间的语言差异,让用户在搜索buying a new house时能找到类似的内容,例如:purchasing a new home这样的文档。如果搭配恰当,文本分析就能允许用户使用自然语言进行搜索,而无需考虑搜索词项的所有可能形式。毕竟谁也不想看到为了相似搜索而构造这样的查询表达式:buying house OR purchase home OR buying a home OR purchasing a house ...。

  用户可以使用自然语言来搜索他们需要的重要的信息,这是提供良好搜索体验的基础。鉴于Google或百度等搜索引擎的广泛使用,用户往往会期望搜索引擎非常智能,而搜索引擎的智能化就是从优秀的文本分析开始的。文本分析不仅用于消除词项之间的表面差异,还用来解决更复杂的问题,例如:特定语种解析、部分词性标注与词性还原等。

  Solr包含一个文本分析可扩展框架,可以移除常见词汇【也就是停用词】,以及执行其他更复杂的文本分析任务。Solr文本分析框架提供了强大的功能与灵活的扩展性,但对于初学者来说,这个框架过于复杂,使人望而却步。这就是我们说的事物具有两面性,Solr有可能解决非常复杂的文本分析问题,但也可能使原来非常简单的分析任务变的很麻烦。Solr在schema.xml文件中预置了许多字段类型,用于确保初学者在接触开箱即用的Solr时,能较容易地开始使用文本分析。


二.微博案例分析

  当我们要设计与实现一个大众社交媒体网站【类似微博、Twitter】的微博内容搜索解决方案。因为要聚焦到微博的内容,这将重点聚焦到文本分析,所以先了解微博文档的文本字段。一下是打算分析的文本。

  elasticsearch and Solr is highly reliable, scalable and fault tolerant, providing distributed indexing, replication and load-balanced querying, automated failover and recovery, centralized configuration and more. Solr powers the search and navigation features of many of the world‘s largest internet sites.

  正如上面所述,文本分析的主要目标是让用户使用自然语言进行搜索,无须考虑词项的所有可能的表达形式。当用户想搜索solr index时,这是一个自然语言查询,用户期望找到包含solr和index的数据,这只会精确匹配,上面的indexing就匹配不上。下面是分词器的分词结果:

  技术图片

  因此,摆在我们面前的任务是,使用solr文本分析框架将微博文本转换为一种易于寻找的形式。


三.基础文本分析

  schema.xml的部分使用元素定义了文档中所有可能的字段,每个定义了字段的格式,以及在索引与查询中该字段如何进行分析。上面使用的分词器就是solr自带的text_general字段类型进行的分词,这是一种较为简单的字段类型,如下:



<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />

<filter class="solr.LowerCaseFilterFactory"/>
analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
analyzer>
fieldType>

  1.分析器

    在元素中至少定义一个,以确定如何分析文本。常见的做法是定义两个单独的元素,一个用于分析索引时的文本,一个用于分析用户搜索时输入的文本【如上面的text_general】。对于为什么使用两个而不是共用一个,很明显,对于索引文档和查询处理进行文本分析,后者往往需要进行更多的分析。例如,查询的文本分析中通常会添加同义词,而索引的文本分析不会这样做,因为同义词会增大索引体积。因此,这样处理一般放在查询处理中。

    虽然定义两个单独的分析器,但查询词项的分析器必须兼容索引时的文本分析方法【例如,必须使用相同的分词器,不同分词器分相同的文本,分出的词可能不同,这会导致无法查询】。

  2.分词器

    在Solr中,每个将文本分析过程分为两个阶段:词语切分和词语过滤。严格来说,还有第三个阶段,即词语切分之前的预处理阶段,这个阶段可以使用字符过滤器。在词语切分阶段,文本会以各种解析形式被拆分为词元流。WhitespaceTokenizer是最基本的分词器,仅使用空格拆分文本。StandardTokenizer则更常见,它使用空格和标点符号拆分出词项,而且可用于处理网址、电子邮件和缩写词。分词器的定义需要指定Java实现的工厂类。要使用常见的StandardTokenizer,需要指定分词器的类为solr.StandardTokenizerFactory,参考上面的text_general字段。

    在Solr中,因为大多数分词器需要提供参数构造器,所以必须指定为工厂类,而不是底层的分词器实现类。通过使用工厂方法,Solr提供了在XML中定义分词器的标准做法。在后台,每个工厂类知道如何将XML配置属性翻译为构造特定分词器实现类的一个实例。所有分词器会生成词元流,可以使用过滤器进行处理,执行词元的某种转换。

  3.分词过滤器

    分词过滤器对词元执行以下三种操作中的一种:

      1.词元转换

        改变词元的形式,例如,所有字母小写或词干提取。

      2.词元注入

        向词元流中添加一个词元,例如,同义词过滤器的做法。

      3.词元移除

        删除不需要的词元,例如,停用词过滤器的做法。

      过滤器可以同时使用,对词元进行一系列的转换处理。过滤器的顺序很重要,排在前面的过滤器会先起作用。

  4.StandardTokenizer

    

    文本分析的第一步是确定如何使用分词器将文本解析为词元流。从StandardTokenizer的使用开始,这个分词器是许多Solr和Lucene项目的首选解决方案,这个分词器使用空格和标点符号来拆分文本。下面我们通过案例来看看这个分词器的作用:

    技术图片

    备注:ST代表StandardTokenizer标准分词器,SF代表StopFilterFactory停止词过滤器,LCF代表LowerCaseFilterFactory转换小写过滤器。

  5.StopFilterFactory

    

    Solr进行文本分析时会使用停止词过滤器移除词元流中的停用词,这些停用词对用户查找相关文档几乎没有价值。在索引时移除停用词会有效减少索引大小,提供搜索性能。这样做减少了Solr将要处理的文档数据数量,也减少了对包含停用词的查询进行相关度计算时的词项数量。

    停用词过滤器默认指定了一个英语停用词列表【words="stopwords.txt"】。Solr开箱即用,它提供了基础的停用词列表,在此基础上可以根据需求 自定义停用词。一般而言,停止词移除具有语言专属性。不同的语言,停止词一般不同,如果分析德语,就需要一个包含die、ein这样词项的停用词列表。Solr提供多种语言的停用词列表定制文件,它们位于Solr各个内核的conf/lang/目录下。

  技术图片

  注意:在新版本的solr中,没有使用lang/目录下的停止词配置文件,而是直接使用的当前目录下的stopwords.txt,且其中默认没有配置任何停止词!

  6.LowerCaseFilterFactory

    LCF将词元的所有字母转换为小写,这样一来,词元的大小写就不会对索引和搜索产生干扰。

    

    与停用词的情况类似,是否需要对所有词项使用小写转换过滤器有时并不好判断。举例来说,一句话中间的单词首字母大写通常表示一个专有名词。如果用户按照专有名词格式进行搜索,搜索结果的准确性就会有所提升。但对于习惯都是小写搜索的用户来说,这样就不太友好。因此,是否使用停止词要看是看中准确性还是适应性。


四.自定义文本分析字段

  由于Solr预定义的字段类型无法满足我们的所有需求,因此通过综合使用其它Solr内置文本分析工具来解决这些问题。因此,我们在schema.xml中定义一个新字段类型。在managed-schema.xml的元素下增加text_microblog字段,代码如下:


<fieldType name="text_microblog" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="([a-zA-Z])1+" replacement="$1$1"/>
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" splitOnCaseChange="0"
splitOnNumerics
="0"
stemEnglishPossessive
="1"
preserveOriginal
="0"
catenateWords
="1"
generateNumberParts
="1"
catenateNumbers
="0"
catenateAll
="0"
types
="wdfftypes.txt"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.ASCIIFoldingFilterFactory"/>
<filter class="solr.KStemFilterFactory"/>
analyzer>
<analyzer type="query">
<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="([a-zA-Z])1+" replacement="$1$1"/>
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" splitOnCaseChange="0"
splitOnNumerics
="0"
stemEnglishPossessive
="1"
preserveOriginal
="0"
catenateWords
="1"
generateNumberParts
="1"
catenateNumbers
="0"
catenateAll
="0"
types
="wdfftypes.txt"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.ASCIIFoldingFilterFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.KStemFilterFactory"/>
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
analyzer>
fieldType>

  备注:

  技术图片

  1.PatternReplaceCharFilterFactory

    在Solr中,传入的字符流在分词处理之前,字符过滤器对其进行预处理。与分词过滤器类似,CharFilters作为过滤链的一环,可以对文本字符进行添加、修改和移除。Solr三个常用的CharFilters如下:

    1.1 solr.MappingCharFilterFactory:使用外部配置文件进行字符替换。

    1.2 solr.PatternReplaceCharFilterFactory:使用正则表达式进行字符替换。

    1.3 solr.htmlStripCharFilterFactory:从文本中去除HTML标记。

  2.WordDelimiterFilterFactory

    该过滤器在更高层面上使用各种解析规则,将分词单元变为子词【subwords】。在上面定义的自定义文本分析字段中可知,该过滤器需配置wdfftypes.txt配置文件,这个文件需要自己创建,里面的内容需要根据实际情况进行填写,此处内容为:

    技术图片

    这些设置将-映射到ALPHA类,这意味着WordDelimiterFilter实例就不会把它们作为分隔符。效果如下:

    技术图片

    WordDelimiterFilterFactory的配置选项及解释如下:

    技术图片

  3.ASCIIFoldingFilterFactory移除变音符号

    ,最好在小写过滤器之后使用此过滤器,这样只需处理小写字符。ASCIIFoldingFilter仅适用于拉丁字符,其它语种请使用solr.analusis.ICUFoldingFilterFactory,这个工厂方法在Solr3.1之后的版本可用。

  4.KStemFilterFactory提取词干

    词干提取根据特定语言规则,将词转换为基础词形。Solr提供了许多词干提取过滤器,每种各有优缺点。KStemFilterFactory与PorterStemmer等其它流行的词干提取器相比,这个词干提取器的转换并不是那么激进。这里使用是为了对indexing和querying等这样的词项移除ing。

  5.SynonymFilterFactory同义词

    在大多数情况下,同义词的添加只用于查询阶段的分析。这样做有助于减少索引的大小,同义词列表的变更维护也更容易一点。另外,还要考虑其在过滤器链中所处的位置,通常最有用的做法是,将这个过滤器作为查询分析器的最后一个,以便使同义词列表可以认为分词单元上的所有其他转换都已经做完。


五.高级文本分析【自定义分词器】

  1.高级字段属性

    技术图片

    技术图片

  2.使用Solr插件扩展文本分析

    2.1自定义TokenFilter类

      技术图片

 

    2.2自定义TokenFilterFactory类

      技术图片

    技术图片

    备注:要想使用自定义分词器,必须把对应的程序打包上传到solr中,并在对应core的solrconfig.xml中指定配置!


推荐阅读
  • 本文介绍了iOS开发中检测和解决内存泄漏的方法,包括静态分析、使用instruments检查内存泄漏以及代码测试等。同时还介绍了最能挣钱的行业,包括互联网行业、娱乐行业、教育行业、智能行业和老年服务行业,并提供了选行业的技巧。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • 本文由编程笔记#小编整理,主要介绍了关于数论相关的知识,包括数论的算法和百度百科的链接。文章还介绍了欧几里得算法、辗转相除法、gcd、lcm和扩展欧几里得算法的使用方法。此外,文章还提到了数论在求解不定方程、模线性方程和乘法逆元方面的应用。摘要长度:184字。 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • 一次上线事故,30岁+的程序员踩坑经验之谈
    本文主要介绍了一位30岁+的程序员在一次上线事故中踩坑的经验之谈。文章提到了在双十一活动期间,作为一个在线医疗项目,他们进行了优惠折扣活动的升级改造。然而,在上线前的最后一天,由于大量数据请求,导致部分接口出现问题。作者通过部署两台opentsdb来解决问题,但读数据的opentsdb仍然经常假死。作者只能查询最近24小时的数据。这次事故给他带来了很多教训和经验。 ... [详细]
  • Sleuth+zipkin链路追踪SpringCloud微服务的解决方案
    在庞大的微服务群中,随着业务扩展,微服务个数增多,系统调用链路复杂化。Sleuth+zipkin是解决SpringCloud微服务定位和追踪的方案。通过TraceId将不同服务调用的日志串联起来,实现请求链路跟踪。通过Feign调用和Request传递TraceId,将整个调用链路的服务日志归组合并,提供定位和追踪的功能。 ... [详细]
author-avatar
逝水无痕--
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有