语言检测
Solr 可以使用 langid
UpdateRequestProcessor 在索引期间识别语言并将文本映射到特定于语言的字段。
Solr 支持此功能的三个实现
-
Tika 的语言检测功能:https://tika.apache.org/1.28.5/detection.html
-
LangDetect 语言检测:https://github.com/shuyo/language-detection
-
OpenNLP 语言检测:http://opennlp.apache.org/docs/1.9.4/manual/opennlp.html#tools.langdetect
您可以在此处查看 Tika 和 LangDetect 实现之间的比较:http://blog.mikemccandless.com/2011/10/accuracy-and-performance-of-googles.html。一般来说,LangDetect 实现支持更多语言,性能更高。
有关这些语言识别实现的具体信息,包括每种实现支持的语言列表,请参阅相关的项目网站。
有关 Solr 中语言分析的更多信息,请参阅语言分析。
模块
这是通过 langid
Solr 模块提供的,在使用前需要启用。
配置语言检测
您可以在 solrconfig.xml
中配置 langid
UpdateRequestProcessor。两种实现都采用相同的参数,这些参数将在以下部分中描述。至少,您必须指定用于语言识别的字段和用于结果语言代码的字段。
配置 Tika 语言检测
以下是 solrconfig.xml
中最小的 Tika langid
配置示例
<processor class="org.apache.solr.update.processor.TikaLanguageIdentifierUpdateProcessorFactory">
<lst name="defaults">
<str name="langid.fl">title,subject,text,keywords</str>
<str name="langid.langField">language_s</str>
</lst>
</processor>
配置 LangDetect 语言检测
以下是 solrconfig.xml
中最小的 LangDetect langid
配置示例
<processor class="org.apache.solr.update.processor.LangDetectLanguageIdentifierUpdateProcessorFactory">
<lst name="defaults">
<str name="langid.fl">title,subject,text,keywords</str>
<str name="langid.langField">language_s</str>
</lst>
</processor>
配置 OpenNLP 语言检测
以下是 solrconfig.xml
中最小的 OpenNLP langid
配置示例
<processor class="org.apache.solr.update.processor.OpenNLPLangDetectUpdateProcessorFactory">
<lst name="defaults">
<str name="langid.fl">title,subject,text,keywords</str>
<str name="langid.langField">language_s</str>
<str name="langid.model">langdetect-183.bin</str>
</lst>
</processor>
OpenNLP 特有参数
langid.model
-
必需
默认值:无
一个 OpenNLP 语言检测模型。
OpenNLP 项目在 OpenNLP 网站的模型下载页面上提供了一个预先训练的 103 种语言模型。模型训练说明在 OpenNLP 网站上提供。
有关将模型放置在何处的信息,请参阅资源加载。
langid 参数
如前所述,langid
UpdateRequestProcessor 的两种实现都采用相同的参数。
langid
-
可选
默认值:
true
当为
true
时,启用语言检测。 langid.fl
-
必需
默认值:无
要由
langid
处理的字段的逗号或空格分隔列表。 langid.langField
-
必需
默认值:无
指定返回语言代码的字段。
langid.langsField
-
可选
默认值:无
指定返回语言代码列表的字段。如果您使用
langid.map.individual
,则每个检测到的语言都将添加到此字段。 langid.overwrite
-
可选
默认值:
false
指定当
langField
和langsField
字段已包含值时,是否覆盖其内容。 langid.lcmap
-
可选
默认值:无
一个空格分隔的列表,指定要应用于检测到的语言的冒号分隔的语言代码映射。
例如,您可以使用此选项将中文、日语和韩语映射到通用的
cjk
代码,并将美国英语和英国英语都映射到单个en
代码,方法是使用langid.lcmap=ja:cjk zh:cjk ko:cjk en_GB:en en_US:en
。这会影响放入
langField
和langsField
字段的值,以及使用langid.map
时的字段后缀,除非被langid.map.lcmap
覆盖。 langid.threshold
-
可选
默认值:
0.5
指定一个介于 0 和 1 之间的阈值,语言识别分数必须达到此阈值,
langid
才会接受该语言。对于较长的文本字段,较高的阈值(例如
0.8
)会产生良好的结果。对于较短的文本字段,您可能需要降低语言识别的阈值,但您将承担结果质量略低的风险。我们建议您使用您的数据进行实验以调整结果。 langid.allowlist
-
可选
默认值:无
指定允许的语言识别代码列表。将此选项与
langid.map
结合使用,以确保您仅将文档索引到模式中存在的字段中。 langid.map
-
可选
默认值:
false
启用字段名称映射。如果为
true
,Solr 将为langid.fl
中列出的所有字段映射字段名称。 langid.map.fl
-
可选
默认值:无
一个逗号分隔的
langid.map
字段列表,与langid.fl
中指定的字段不同。 langid.map.keepOrig
-
可选
默认值:
false
如果为
true
,Solr 将在字段名称映射过程中复制该字段,保留原始字段。 langid.map.individual
-
可选
默认值:
false
如果为
true
,Solr 将分别检测和映射每个字段的语言。 langid.map.individual.fl
-
可选
默认值:无
一个逗号分隔的字段列表,用于
langid.map.individual
,与langid.fl
中指定的字段不同。 langid.fallback
-
可选
默认值:无
指定在没有检测到语言或在
langid.fallbackFields
中未指定语言时要使用的语言代码。 langid.fallbackFields
-
可选
默认值:无
如果没有检测到满足
langid.threshold
分数的语言,或者检测到的语言不在langid.allowlist
上,则此字段指定要用作回退值的语言代码。如果未找到合适的回退语言,Solr 将使用
langid.fallback
中指定的语言代码。 langid.map.lcmap
-
可选
默认值:无
一个空格分隔的列表,指定在映射字段名称时要使用的冒号分隔的语言代码映射。
例如,您可以使用此选项使中文、日语和韩语字段使用通用的
*_cjk
后缀,并将美国英语和英国英语字段都映射到单个*_en
,方法是使用langid.map.lcmap=ja:cjk zh:cjk ko:cjk en_GB:en en_US:en
。使用此参数定义的列表将覆盖使用
langid.lcmap
设置的任何配置。 langid.map.pattern
-
可选
默认值:
<field>_<language>
默认情况下,字段映射为
<field>_<language>
。要更改此模式,您可以在此参数中指定 Java 正则表达式。 langid.map.replace
-
可选
默认值:
<field>_<language>
默认情况下,字段映射为
<field>_<language>
。要更改此模式,您可以在此参数中指定 Java 替换。 langid.enforceSchema
-
可选
默认值:
true
如果为
false
,则langid
处理器不会针对您的模式验证字段名称。如果您计划在更新链的稍后阶段重命名或删除字段,这可能很有用。