语言检测
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.fl
中指定的字段不同的、用于langid.map.individual
的逗号分隔字段列表。 langid.fallback
-
可选
默认值:无
如果未在
langid.fallbackFields
中检测到或指定语言,则指定要使用的语言代码。 langid.fallbackFields
-
可选
默认值:无
如果没有检测到符合
langid.threshold
分数的语言,或者检测到的语言不在langid.allowlist
中,则此字段指定要作为备用值使用的语言代码。如果没有找到合适的备用语言,Solr 将使用
langid.fallback
中指定的语言代码。 langid.map.lcmap
-
可选
默认值:无
用空格分隔的列表,指定在映射字段名称时要使用的冒号分隔的语言代码映射。
例如,您可以使用此列表使中文、日语和韩语语言字段使用通用的
*_cjk
后缀,并通过使用langid.map.lcmap=ja:cjk zh:cjk ko:cjk en_GB:en en_US:en
将美式英语和英式英语字段映射到单个*_en
。使用此参数定义的列表将覆盖使用
langid.lcmap
设置的任何配置。 langid.map.pattern
-
可选
默认值:
<field>_<language>
默认情况下,字段映射为
<field>_<language>
。要更改此模式,您可以在此参数中指定 Java 正则表达式。 langid.map.replace
-
可选
默认值:
<field>_<language>
默认情况下,字段映射为
<field>_<language>
。要更改此模式,您可以在此参数中指定 Java 替换。 langid.enforceSchema
-
可选
默认值:
true
如果为
false
,则langid
处理器不会根据您的架构验证字段名称。如果您计划在更新链中稍后重命名或删除字段,这可能很有用。