2

我想从输入的英文散文字符串中删除所有撇号,但保留原始含义和大写,即

  • 不是 --> 不是
  • 我是——>我是
  • 他们是——>他们是
  • 不应该 --> 不应该
  • 不能 --> 不能
  • John's --> Johns(足够好)

在java中实现这一目标的最佳/最简单的方法是什么?

4

2 回答 2

9

有一个收缩字典Map<String, String>,将收缩映射到它们的拼写形式。因为撇号替换的内容没有单一的规则,所以这本字典接近了要走的路。

于 2012-12-27T22:19:37.707 回答
8

更换宫缩有一些硬性规定。只需有一个在您的字符串上执行这些功能的方法。

public String removeContractions(String inputString) { 

    inputString = inputString.replaceAll("n't", " not");
    inputString = inputString.replaceAll("'re", " are");
    inputString = inputString.replaceAll("'m", " am");
    inputString = inputString.replaceAll("'ll", " will");
    inputString = inputString.replaceAll("'ve", " have");

    return inputString;
}

这甚至会保留你的所有格。

当然,也有一些依赖于上下文的缩略语,例如he'd. 这可能是“他可以”、“他会”、“他有”等,因此超出了简单的替换算法,更多的是机器学习领域。

public String removeControversialContractions(String inputString) {

    inputString = inputString.replaceAll("'d", " would");
    inputString = inputString.replaceAll("'s", "s");

    return inputString;
}

也许's您可以检查包含它的单词是否以大写字母开头(表示名称)并有条件地将其替换为sor is。但是,这不会在句子开头捕捉到正常的收缩,所以......

如果你想要一个简单完美的方法,我不确定你会得到一个。要完成这些更复杂的事情,您需要一个经常参考的大型字典文件或机器学习技术。

于 2012-12-27T22:24:37.780 回答