语言检测

Solr 可以使用 langid UpdateRequestProcessor 在索引期间识别语言并将文本映射到特定于语言的字段。

Solr 支持此功能的三个实现

您可以在此处查看 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 网站上提供。

有关将模型放置在何处的信息,请参阅资源加载

OpenNLP 语言代码

OpenNLPLangDetectUpdateProcessor 会自动将 OpenNLP 模型检测到的 3 字母 ISO 639-3 代码转换为 2 字母 ISO 639-1 代码。

langid 参数

如前所述,langid UpdateRequestProcessor 的两种实现都采用相同的参数。

langid

可选

默认值:true

当为 true 时,启用语言检测。

langid.fl

必需

默认值:无

要由 langid 处理的字段的逗号或空格分隔列表。

langid.langField

必需

默认值:无

指定返回语言代码的字段。

langid.langsField

可选

默认值:无

指定返回语言代码列表的字段。如果您使用 langid.map.individual,则每个检测到的语言都将添加到此字段。

langid.overwrite

可选

默认值:false

指定当 langFieldlangsField 字段已包含值时,是否覆盖其内容。

langid.lcmap

可选

默认值:无

一个空格分隔的列表,指定要应用于检测到的语言的冒号分隔的语言代码映射。

例如,您可以使用此选项将中文、日语和韩语映射到通用的 cjk 代码,并将美国英语和英国英语都映射到单个 en 代码,方法是使用 langid.lcmap=ja:cjk zh:cjk ko:cjk en_GB:en en_US:en

这会影响放入 langFieldlangsField 字段的值,以及使用 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 处理器不会针对您的模式验证字段名称。如果您计划在更新链的稍后阶段重命名或删除字段,这可能很有用。