以自动方式从希腊文本中删除变音符号
Removing diacritical marks from a Greek text in an automatic way
我有一个 tab 文件形式的反编译 stardict 字典
κακός <tab> bad
其中 <tab>
表示列表。
不幸的是,单词的定义方式要求查询包含所有变音符号。所以如果我想搜索 ζῷον,我需要所有的 iotas 和 circumflexes 都正确。
因此我想转换整个文件,以便删除关键字的变音符号。所以这条线会变成
κακος <tab> <h3>κακός</h3> <br/> bad
我知道我可以在 bash 中逐行读取文件,如此处所述 [1]
while read line
do
command
done <file
但是有什么方法可以使转换线的操作自动化呢?我听说过 iconv
[2] 但未能使用它实现所需的转换。我最好使用 bash 脚本。
此外,是否有自动音译希腊语的方法,例如使用 Perseus 的方法?
/edit:也许我们可以使用 Unicode 代码?我们可以注意到,U+1F0x
、U+1F8x
for x < 8
等都是字母α的变体。这将减少手动工作量。我也接受 C++ 解决方案。
[1] http://en.kioskea.net/faq/1757-how-to-read-a-file-line-by-line
[2] How to remove all of the diacritics from a file?
我对古希腊语不如对现代希腊语(实际上只使用两个变音符号)那么熟悉
但是我检查了元音并发现了哪些与变音符号结合在一起。这给了我以下列表:
ἆἂᾶὰάἀἄ
ἒὲέἐἔ
ἦἢῆὴήἠἤ
ἶἲῖὶίἰἴ
ὂὸόὀὄ
ὖὒῦὺύὐὔ
ὦὢῶὼώὠὤ
我把这个列表保存为文件并传递给这个sed
cat test.txt | sed -e 's/[ἆἂᾶὰάἀἄ]/α/g;s/[ἒὲέἐἔ]/ε/g;s/[ἦἢῆὴήἠἤ]/η/g;s/[ἶἲῖὶίἰἴ]/ι/g;s/[ὂὸόὀὄ]/ο/g;s/[ὖὒῦὺύὐὔ]/υ/g;s/[ὦὢῶὼώὠὤ]/ω/g'
Credit to hungnv
这是一个简单的 sed。它采用每个选项并将其替换为未标记的字符。上面命令的结果是:
ααααααα
εεεεε
ηηηηηηη
ιιιιιιι
οοοοο
υυυυυυυ
ωωωωωωω
关于音译希腊语:来自您 post 的图像旨在帮助用户在您使用相似字形而不是总是相似声音的网站上输入希腊语。这些是糟糕的音译。例如β 最常音译为 v。 ψ 为 ps。 φ为ph等
您可以使用 Perl 相对轻松地从字符串中删除变音符号:
$_=NFKD($_);s/\p{InDiacriticals}//g;
例如:
$ echo 'ὦὢῶὼώὠὤ ᾪ' | perl -CS -MUnicode::Normalize -pne '$_=NFKD($_);s/\p{InDiacriticals}//g'
ωωωωωωω Ω
其工作原理如下:
-CS
为 Perl 的 stdin/stdout 启用 UTF8
-MUnicode::Normalize
加载用于 Unicode 规范化的库
-e
从命令行执行脚本; -n
自动循环输入中的行; -p
自动打印输出
NFKD()
将行翻译成一种 Unicode 规范化形式;这意味着重音符号和变音符号被分解为单独的字符,这使得在下一步中更容易删除它们
s/\p{InDiacriticals}//g
删除 Unicoded 表示为变音符号的所有字符
这实际上应该可以为所有具有良好 Unicode 支持的 scripts/languages 删除变音符号等,而不仅仅是希腊语。
我有一个 tab 文件形式的反编译 stardict 字典
κακός <tab> bad
其中 <tab>
表示列表。
不幸的是,单词的定义方式要求查询包含所有变音符号。所以如果我想搜索 ζῷον,我需要所有的 iotas 和 circumflexes 都正确。
因此我想转换整个文件,以便删除关键字的变音符号。所以这条线会变成
κακος <tab> <h3>κακός</h3> <br/> bad
我知道我可以在 bash 中逐行读取文件,如此处所述 [1]
while read line
do
command
done <file
但是有什么方法可以使转换线的操作自动化呢?我听说过 iconv
[2] 但未能使用它实现所需的转换。我最好使用 bash 脚本。
此外,是否有自动音译希腊语的方法,例如使用 Perseus 的方法?
/edit:也许我们可以使用 Unicode 代码?我们可以注意到,U+1F0x
、U+1F8x
for x < 8
等都是字母α的变体。这将减少手动工作量。我也接受 C++ 解决方案。
[1] http://en.kioskea.net/faq/1757-how-to-read-a-file-line-by-line
[2] How to remove all of the diacritics from a file?
我对古希腊语不如对现代希腊语(实际上只使用两个变音符号)那么熟悉
但是我检查了元音并发现了哪些与变音符号结合在一起。这给了我以下列表:
ἆἂᾶὰάἀἄ
ἒὲέἐἔ
ἦἢῆὴήἠἤ
ἶἲῖὶίἰἴ
ὂὸόὀὄ
ὖὒῦὺύὐὔ
ὦὢῶὼώὠὤ
我把这个列表保存为文件并传递给这个sed
cat test.txt | sed -e 's/[ἆἂᾶὰάἀἄ]/α/g;s/[ἒὲέἐἔ]/ε/g;s/[ἦἢῆὴήἠἤ]/η/g;s/[ἶἲῖὶίἰἴ]/ι/g;s/[ὂὸόὀὄ]/ο/g;s/[ὖὒῦὺύὐὔ]/υ/g;s/[ὦὢῶὼώὠὤ]/ω/g'
Credit to hungnv
这是一个简单的 sed。它采用每个选项并将其替换为未标记的字符。上面命令的结果是:
ααααααα
εεεεε
ηηηηηηη
ιιιιιιι
οοοοο
υυυυυυυ
ωωωωωωω
关于音译希腊语:来自您 post 的图像旨在帮助用户在您使用相似字形而不是总是相似声音的网站上输入希腊语。这些是糟糕的音译。例如β 最常音译为 v。 ψ 为 ps。 φ为ph等
您可以使用 Perl 相对轻松地从字符串中删除变音符号:
$_=NFKD($_);s/\p{InDiacriticals}//g;
例如:
$ echo 'ὦὢῶὼώὠὤ ᾪ' | perl -CS -MUnicode::Normalize -pne '$_=NFKD($_);s/\p{InDiacriticals}//g'
ωωωωωωω Ω
其工作原理如下:
-CS
为 Perl 的 stdin/stdout 启用 UTF8
-MUnicode::Normalize
加载用于 Unicode 规范化的库-e
从命令行执行脚本;-n
自动循环输入中的行;-p
自动打印输出NFKD()
将行翻译成一种 Unicode 规范化形式;这意味着重音符号和变音符号被分解为单独的字符,这使得在下一步中更容易删除它们s/\p{InDiacriticals}//g
删除 Unicoded 表示为变音符号的所有字符
这实际上应该可以为所有具有良好 Unicode 支持的 scripts/languages 删除变音符号等,而不仅仅是希腊语。