program-in-chinese / zhconverter

用中文编写Java代码实现的中文字符简繁体互相转换, 基于https://code.google.com/archive/p/java-zhconverter/
GNU Lesser General Public License v3.0
44 stars 14 forks source link

乾坤成了干坤,乾宁成了干宁 #3

Open zenglian opened 4 years ago

zenglian commented 4 years ago

对于此类问题,有没有解决办法?

nobodxbodon commented 4 years ago

添加了相关测试,未能重现问题:https://github.com/program-in-chinese/zhconverter/commit/9e98e0ec07491376049253d8a8cff018eb4d483a 如能添加测试重现问题,欢迎提交 pr。

zenglian commented 4 years ago

很明显你转反了,应该从繁体到简体。 不过我看这问题很难解决。

nobodxbodon commented 4 years ago

?测试里其他用例看了吗?都是这个顺序啊。

或者写个测试用例提个 pr?

zenglian commented 4 years ago

很简单

    String s1 = 简繁转换类.转换("酒里乾坤大", 简繁转换类.目标.简体);
    System.out.println(s1);
    //输出酒里干坤大
nobodxbodon commented 4 years ago

哦,的确是功能所限:https://github.com/program-in-chinese/zhconverter/commit/7af0101bf4a67352b020a100d1c13073f668d4a3

zenglian commented 4 years ago

再来几个例子。但应不仅限于这个“乾”字。

繁体:     "description": "--(961-1023)字平仲,华州下(今陕西渭南)人。太平兴国五年(1980)进士。累官至中书侍郎同中书下平章事。二次罢相,封莱国公。乾兴初,为丁谓所,贬雷州司户参军,卒于贬所。有《寇莱公集》。存词五首,以《江南春》较著名。", 
简体:     "description": "--(961-1023)字平仲,华州下(今陕西渭南)人。太平兴国五年(1980)进士。累官至中书侍郎同中书下平章事。二次罢相,封莱国公。干兴初,为丁谓所,贬雷州司户参军,卒于贬所。有《寇莱公集》。存词五首,以《江南春》较著名。", 

繁体:     "description": "--字世英,历城(今山东济南)人。以文学著称,与王樵、贾同齐名。官乾宁主簿。有《东皋集》,不传。存词五首。", 
简体:     "description": "--字世英,历城(今山东济南)人。以文学著称,与王樵、贾同齐名。官干宁主簿。有《东皋集》,不传。存词五首。", 

繁体:     "description": "--字次仲,南昌(今属江西)人。乾道二年(1166)进士。以词名世,常以俚俗语写男女之情。有《金谷遗音》。", 
简体:     "description": "--字次仲,南昌(今属江西)人。干道二年(1166)进士。以词名世,常以俚俗语写男女之情。有《金谷遗音》。", 

繁体:     "name": "曾乾曜", 
简体:     "name": "曾干曜", 

//下面几个是对的
繁体:       "池台小雨乾,门巷香轮少。", 
简体:       "池台小雨干,门巷香轮少。", 

繁体:       "昭阳殿里春衣就,金缕初乾。", 
简体:       "昭阳殿里春衣就,金缕初干。", 

繁体:       "雨打芙蓉泪不乾。", 
简体:       "雨打芙蓉泪不干。", 

繁体:       "蜗角虚名,蝇头微利,算来著甚乾忙。", 
简体:       "蜗角虚名,蝇头微利,算来著甚干忙。", 
nobodxbodon commented 4 years ago

主要原因是,这个库没有任何分词功能(请见 readme)。因而繁体句子中一旦出现“乾”字,转为简体都会变为“干”。即使将“乾宁”和“乾道“写入内置字典,由于不分词,也不能正确转换。

一个取巧的办法,就是用户自定义一个字典,把比如“乾宁”和“乾道“写入词典,转换时,先检查句子中有没有词典中的词,如果有的话,就只用这个库转换其他部分,保留此词不变。

zenglian commented 4 years ago

可以作为配置的一部分(配置文件和api),像“乾坤”可以预配置好,用户可以增减。

nobodxbodon commented 4 years ago

是的。不过,个人短期内恐怕难以完成(个人原因)。如果实现了的话,可否分享下代码?

nobodxbodon commented 4 years ago

@zenglian 刚写了个辅助方法,思路大致和之前所述相同:https://github.com/program-in-chinese/zhconverter/blob/c3b0a369dc707717e25799d769038350eaef0a89/test/com/github/nobodxbodon/zhconverter/%E8%87%AA%E5%AE%9A%E4%B9%89%E8%AF%8D%E5%85%B8%E6%B5%8B%E8%AF%95%E7%B1%BB.java#L86

已通过之前的两个用例: https://github.com/program-in-chinese/zhconverter/blob/c3b0a369dc707717e25799d769038350eaef0a89/test/com/github/nobodxbodon/zhconverter/%E8%87%AA%E5%AE%9A%E4%B9%89%E8%AF%8D%E5%85%B8%E6%B5%8B%E8%AF%95%E7%B1%BB.java#L82

希望有所帮助。

zenglian commented 4 years ago

有一点问题:在文本中,例外词可能重复出现多次。 定义例外词的时候不应重复,所以更宜为Set而不是List。

如:

  private static List<String> 词典 = Arrays.asList("乾兴", "乾坤", "乾隆", "曾乾曜");

  @Test
  public void 例外词测试() {
    String src = "乾隆年间,乾隆皇帝下江南,碰到一个乾瘦的老头,叫曾乾曜,说:酒里乾坤大。";
    String dest = 忽略特殊词(src, 目标.简体);
    Assert.assertEquals(src, dest);    //正确结果也不应相等
  }

结果

Expected :乾隆年间,乾隆皇帝下江南,碰到一个乾瘦的老头,叫曾乾曜,说:酒里乾坤大。
Actual   :乾隆年间,干隆皇帝下江南,碰到一个干瘦的老头,叫曾乾曜,说:酒里乾坤大。

这里有一个实战的项目:最全中文古诗词库,其中很多繁体,想转为简体: https://github.com/chinese-poetry/chinese-poetry

nobodxbodon commented 4 years ago

如果是古诗词的话,一首中应该重复出现某词的情况应该极少吧?上面代码仅作参考,请自行按需修改?