我有包含阿拉伯文本的 utf-8 编码文件,我必须搜索它。

我的问题是变音符号,如何跳过它们进行搜索?

就像如果您在 Internet Explorer 中加载该文本(当然是在 HTML 中转换文本)一样,IE 会跳过这些变音符号吗?

有什么帮助吗?

编辑1: :搜索只需通过以下代码执行:

 var m1 : TMemo; //contains utf-8 data)
     m2 : TMemo; // contains results

 ...

      m2.lines.BeginUpdate;
      for s in m1.Lines do
      begin
        if pos(eSearch.Text,s)>0 then
           begin
           m2.Lines.Add(s);
           end;
      end;
      m2.Lines.EndUpdate;

编辑2: :unicode 数据示例:

如果您只搜索没有任何变化的字母,则找不到字母。

有帮助吗?

解决方案

我发现变音符号并不是唯一的问题。

我会进行字符替换,用空字符串替换它们,我还会将文本 'Í' 'Í' 'â' 标准化,全部转换为 'ā',并且对 ى æ и ٤ ه 也执行相同操作。 。

对于搜索,我还会使用轻量词干分析器,例如“khoja 词干分析器”(Java 源 这里)

更高级的方法是这样做 特雷克:

  • 删除标点符号
  • 删除变音符号(主要是弱元音) 大部分语料库不包含弱元音。
  • 一些字典条目包含弱元音。这使得一切都一致。
  • 删除非字母
  • 将首字母 Í 或 Í 替换为裸 alif .ā
  • 将 à 替换为 ā
  • 将序列 ى١ 替换为 ٛ
  • 将最后的 ى 替换为 ey
  • 将最后的 É 替换为 ه
  • 去掉 6 个前缀:确定的文章(forking of norker of stropernings)
  • 删除单词末尾的 10 个后缀 সইা ইইা ইসারা সা সা

我将通过修改后的文本对文本进行索引(对于备忘录,我将在原始文本中存储单词的索引),并对搜索查询执行相同的操作。

我还会在 Memo1.Text 中搜索,而不是逐行搜索,搜索可能是位于行末尾并换行到下一行的多个单词。

其他提示

在Vista +你也许可以(我有阿拉伯语没有经验)使用 CompareString 的与选项LINGUISTIC_IGNOREDIACRITIC。

NORM_IGNORENONSPACE还可能有帮助。话又说回来,它可能不会

另外的(但我只是猜测),你可以用的 GetStringTypeEx 和手动删除变音符号。也许你不得不调用 FoldString 或的的MultiByteToWideChar 与标志MAP_COMPOSITE第一

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top