1

我想检查句子形成的质量。具体来说,我正在查看最终用户是否在标点符号后键入空格。我也可以使用 NLP 库或简单的 java 正则表达式解决方案。

例如:

  1. “嗨,我叫汤姆克鲁斯。我喜欢电影”
  2. “嗨,我叫汤姆克鲁斯。我喜欢电影”
  3. “嗨,我叫汤姆克鲁斯。我喜欢电影”

第 1 句是完美的,第 2 句很糟糕,因为它后面有 1 个标点符号,后面没有空格,第 3 句是最差的,因为没有一个标点符号后面有空格。

你能建议一个java方法吗?我尝试了语言工具 API,但没有用。

4

2 回答 2

1

为什么不尝试模式和 Unicode 类别?

例如:

Pattern pattern = Pattern.compile("\\p{P} ");
        Matcher matcher = pattern.matcher("Hi, my name is Tom Cruise. I like movies");
        while (matcher.find()) {
            System.out.println(matcher.group());
        }

这里的 Pattern 搜索任何标点符号后跟一个空格。输出将是:

, 
. 

(注意逗号和点后面的空格)

您可以通过指定哪些确切的标点字符有资格后跟空格来优化您的模式。

最后,为了检查相反的内容(标点符号后面没有空格):

Pattern otherPattern = Pattern.compile("\\p{P}\\S");
于 2013-05-09T10:05:44.400 回答
1
Pattern pattern = Pattern.compile("\\p{P}\\S");

String[] tests = new String[] {
    "Hi, my name is Tom Cruise. I like movies",
    "Hi,my name is Tom Cruise. I like movies",
    "Hi,my name is Tom Cruise.I like movies"
};

int[] results = new int[] { 0, 0, 0 };

for (int i = 0; i < tests.length; i++) {
    Matcher matcher = pattern.matcher(tests[i]);
    while(matcher.find()) {
        results[i] += 1;
    }
    if (results[i] == 0) {
        System.out.println("Sentence " + (i + 1) + " is perfect");
    } else if (results[i] > 1 && results[i] < 3) {
        System.out.println("Sentence " + (i + 1) + " is good");
    } else {
        System.out.println("Sentence " + (i + 1) + " is bad");
    }
}
// now you know how many violations there were on every line.
// do whatever you want with them.
于 2013-05-09T10:12:09.190 回答