2012-12-27 32 views
2

我想从英语散文的输入字符串中删除所有的撇号,但保留了原有的意义和资本化,即删除收缩

  • 不是 - >不是
  • 我 - - >我
  • 他们 - >它们是
  • 不应该 - >不应该
  • 不能 - >不能
  • 约翰 - >约翰(足够好)

在java中实现这个最好/最简单的方法是什么?

+0

为什么John's'会映射到Johns? – irrelephant

+0

@irrelephant它还映射了什么? – Bohemian

回答

6

取代收缩有一些硬性规则和快速规则。只要有一个方法可以在你的字符串上执行这些功能。

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,你可以检查,看看是否包含它的词用大写字母(表示名称)开始,有条件用两种sis更换。然而,这不会在句子的开头捕捉正常的收缩,所以...

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

+0

'inputString = inputString.replaceAll (“'s”,“s”);'看最后一个例子。 – MrSmith42

+1

是的,你可以补充一点,但我认为这个问题的精神是尽可能保留所有物。 :)也许这不是意图,但在这种情况下,这可能是一个很好的补充。 – asteri

+0

在“不”之前需要一个空格。你的代码会给“isnot” – Bohemian

9

有收缩字典Map<String, String>将收缩映射到他们拼写的形式。由于撇号取代的内容没有单独的规则,因此这本字典就是要走的路。

+0

所有的所有物呢?那么保留资本总额呢? – Bohemian

+0

'鲍勃的小马'vs'鲍勃的小马被命名为鲍勃' – irrelephant

+0

对。所以这是一个固有的模糊性,这正是我提倡字典方法的原因。没有“硬性规定”,但当然也有一些可以包含在字典中。即*鲍勃的*不会被替换,但*它*总是会映射到*它是*(因为激活形式是*它的*)。当然,如果有一些明确的规则,你可以先编码,但它应该与字典一起使用,因为这样可以更精确地区分含糊和明确的情况。 – AFS