Java 将引语替换为句子

Java 将引语替换为句子,java,regex,Java,Regex,我试图通过删除非拉丁字符来降低在线文本的复杂性。大多数字符可以毫无问题地删除,但对于其中一些字符,我需要特定的规则: 一对(和)、一对“(引号)或一对*应该将其中包含两个以上单词的任何文本转换为一个句子。通过转换为一个句子,我只想在末尾添加一个句号。例如: but *after* I came up with it, I searched and... 到 在这里,我只想删除*,而不是: *buys airplane ticket* IM COMING FOR YOU 到 因此,在第一个例

我试图通过删除非拉丁字符来降低在线文本的复杂性。大多数字符可以毫无问题地删除,但对于其中一些字符,我需要特定的规则:

一对
、一对
(引号)或一对
*
应该将其中包含两个以上单词的任何文本转换为一个句子。通过转换为一个句子,我只想在末尾添加一个句号。例如:

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

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

 *buys airplane ticket* IM COMING FOR YOU

因此,在第一个例子中,作者只是强调句子中的一个词,在第二个例子中,作者描述了一个动作,它也可能是一个句子本身。这与引号的作用类似,其中一个词通常是某种强调或讽刺,而多个词则是一个引号

在正则表达式(Java)中是否有这样做的方法

编辑:
因此,我的一般方法要求每种情况都有两种模式:并列、引号和*。第一步是通过在
\*((\w+)+\w+)上运行replace来处理多个单词\*
$1.
然后将所有的
*
替换为零。这是可行的,但我需要6个正则表达式调用。有更好的方法吗?

标准Java库没有内置的完整英语短语的概念(告诉字母或标点符号之外的空格对您有帮助).此外

  • 没有正则表达式可以正确解析英语。正则表达式嵌套效果不好
  • 您可能会幸运地使用语法检查器,例如内置在通用字处理软件中的语法检查器。但是,它们仍然有很高的错误率
  • 虽然可能存在实现健壮解析的NLP Java库,但它们仍然无法理解上下文,并且经常失败

因此,Java或任何其他编程语言都无法做到这一点(除非你有大量的资源、NLP经验和训练语料库来构建)——除非你大大放松了检测“字符序列是否可以是独立的英语句子”的要求“

因此,我当前的最佳方法需要2*numcase模式,如下所示:

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

您的示例都将替换所有的
*
s。否,第二个示例将一对*替换为最后一个“*”位置的句号。简单回答:是的。分享你的研究成果对每个人都有帮助。告诉我们您尝试了什么,以及为什么它不能满足您的需求。这表明你花了时间来帮助自己,它使我们避免重复显而易见的答案,最重要的是,它帮助你得到一个更具体和相关的答案!另见。记住,这不是免费的代码服务@JorgeCampos补充了我目前的方法。它是有效的,我的问题是是否有更好的方法。不确定我是否做对了。您可能会将三个“两个或多个单词”替换为一个替换为
$2.
,然后将剩余的
[*”(]
替换为空。请参阅(Java).是的,我知道这一点,从实际理解语言的角度来看,我的方法并不完美,但我认为这是一种非常好的算法方法。我的问题是,是否有一种有效的方法来实现我描述的算法。如果这不是一种解决方案,请将其包含在问题中,而不是作为答案:)@BobbleBobble好的,谢谢。我不知道放在哪里,因为这是一个解决方案,只是不是一个很好的解决方案。所以,如果没有人发布更好的,我将不得不回到这个。
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