0

次のフレーズを考えると

メアリーさんはアメリカへの旅行で夫のデイブさんと知り合いになり、とてもクールでした。Dave が Microsoft で働いていたことをご存知ですか? よくやった。彼は 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 が Microsoft で働いていたことをご存知ですか? よくやった。彼は Internet Explorer 開発者の一員でさえありました。

...または、私はどこか間違っていて、論理に欠陥がありますか?

将来、あなたの質問のコメントは何ですか。頭字語との衝突を避けて、例のテキストを正しい文に分割する最良の方法を知る必要があります。

これは、疑似コード、Python、または疑似コードに似た他の言語で説明されています。言語にとらわれず、使用する言語に関係なく、誰でも実装できるようにしたいと考えています。

4

1 に答える 1

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. 文中の頭字語; "USA" の後に小文字の : が続き(\u\.)+ (?=\l)ます。ピリオドは削除する必要があります。
  3. 文末頭字語; "USA" の後に大文字の :(\u\.)+ (?=\u)が続き、最後のピリオドが残る必要があります。
于 2014-09-07T23:46:24.087 に答える