我试图通过删除非拉丁字符+ [!?., ]
来减少在线文字的一些复杂性。大多数字符都可以毫无问题地删除,但对于其中一些字符我需要特定的规则:
一对(
和)
,一对"
(引号)或一对*
如果包含更多内容,则应将其中的任何文本转换为句子不止两个字。通过转换为句子,我只想在最后添加句号。例如:
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个正则表达式调用。还有更好的方法吗?
答案 0 :(得分:2)
标准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