Encoding 从UTF8缓冲区检测单词边界和每个单词的语言

Encoding 从UTF8缓冲区检测单词边界和每个单词的语言,encoding,utf-8,internationalization,icu,Encoding,Utf 8,Internationalization,Icu,我正在开发一个自定义搜索引擎,我需要将每个单词传递给相应的特定于语言的词干分析器 我最近发现了Compact Language Detector(CLD),它为UTF8缓冲区提供了令人印象深刻的语言检测 虽然CLD对于检测给定缓冲区的语言非常有用,但我需要从缓冲区中提取单词边界,并为这些单词检测每个单词的语言 有什么想法吗?我已经开发了一个使用ICU的语言检测引擎,它基本上可以完成以下功能: 使用ICU和英语()规则发现基本的“单词” 将#1中的单词输入到我的引擎中,引擎会根据分数为我提供“真实

我正在开发一个自定义搜索引擎,我需要将每个单词传递给相应的特定于语言的词干分析器

我最近发现了Compact Language Detector(CLD),它为UTF8缓冲区提供了令人印象深刻的语言检测

虽然CLD对于检测给定缓冲区的语言非常有用,但我需要从缓冲区中提取单词边界,并为这些单词检测每个单词的语言


有什么想法吗?

我已经开发了一个使用ICU的语言检测引擎,它基本上可以完成以下功能:

  • 使用ICU和英语()规则发现基本的“单词”
  • 将#1中的单词输入到我的引擎中,引擎会根据分数为我提供“真实”语言
  • 因为你的目的是输入UTF-8,你可以使用这个方法,使用A*(注意这里链接的例子,它几乎就是你需要的——尽管,你可能想使用C++ API),它可以被设置为遍历UTF-8。

    < P>好运:< /P> 老实说,这是一个高级NLP主题,很难可靠地做到

    第一件事是,在许多语言中,你不能像那样检测单词边界。尤其是在表意语言(汉语、日语等)中,您需要训练有素的标记化学习算法。
    有传言说有人这样做了(请参阅Basis Technology),但只有在您能够支付许可证费用的情况下,这才对您有用

    顺便说一句,许多单词在少数几种语言中可以完全相同,你无法对它们进行可靠的语言检测。更糟糕的是,该算法(通常是基于n-gram的检测器)需要几个八位字节来检测任何东西(对或错)


    正如我说的,祝你好运。如果我是你,我会重新考虑我的策略;)

    带有
    \b
    特殊字符的正则表达式。BreakIterator的问题是,它不能正确使用亚洲语言,这在其文档中有明确说明。另外,ICU的语言检测可靠性比预期的要差一点(根据我的研究,不幸的是我不能分享)。我错过了你的帖子。我在上面发布的答案作为“单词”提取的预处理步骤非常有效,可以提供给语言检测器(在我的例子中,我使用的是n-gram引擎)。至于解析CJK的边界,它非常非常复杂:)Dyda:你有Lucene方面的经验吗?我注意到Lucene有一个用于多语言文本的内置BreakIterator,称为CompositeBreakIterator。它可靠吗?@Manoj:老实说,我自己还没有玩过apachelucene。我所知道的就是你需要规范化你输入的文本,否则你会得到不可预知的结果。此外,我们的一个团队对搜索可靠性提出了担忧,但我不能说它是否有效——需要进行一些认真的研究。@PawełDyda我为devenagari脚本编写了一个简单的语言检测器。其思想是只接受
    UTF8
    编码数据,迭代每个字符并解码以获得代码点。将代码点与unicode字符范围匹配,并确定它所属的语言范围。在迭代时,我忽略了连接符和非连接符。如果所有字符都在同一语言范围内,则报告语言。当我们得到一个在不同范围内的代码点时,迭代就停止了。到目前为止,这种方法效果良好。我在想,这个方法能用于所有非devanagari语言吗?@Appu:我发现两个问题:1。如果您有混合脚本环境,即您在使用Devanagari脚本编写的句子中有英语单词(拉丁语脚本),该怎么办?我相信这种事一直都在发生。2.一些代码范围碰巧用一种以上的语言,例如字母“ą”(a和ogonek)可以用波兰语和立陶宛语;大多数西里尔文字可以用在俄语、白俄罗斯语、乌克兰语、保加利亚语、马其顿语、塞尔维亚语甚至蒙古语中(还有其他一些)。如果没有统计语言配置文件=n-grams,则无法匹配语言。