基于字频分析的字符编码检查方案

语义分析太难,但基于常用字/生僻字字频分析的方法应该还是可行的。
因为如果生僻字的出现频率太高,有很高概率文本不是这种编码。

算法1:(基于字频统计宏观数据)(ASCII字符不参与字频统计)
a.基于大数据(新闻/文学/维基词条等)进行统计分析,建立字频表。
b.以字频的倒数作为生僻指数
c.将转换后的文本的全部文字的生僻指数累加
d.根据生僻指数累加值给出字符编码判断

缺点1:对于专业文档(比如故意含有某个生僻字的语言学论文),有可能由于生僻字的超高指数导致判断失败
改进方法:b步骤中,建立更加科学的生僻指数,将单个生僻字的影响因子降低。比如开方/取对数(最常用字指数为0, 最不常用字指数为20)

缺点2:对文本内容的自然语言和编码脱节的文件的判断很可能不正确。比如以BIG5编码的日文音乐CUE文件。
因为基于繁体中文自然语言建立的字频表,假名和日文汉字的出现频率较低

改进方法1:针对所有可能编码进行转换,然后对所有自然语言进行分析。缺点:耗时。优点:不但可以给出可能的原始编码,还可以给出自然语言判断。
改进方法2:不再区分自然语言,对东亚语言的所有字符建立统一字频表。一种方法是,取100W字简体中文文章,100W字日文文章,100W字繁体中文文章,100W字韩文文章,先分别统计在各自然语言中的字频,取最高者合并到单一字频表中(这个合并后的字频表基于Unicode)

缺点:对于少量文字的文本,判断可能仍然不准确。Shift-JIS的假名字符,按照EUC-KR编码转换,有可能落在谚文文字区。而假名字符和谚文字符都是高频字符。

算法2:(基于字频分布相似度)(ASCII字符不参与字频统计)
a.基于字频,将字符按常用度分级。比如分成20级。建立字频映射表 (比如 “的” -> 0级)
b.生成字符常用度分布参考曲线
c.统计转换后文本在每级中的字符数量,生成统计曲线
d.计算c中的统计曲线和b中的参考曲线的相似度 (约化后计算方差)

优点:不但可以给出编码,还可以给出自然语言的判断。(方差值小者相似度高)
缺点:依赖文本的文字量。东亚语言的字频分布曲线可能都很相似。如0级字符,占文本80%(随便乱猜的数据哦)。

判断过程的例子:
以EUC-KR编码的日文音乐CUE文件:
1.筛选出候选编码,排除不可能编码。假设候选编码只剩下BIG5和EUC-KR。
2.按照BIG5编码转换,得到转换文本。执行算法2,给出各自然语言的相似度
3.按照EUC-KR编码进行转换,得到转换文本。执行算法2,给出各自然语言的相似度
4.取2和3中相似度最高者。
5.相似度最高者对应的编码为可能编码

算法3:(云计算)
对于只含少量文字的文本,可以用Google进行检索,返回词条数目少者,则很可能不是正确编码

本文目前尚无任何评论.

发表评论

XHTML: 您可以使用这些标签: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
:wink: :-| :-x :twisted: :) 8-O :( :roll: :-P :oops: :-o :mrgreen: :lol: :idea: :-D :evil: :cry: 8) :arrow: :-? :?: :!: