Perl脚本从大型Unicode文本文件中删除所有英语

Nat*_*han 1 unicode bash perl

我仍然是bash和perl之类的新手,需要一些任务帮助.我正准备(添加和编辑)一个大型高棉语Unicode语料库,用于ICU高棉语破解的补丁.

到目前为止,我一直无法找到一个稳定的解决方案来自动删除所有英文字母和标点符号(只留下高棉语).

我被告知Perl可能是要走的路,但我不知道从哪里开始(我不是真正的程序员).

我过去使用过bash脚本,但结果并不完美(我最终必须手动检查列表并删除非高棉字符).

以下是我过去的一些建议:

LC_ALL=POSIX sort khmerdict.txt | sed '/[[:punct:]]/d' > khmer-sorted.txt
Run Code Online (Sandbox Code Playgroud)

哪个应该删除标点...但由于某种原因它删除了我的文件中的很多行,所以它是无用的.

还有这个:

sed -e 's/[a-zA-Z]//g' -e 's/?/ /g' -e 's/\t/ /g' -e 's/[«|»|:|;|.|,|(|)|-|?|?|”|“]//g' -e 's/[0-9]//g' -e 's/ /\n/g' -e 's/?//g' -e 's/?//g' -e 's/?//g' -e 's/?//g' -e 's/?//g' -e 's/?//g' -e 's/?//g' -e 's/?//g' -e 's/?//g' -e 's/?//g' dictionary.txt | \
Run Code Online (Sandbox Code Playgroud)

这是另一个尝试删除英文字母,标点符号以及所有高棉编号...但就像我说的那样,它没有完美准确的工作.

有没有人知道一个稳定的解决方案,这将适用于高棉Unicode?也许有一种方法可以使用一系列Unicode字符(高棉Unicode映射PDF)删除所有内容?

如果您想在字典上尝试一些东西,可以在这里下载测试版本:http://www.sbbic.org/Khmer-Unicode-Wordlist.zip

这里有一个简短的列表:

?????
--
?????
???????
}
é
"?????
"???"
"?"
"?"
?????--
–??????
??????ahead
?????
Run Code Online (Sandbox Code Playgroud)

谢谢,内森

Chr*_*sen 5

某些版本的sed可能支持非ASCII,多字节编码,但我只使用Perl,其中Unicode支持可能更可靠(甚至可读:您可以使用块名称并引用特殊字符而不必逐字逐句地使用它们).

保持CR,LF,ZERO WIDTH NON-JOINER以及来自高棉和高棉符号块的所有角色:

perl -CIO -pe '
    s/[^\r\n\x{200C}\p{Khmer}\p{KhmerSymbols}]+//g;   # characters to keep
' <input >output
Run Code Online (Sandbox Code Playgroud)

与上述相同,但也剥离高棉数字(U + 17E0-U + 17E9):

perl -CIO -pe '
    s/[^\r\n\x{200C}\p{Khmer}\p{KhmerSymbols}]+//g;   # characters to keep
    s/[\x{17E0}-\x{17E9}]+//g;                        # more characters to drop
' <input >output
Run Code Online (Sandbox Code Playgroud)

我使用Perl 5.8.9,Perl 5.10.0和Perl 5.12.1进行了测试.

\p{KhmerSymbols}如果您不想保留Khmer符号块中的字符,请删除.

输入应为UTF-8(您的压缩测试文件是).输出将是UTF-8.

以下是您的Khmer-Unicode-Wordlist.txt(CRLF换行符)的一些行统计信息:

  • 共计28378行(最后一行缺少CR + LF)
  • 28052行只有"高棉字符"(来自高棉(U + 1780-U + 17FF)或高棉符号(U + 19E0-U + 19FF)块)
  • 带有混合字符的308行("高棉字符"和其他字符)
  • 没有任何"高棉人物"的18条线
  • 51行ZERO WIDTH NON-JOINER(U + 200C)
    所有这些都发生在一系列高棉/高棉符号字符的中间.
    它们可能对您的目的很重要,也可能不重要.如果您不想保留这些ZWNJ,请从上述程序中
    删除\x{200C}.