私が働いている会社のために、カスタムの電子メール管理アプリケーションを作成したとしましょう。同社のサポート アカウントから電子メールを読み取り、それらのクリーンアップされたプレーン テキスト バージョンをデータベースに保存し、その過程でそれを顧客アカウントや注文に関連付けるなど、他の優れた処理を行います。従業員がメッセージに返信すると、私のプログラムは電子メールを生成し、ディスカッション スレッドの書式設定されたバージョンを顧客に送信します。顧客が応答すると、アプリは件名で一意の番号を探して着信メッセージを読み取り、前のディスカッションを取り除き、スレッドの新しいアイテムとして追加します。例えば:
これは Contoso カスタマー サービスからのメッセージです。 最近、カスタマーサポートをリクエストしました。以下はあなたの要約です リクエストと私たちの返信。 -------------------------------------------------- ------------------ Contoso (Fred) 2008 年 12 月 30 日火曜日、午前 9 時 4 分 -------------------------------------------------- ------------------ ジョン: あなたの住所を変更しました。あなたはログインすることで私の仕事を確認することができます 当社の Web サイトの「あなたのアカウント」。ご注文は本日発送されます。 Contoso でお買い物いただきありがとうございます。 -------------------------------------------------- ------------------ 2008 年 12 月 30 日火曜日の午前 8:03 のあなた -------------------------------------------------- ------------------ おっと、住所を間違って入力してしまいました。に変更できますか フレッド・スミス 123メインストリート バージニア州エニータウン 12345 ありがとう! -- フレッド・スミス Contoso 製品愛好家
一般に、これはすべてうまく機能しますが、クリーンアップをしばらく延期している領域が 1 つあります。それは、テキストの折り返しを扱っています。上記のようなきれいな電子メール形式を生成するには、顧客が最初に送信したテキストを再ラップする必要があります。
これを行うアルゴリズムを作成しました (コードを見ても、それがどのように機能するのか完全にはわかりません。リファクタリングを使用する可能性があります)。しかし、ハードラップ改行、「段落の終わり」改行、および「意味論的」改行を区別することはできません。たとえば、ハードラップの改行は、たとえば 79 桁の長いテキスト行を折り返すために、電子メール クライアントが段落内に挿入した改行です。段落改行の終わりは、ユーザーが段落の最後の文の後に追加した改行です。セマンティックな改行はbr
、フレッドが上で入力したアドレスなど、タグのようなものになります。
代わりに、私のアルゴリズムは、新しい段落を示すものとして 2 つの改行が連続して表示されるだけであるため、顧客の電子メールは次のような形式になります。
おっと、住所を間違って入力してしまいました。に変更できますか フレッド スミス 123 Main St Anytown, VA 12345 ありがとう! -- Fred Smith Contoso 製品愛好家
このテキストを意図したとおりに再ラップするバージョンを書こうとするときはいつでも、基本的に、テキストのセマンティクス、「ハードラップ」改行と「本当に意味した」の違いを知る必要があるという点で壁にぶつかります。br
顧客の住所などの "-タイプの改行のようなものです。(私は 2 つの改行を続けて使用して、いつ新しい段落を開始するかを決定します。これは、大多数の人々が実際に電子メールを入力する方法と一致しています。)
意図したとおりにテキストを再ラップできるアルゴリズムを持っている人はいますか? それとも、特定のソリューションの複雑さを比較検討する際に、この実装は「十分」でしょうか?
ありがとう。