我正在构建一个语言分析程序我有一个程序可以计算文本中的单词并给出文本中每个单词的比率作为输出,但是该程序无法处理包含乌尔都语文本的文件。我怎样才能让它工作
1 回答
编码
乌尔都语可能以两种形式呈现:Unicode 和 Code Page 868。这对您来说很方便,因为这两个范围不重叠。这很不方便,因为 Unicode 代码范围是 U+0600 – U+06FF,这意味着编码是一个问题:
- CP-868 会将每一个编码为 128–252 范围内的单字节值
- UTF-8 将每一个编码为一个两字节的序列,其中包含位
110x xxxx
和10xx xxxx
- UTF-16 将每个字符编码为两字节实体
- UTF-32 将每个字符编码为四字节实体
这意味着您应该注意编码问题,并且为了过上轻松的生活,请在内部使用 UTF-16 ( std::u16string
),并接受文件作为(默认)UTF-8 / CP-868,或者如果有一个 BOM 表明这样的。
您的另一个选择是简单地要求所有输入为 UTF-8 / CP-868。
¹ AFAIK。可能还有其他存储乌尔都语文本的方法。
三种形式。请参阅下面的评论。
分词
如你所知,一个词的结尾通常用特殊的字母形式来标记。
因此,您所需要的只是一个词尾字母表,其中列出了 CP-868 范围和 Unicode 阿拉伯文本范围中的字母。
然后,每次您在该表中找到一个空格或一个字母时,您就知道您找到了一个单词的结尾。
直方图
当您阅读单词时,将它们存储在直方图中。对于 C++,amap <u16string, size_t>
就可以了。每个单词的实际内容无关紧要。
之后,您就拥有了打印有关文本的统计信息所需的所有信息。
编辑
上面介绍的方法旨在以一些正确性为代价简单。例如,如果您正在为工作场所做某事,并且假设它很重要,您还应该考虑:
规范化词形
例如,同一个词可能会以标准的阿拉伯文本代码或使用乌尔都语特定的代码呈现。如果您不转换为乌尔都语等效字符,那么您将有两个应该比较相等但不相等的单词。
使用内部一致的东西。我推荐 UZT,因为它是最完整的乌尔都语文本表示。您还需要从 UZT 表示中额外查找原始文本表示。
字典
unordered_set <u16string>
尽可能完整的乌尔都语词典(作为一个)。
这就是使用诸如日语之类的语言的方法,例如,查找单词之间的中断。
然后使用字典查找所有可以找到的单词,然后依靠字母识别和/或空格来查找剩余的单词。