1.5.5 Tokenizers
Tokenizers
- <fieldType name="text" class="solr.TextField">
- <analyzer type="index">
- <tokenizer class="solr.StandardTokenizerFactory" />
- <filter class="solr.StandardFilterFactory" />
- </analyzer>
- </fieldType>
Tokenizer的工厂类实现了org.apache.solr.analysis.TokenizerFactory.一个TokenizerFactory的create()方法接受一个Reader返回一个TokenStream.在solr创建tokenizer时,它传递一个流对象用于提供文本字段的内容.
通过设置tokenizer的属性可以传递tokenizer的参数.
- <fieldType name="semicolonDelimited" class="solr.TextField">
- <analyzer type="query">
- <tokenizer class="solr.PatternTokenizerFactory" pattern="; " />
- </analyzer>
- </fieldType>
下面描述了一些Tokenizer的工厂类的实现,具体可以参考 http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters
Standard Tokenizer
标准分词器
这个分词器将字段文本分解成tokens,主要处理作为分隔符的空格和标点符号.删除分割符号字符.具有一下异常处理:
- 句号后边没有跟空格的话,将被当作token的一部分,包含互联网域名.
- "@"符号也作为了标准分词器的分割字符,所以email地址不能作为一个单独的token.
注意:这个分词器可以拆分连接字符.
这个分词器支持Unicode standard annex UAX#29单词,以<ALPHANUM>,<NUM>,<SOUTHEAST_ASIAN>,<IDEOGRAPHIC>和<HIRAGANA>这些token类型为边界.
工厂类:solr.StandardTokenizerFactory
参数:
maxTokenLength:(integer 默认255),solr会忽略字符长度超过maxTokenLength的token.
举例:
- <analyzer>
- <tokenizer class="solr.StandardTokenizerFactory" />
- </analyzer>
输入:"Please, email john.doe@foo.com by 03-09, re: m37-xq."
输出:"Please", "email", "john.doe", "foo.com", "by", "03", "09", "re", "m37", "xq"
Classic Tokenizer
经典的分词器
经典分词器包含solr3.1以及以前的标准分词器的相同的行为,但是它不使用Unicode standard annex UAX#29字的绑定规则(标准分词器所使用的规则).这个分词器将字段文本分解成tokens,主要处理作为分隔符的空格和标点符号.删除分割符号字符.具有一下异常处理:
- 句号后边没有跟空格的话,将被当作token的一部分.
- 以连接符拆分字.除非这个字里边有数字.这种情况下token是不拆分的,数字和连接符都会被保存.
- 识别互联网域名和email地址,将它们作为一个token来处理.
工厂类:solr.ClassicTokenizerFactory
参数:maxTokenLength:(integer 默认255),solr会忽略字符长度超过maxTokenLength的token.
举例:
- <analyzer>
- <tokenizer class="solr.ClassicTokenizerFactory" />
- </analyzer>
输入:"Please, email john.doe@foo.com by 03-09, re: m37-xq."
输出:"Please", "email", "john.doe@foo.com", "by", "03-09", "re", "m37-xq"
Keyword Tokenizer
关键词分词器
这个分词器处理整个文本字段作为一个token.
工厂类:solr.KeywordTokenizerFactory
参数:None
举例:
- <analyzer>
- <tokenizer class="solr.KeywordTokenizerFactory" />
- </analyzer>
输入: "Please, email john.doe@foo.com by 03-09, re: m37-xq."
输出: "Please, email john.doe@foo.com by 03-09, re: m37-xq."
Letter Tokenizer
字母分词器
这个分词器从连续字母的字符串中创建tokens.抛弃一切非字母的字符.
工厂类:solr.LetterTokenizerFactory
参数:None
举例:
- <analyzer>
- <tokenizer class="solr.LetterTokenizerFactory" />
- </analyzer>
输入: "I can't."
输出: "I", "can", "t"
Lower Case Tokenizer
小写分词器
这个分词器以分字母字符为界限并且转换字母为小写.空格和非字母字符均被除去.
工厂类:solr.LowerCaseTokenizerFactory
参数:None
举例:
- <analyzer>
- <tokenizer class="solr.LowerCaseTokenizerFactory" />
- </analyzer>
输入: "I just my iPhone!"
输出: "i", "just", "love", "my", "iphone"
N-Gram Tokenizer
n分法分词器
读取字段文本,生成给定范围大小的n-gram tokens.
工厂类:solr.NGramTokenizerFactory
参数:
minGramSize:(integer 默认为1),最小n-gram大小必须>1.
maxGramSize:(integer 默认为2),最大n-gram大小必须>=minGramSize.
举例:
注意:空格字符同样包含在编码中.
- <analyzer>
- <tokenizer class="solr.NGramTokenizerFactory" />
- </analyzer>
输入: "hey man"
输出: "h", "e", "y", " ", "m", "a", "n", "he", "ey", "y ", " m", "ma", "an"
持有n-gram范围大小4-5的例子:
注意:空格字符同样包含在编码中.
- <analyzer>
- <tokenizer class="solr.NGramTokenizerFactory" minGramSize="4" maxGramSize="5" />
- </analyzer>
输入: "bicycle"
输出: "bicy", "bicyc", "icyc", "icycl", "cycl", "cycle", "ycle"
Edge N-Gram Tokenizer
工厂类:solr.EdgeNGramTokenizerFactory
参数:
minGramSize:(integer 默认为1),最小n-gram大小,必须>1.
maxGramSize:(integer 默认为1),最大n-gram大小,必须>=minGramSize.
side:(("front" or "back", 默认为"front"),是否从文本的开头(front)或者末尾(back)计算n-grams.
举例:
默认行为,最大最小默认为1
- <analyzer>
- <tokenizer class="solr.EdgeNGramTokenizerFactory" />
- </analyzer>
输入:"babaloo"
输出: "b"
n-gram范围2-5
- <analyzer>
- <tokenizer class="solr.EdgeNGramTokenizerFactory"
- minGramSize="2" maxGramSize="5" />
- </analyzer>
输入: "babaloo"
输出:"ba", "bab", "baba", "babal"
ICU Tokenizer
这个分词器处理多种语言文本,并基于它的script属性恰当的分词.
可以通过指定per-script rule files来自定义这个分词器的行为.添加每一脚本规则,指定rulefiles属性,应该包含逗号分隔的code:rulefile键值对,采用4字母ISO 15924 script code格式,接着是一个逗号,然后资源路径.举例来说,指定一个Latin(script code "Latn")和Cyrillic(script code "Cyrl")规则.你可以输入Latn:my.Latin.rules.rbbi,Cyrl:my.Cyrillic.rules.rbbi.
工厂类:solr.ICUTokenizerFactory
参数:
rulefile:逗号分隔的code:rulefile键值对,采用4字母ISO 15924 script code格式,接着是一个逗号,然后资源路径.
举例:
- <analyzer>
- <!-- no customization -->
- <tokenizer class="solr.ICUTokenizerFactory" />
- </analyzer>
- <analyzer>
- <tokenizer class="solr.ICUTokenizerFactory"
- rulefiles="Latn:my.Latin.rules.rbbi,Cyrl:my.Cyrillic.rules.rbbi" />
- </analyzer>
Path Hierarchy Tokenizer
层次路径分词器
工厂类:solr.PathHierarchyTokenizerFactory
参数:
delimiter:(字符,没有默认值),你可以指定一个文件路径定界符,然后使用一个你提供的定界符替换它.这在处理反斜杠定界符的时候非常有用.
replace:(字符,没有默认值),在token输出时指定solr使用的定界符.
举例:
- <fieldType name="text_path" class="solr.TextField" positionIncrementGap="100">
- <analyzer>
- <tokenizer class="solr.PathHierarchyTokenizerFactory"
- delimiter="\" replace="/" />
- </analyzer>
- </fieldType>
输入:"c:\usr\local\apache"
输出:"c:", "c:/usr", "c:/usr/local", "c:/usr/local/apache"
Regular Expression Pattern Tokenizer
正则表达式分词器
这个分词器采用java的正则表达式将输入文本流分解成tokens.
参考java文档java.util.regex.Pattern
工厂类:solr.PatternTokenizerFactory
参数:
pattern:(必填),通过java.util.regex.Pattern定义正则表达式.
group:(可选的,默认为-1),指定提取哪个正则表达式组作为tokens.-1的意思意味着这个正则表达式作为定界符来分割字符串为tokens.非负的group表明字符序列匹配正则的组应该转换为token.group 0 关联整个正则,group大于0的关联括号中的正则子表达式,从左到右计算.
举例:
例1:逗号分隔列表,tokens被分隔通过0个或更多的空格,逗号,0个或者更多的空格.
- <analyzer>
- <tokenizer class="solr.PatternTokenizerFactory" pattern="\s*,\s*" />
- </analyzer>
输入:fee,fie, foe , fum, foo"
输出: "fee", "fie", "foe", "fum", "foo"
例2:简单提取,大写单词,至少有一个大写字母,接着着0个或者更多字母(包含大小写)的序列提取出来作为一个token.
- <analyzer>
- <tokenizer class="solr.PatternTokenizerFactory" pattern="\[A-Z\]\[A-Za-z\]"
- group="0" />
- </analyzer>
输入:"Hello. My name is Inigo Montoya. You killed my father. Prepare to die."
输出:"Hello", "My", "Inigo", "Montoya", "You", "Prepare"
例3:提取部分数字,它的前置词是"SKU", "Part" or "Part Number",区分大小写,带有一个可以选择的分号分隔符.数字部分必须是一个数字,可以包含连字符.正则捕获计数从左边括号开始,从左到右计算.第3组就是"[0-9-]+",可以匹配一个或者多个数字或者连字符.
- <analyzer>
- <tokenizer class="solr.PatternTokenizerFactory" pattern="(SKU|Part(\sNumber)?):?\s(\[0-9-\]+)"
- group="3" />
- </analyzer>
输入:"SKU: 1234, Part Number 5678, Part: 126-987"
输出: "1234", "5678", "126-987"
UAX29 URL Email Tokenizer
这个分词器将文本字段分解为tokens,处理空格和标点符号和分隔符.分隔符将被丢弃,具有以下异常:
- 句号:句号后边没有跟空格的话,将被作为一个token.
- 单词被连字符拆分,除非单词中包含数字,在这种情况下,这个token是不会被拆分的,数字和连字符将会一起保存.
- 识别顶级互联网域名,email地址;file://, http(s):// ,ftp:// 地址;IPv4和IPv6地址,将它们保存为一个单独的token.
工厂类:solr.UAX29URLEmailTokenizerFactory
参数:
maxTokenLength:(integer,默认为255),solr忽略token,如果token的长度超过maxTokenLength的值.
举例:
- <analyzer>
- <tokenizer class="solr.UAX29URLEmailTokenizerFactory" />
- </analyzer>
输入: "Visit or e-mail bob.cratchet@accarol.com"
输出:"Visit", "http://accarol.com/contact.htm?from=external&a=10", "or", "email", "bob.cratchet@accarol.com"
White Space Tokenizer
空格分词器
工厂类:solr.WhitespaceTokenizerFactory
参数:None
举例:
- <analyzer>
- <tokenizer class="solr.WhitespaceTokenizerFactory" />
- </analyzer>
输入: "To be, or what?"
输出: "To", "be,", "or", "what?"
Related Topics
1.5.5 Tokenizers的更多相关文章
- 运行nltk示例 Resource u'tokenizers punkt english.pickle' not found解决
nltk安装完毕后,编写如下示例程序并运行,报Resource u'tokenizers/punkt/english.pickle' not found错误 import nltk sentence ...
- 1.5 理解Analyzers,Tokenizers,Filters--目录
这部分介绍了solr如何分解和处理文本数据的,它包含一下主题: 1.5.1 Analyzers,Tokenizers,Filters概述:主要介绍Analyzers,Tokenizers,Filter ...
- nlp任务中的传统分词器和Bert系列伴生的新分词器tokenizers介绍
layout: blog title: Bert系列伴生的新分词器 date: 2020-04-29 09:31:52 tags: 5 categories: nlp mathjax: true ty ...
- 1.5.1 Analyzers,Tokenizers,Filters概述
字段分析器(Analyzers)即用于文档索引也用于查询.一个分析器检查字段的文本,并生成一个token流.分析器可能是一个单独的类,也可能是一系列的tokenizer和filter的组合. 分词器把 ...
- solr5.5教程-Analyzer、Tokenizer、Filter
对于文本,solr在建立索引和搜索的时候需要对其做一定的处理(比如英文要去掉介词.转成小写.单词原形化等,中文要恰当地要分词).这些工作,一般由Analyzers.Tokenizers.和Filter ...
- 自然语言12_Tokenizing Words and Sentences with NLTK
https://www.pythonprogramming.net/tokenizing-words-sentences-nltk-tutorial/ # -*- coding: utf-8 -*- ...
- nltk.download()出错解决
http://blog.csdn.net/joey_su/article/details/17289621 官方下载地址 http://www.nltk.org/nltk_data/ 把python自 ...
- bootstrap3-typeahead 自动补全
很酷的一个自动补全插件 http://twitter.github.io/typeahead.js 在bootstrap中使用typeahead插件,完成自动补全 相关的文档:https://gith ...
- 1.4.2 solr字段类型--(1.4.2.7)字段属性使用案例
1.4.2 solr字段类型 (1.4.2.1) 字段类型定义和字段类型属性. (1.4.2.2) solr附带的字段类型 (1.4.2.3) 使用货币和汇率 (1.4.2.4) 使用Dates(日期 ...
随机推荐
- 转】MyEclipse使用总结——MyEclipse10安装SVN插件
原博文出自于: http://www.cnblogs.com/xdp-gacl/p/3497016.html 感谢! 一.下载SVN插件subclipse 下载地址:http://subclipse. ...
- Servlet 2.4 规范之第一篇:概览
写在前面的话: 本系列是对<Java Servlet Specification Version 2.4>的完全翻译,力争但不保证完美表达出英文原文的思想内涵.如有疏漏之处,还 ...
- Awk中调用shell命令
Awk中调用shell命令 需求 在awk中,有时候需要调用linux系统中命令,如计算字符串的MD5值,并保存下来. 方法参考 call a shell command from inside aw ...
- EntityFramework简单例子
@(编程) 这个例子是用vs2013连接mysql数据库. 1. NuGet安装EF和mysql 略 2. 对象 namespace EFDemo { class Student { public s ...
- C# 运用params修饰符来实现变长参数传递
一般来说,参数个数都是固定的,定义为集群类型的参数可以实现可变数目参数的目的,但是.NET提供了更灵活的机制来实现可变数目参数,这就是使用params修饰符.可变数目参数的好处就是在某些情况下可以方便 ...
- IP报文解析及基于IP 数据包的洪水攻击
版本(4bit) 报头长度(4bit) 优先级和服务类型(8bit) 总长度(16bit) 标识(16bit) 标志(3bit) 分段偏移(13bit) 存活期(8bit) 协议(8bit) 报头校验 ...
- KMP算法及java实现
参考: http://blog.csdn.net/cdnight/article/details/11935387
- 结构类模式(六):享元(Flyweight)
定义 运用共享技术有效的支持大量细粒度的对象. 两个状态 内蕴状态存储在享元内部,不会随环境的改变而有所不同,是可以共享的. 外蕴状态是不可以共享的,它随环境的改变而改变的,因此外蕴状态是由客户端来保 ...
- 结构类模式(五):外观(Facade)
定义 为子系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口使得这一子系统更加容易使用. UML 优点 对客户屏蔽了其子系统组件,因而减少了客户处理对象的数目,并使得子系统实用起来更方便. ...
- 【转】Android-Universal-Image-Loader 图片异步加载类库的使用(超详细配置)
Android-Universal-Image-Loader 原文地址:http://blog.csdn.net/vipzjyno1/article/details/23206387 这个图片异步加载 ...