我想删除英文散文输入字符串中的所有撇号,但保留原始含义和大写字母,即
不是->不是
我是->我是
他们是->他们是
不应该->不应该
不能->不能
约翰的->约翰(足够好)
在Java中实现这一目标的最佳/最简单方法是什么?
最佳答案
对于替换宫缩有一些严格的规定。只要有一个方法可以在您的字符串上执行这些功能。
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
,您可以检查包含它的单词是否以大写字母开头(表示名称),并有条件地将其替换为s
或is
。但是,这不会在句子开头抓住正常的收缩,所以...如果您想要一种简单而完美的方法,我不确定您会不会得到。要执行这些更复杂的操作,您将需要一个经常引用的大型词典文件或机器学习技术。