语言检测

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.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 处理器不会根据您的架构验证字段名称。如果您计划在更新链中稍后重命名或删除字段,这可能很有用。