将文本拆分成句子避免首字母缩略词冲突的最佳方法

时间:2014-09-06 18:36:51

标签: pseudocode text-parsing sentence

给出以下短语

  

女士。玛丽在去美国旅行时认识了她的丈夫戴夫先生   真酷你知道Dave在微软工作吗?好吧,他做到了。他甚至是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."
...

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

  

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

......或者我在某处错了,我的逻辑有缺陷?

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

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

1 个答案:

答案 0 :(得分:0)

示例中的所有首字母缩略词都是模式Uppercase .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.Mr.\u\l\.
  2. 句子中的首字母缩略词; "。U.S.A"接着是小写:(\u\.)+ (?=\l),其中需要删除句号;
  3. 句末首字母缩略词; "。U.S.A"后跟一个大写:(\u\.)+ (?=\u),其中最后一个句号应该保留。