0

给定以下短语

玛丽女士在美国之行中认识了她的丈夫戴夫先生,这很酷。你知道戴夫在微软工作吗?好吧,他做到了。他甚至是 Internet Explorer 开发人员的一员。

将其拆分为句子的最佳“伪代码”方式是什么?Python 或任何其他类似语言也可以,因为它与伪代码相似。

我的想法是替换每次出现的" a-zA-Z."(注意空格),当然".a-zA-Z"".a-zA-Z."它的等价物没有点,例如

" a."
" b."
" c."
" d."
" e."
" f."
...

".a."
".b."
".c."
".d."
".e."
".f."
...

" ab."
" ac."
" ad."
...
" ba."
" bc."
" bd."
...

该短语应该很好地转换为以下内容

玛丽女士在去美国旅行时认识了她的丈夫戴夫先生,这很酷。你知道戴夫在微软工作吗?好吧,他做到了。他甚至是 Internet Explorer 开发人员的一员。

...还是我在某个地方错了,我的逻辑有缺陷?

对于将来您的问题评论是什么,我需要知道将示例文本拆分为正确句子的最佳方法是什么,避免与首字母缩略词发生冲突。

这可以用伪代码、Python 或其他类似于伪代码的语言来解释。我希望它与语言无关,因此任何人都可以实现它,无论他们使用什么语言。

4

1 回答 1

0

示例中的所有首字母缩写词都是模式Uppercase .or Uppercase lowercase .; 没有其他(常规)出现的句号与此特定模式匹配。

因此,可以使用一个简单的 RegEx 来删除句号。之后剩下的可以在常规标点符号上拆分.!?。在 Javascript 中:

str2 = str.replace(/([A-Z][a-z]?)\./g, '$1');

或使用能够理解最常见字符类的 GREP 风格:

str2 = str.replace(/(\u\l?)\./g, '$1');

这会直接产生如图所示的输出。

使用 RegEx 很简单(并且很容易扩展!),但同样的模式也可以在其他语言中进行测试。在 C 中,您可以将输入复制到输出并仅在看到.字符时进行测试:

int main (void)
{
    char input[] = "Ms. Mary got to know her husband Mr. Dave in her trip to "
       "U.S.A. and it was cool. Did you know Dave worked for Microsoft? Well "
       "he did. He was even part of Internet Explorer devs.";
    char output[256], *readptr, *writeptr;

    printf ("in: %s\n", input);

    readptr = input;
    writeptr = output;
    while (*readptr)
    {
        if (*readptr == '.')
        {
            if ((readptr > input && isupper(readptr[-1])) ||
                (readptr > input+1 && isupper(readptr[-2]) && islower(readptr[-1])))
            {
                readptr++;
                continue;
            }
        }
        *writeptr = *readptr;
        readptr++;
        writeptr++;
    }

    *writeptr = 0;
    printf ("out: %s\n", output);

    return 0;
}

这些解决方案从源文本中删除句号。如果要保留它们,可以将它们替换为占位符(例如,源文本中通常不会出现的字符),或者做相反的事情:在拆分句子时,测试看是否是句号是一个有效的断点。


事后思考:它确实适用于原始例句......但它不适用于评论中的那个:

I made a trip to the U.S.A. It was cool.I liked it very much.

你在哪里得到输出

I made a trip to the USA It was cool.I liked it very much.

这需要检查更多可能的情况:

  1. 常见的缩写,例如Ms.and Mr.\u\l\.
  2. 句子首字母缩略词;"USA" 后跟一个小写:(\u\.)+ (?=\l),句号需要删除;
  3. 句末首字母缩略词;"USA" 后跟一个大写字母: (\u\.)+ (?=\u),应保留最后一个句号。
于 2014-09-07T23:46:24.087 回答