4

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

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

就像您在 Internet Explorer 中加载该文本(当然,在 HTML 中转换文本),IE 正在跳过那些变音符号?

有什么帮助吗?

Edit1:搜索只需通过以下代码执行:

 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;

Edit2:unicode 数据示例:

قُلْ هُوَ اللَّهُ أَحَدٌ 如果您只搜索没有变音符号قل的字母,则不会找到قُلْ这个词。

4

2 回答 2

5

在 Vista+ 上,您可能(我对阿拉伯语没有经验)将CompareString与选项 LINGUISTIC_IGNOREDIACRITIC 一起使用。

NORM_IGNORENONSPACE 也可能有所帮助。再说一次,它可能不会

或者(但我只是猜测)您可以使用GetStringTypeEx解析您的字符串并手动删除变音符号。可能您必须首先使用标志 MAP_COMPOSITE调用FoldStringMultiByteToWideChar 。

于 2009-04-09T06:08:55.427 回答
2

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

我会做字符替换,用空字符串替换它们,我也会规范化文本 'أ' 'إ' 'آ' 都转换为 'ا',对于 ى ئ ي ؤ و ة ه .. .

对于搜索,我还会使用像“khoja stemmer”这样的轻型词干分析器(此处为 Java 源代码)

更高级的方法是像TREC那样做:

  • 删除标点符号
  • 删除变音符号(主要是弱元音) 大部分语料库不包含弱元音。
  • 一些字典条目包含弱元音。这使得一切都保持一致。
  • 去掉非字母
  • 将首字母 إ 或 أ 替换为 alif .ا
  • 将 آ 替换为 ا
  • 将 ىء 替换为 ئ
  • 将最后的ى替换为ي
  • 将最后的 ة 替换为 ه
  • 去掉 6 个前缀:定冠词 (فال آال، بال، وال، ال، ) 和 و (and) 从规范化词的开头
  • 去掉 ات ان، ها،ي ة، ه، ية، يه، ين، ون 词尾的 10 个后缀

我会通过这个修改过的文本来索引文本(对于备忘录,我会将单词的索引存储在原始文本中),并对搜索查询做同样的事情。

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

于 2009-05-23T22:59:46.580 回答