将引语替换为句子

时间:2016-03-01 11:57:29

标签: java regex

我试图通过删除非拉丁字符+ [!?., ]来减少在线文字的一些复杂性。大多数字符都可以毫无问题地删除,但对于其中一些字符我需要特定的规则:

一对(),一对"(引号)或一对*如果包含更多内容,则应将其中的任何文本转换为句子不止两个字。通过转换为句子,我只想在最后添加句号。例如:

but *after* I came up with it, I searched and...

but after I came up with it, I searched and...

在这里,我只想删除*,而不是:

 *buys airplane ticket* IM COMING FOR YOU

 buys airplane ticket. IM COMING FOR YOU

所以在第一个例子中,作者只是强调一个单词是该句子的一部分,在第二个例子中,作者描述了一个可能自己也可能是一个句子的动作。这类似于引号,其中一个词通常是某种强调或讽刺,而多个是引用。

有没有办法在regex(Java)中执行此操作?

编辑: 所以我的一般方法需要2个模式,每个案例的parathesis,引号和*。第一步是通过在\*((\w+ )+\w+)\*上运行替换$1.来处理多字,然后将所有*替换为空。这有效,但我需要6个正则表达式调用。还有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

标准Java库没有完整英语短语的内置概念(除了字母或标点之外,告诉白空间对它有帮助)。此外,

  • 没有正则表达式可以正确解析英语。正则表达式不能很好地嵌套。
  • 使用语法检查程序可能会很幸运,例如常用的文字处理软件。但是,它们仍然存在严重的错误率。
  • 虽然可能存在实现强大解析的NLP Java库,但它们仍然无法理解上下文,并且经常失败。

所以不,你不能用Java或任何其他编程语言(除非你有大量的资源,NLP经验和培训语料库来构建) - 除非你明显放松了检测&#的要求34;一系列字符是否可以是一个独立的英语句子"

答案 1 :(得分:0)

所以我目前最好的方法需要2 * numCases模式,如下所示:

static Pattern pattern = Pattern.compile("\\*((\\w+ )+\\w+)\\*");
static Pattern remove = Pattern.compile("\\*");

public static String transform(String str) {
    String sentences = pattern.matcher(str).replaceAll("$1.");
    return remove.matcher(sentences).replaceAll("");
}

运行

System.out.println(transform("but *after* I came up with it, I searched and..."));
System.out.println(transform("*buys airplane ticket* IM COMING FOR YOU"));

给出预期的

but after I came up with it, I searched and...
buys airplane ticket. IM COMING FOR YOU