1

このタスクに最適な言語を尋ねる同様の質問があり、Perl が答えでした。しかし、私はまだCでこれを解決する方法に興味があります.

このプログラムに、小説、新聞、ウェブページから取ったドイツ語テキストのサンプルで満たされた大きなテキスト ファイルを提供したいと考えています。最も一般的な単語で並べ替えられた、テキスト ファイル内のすべての単語の頻度リストが必要です。最も一般的な 3000 のドイツ語のリストが必要です。

これが単なる ASCII の問題であるとすれば、これは私にとって子供の遊びです。午前中ずっと Unicode について読んだ後、それが地雷原であることに本当に驚きました。

これはCでどのように行われますか?

Python で何かをまとめた友人がいましたが、彼はまだ初心者で、1.4 MB のテキスト ファイルでコードを作成するのに約 30 分かかりました。

4

5 に答える 5

5

エンコーディングに依存します。最も単純なものは UTF-8 で、文字列をchar*配列に格納するだけです。驚いたことに、頻度リストの作成は、ASCII テキストの場合とほぼ同じコードを使用して行われます。これは一種の UTF-8 マジックですが、このエンコーディングが非常に強力な理由はここにあります。

この場合、覚えておくべきことがいくつかあります。

  1. Unicode は、ASCII よりも多くの白い文字を提供します。単語がどこで区切られているかを知るには、それらのリストが必要です。幸いなことに、ウィキペディアには.

  2. Unicode は常に明確であるとは限りません。異なるシーケンスが同じ文字を生成する場合があります。通常、合成文字で発生します。たとえば、ドイツ語は次のÄように表されます。

    • 文字U+00C4- 一文字Ä
    • シーケンスU+0041 U+0308- ラテン文字Aとその上の分音符号 (ウムラウト)。

幸いなことに、ドイツ語には英語以外の文字が 7 つしかありません: ÄäÖöÜüß. それらの代替バリアントがどのように見えるかを確認する必要があります (たとえば、この4 ページと 5 ページでは、すべてのドイツ語の文字とその代替フォームを見つける必要があります)。

もちろん、両方の問題を解決するには、すべての調査結果が UTF-8 でどのように表現されるかを知る必要もあります。これについては、RFC 3629の 3 ページで説明されています。

他のエンコーディング (または他の言語) の場合は、自分で処理するのではなく、既存のライブラリを使用することをお勧めします。Linux (または他のほとんどの Unices) を使用している場合は、iconv関数 ( man 3 iconv) を使用してテキストを UTF-8 に変換し、前に説明したように進めることができます。

他の選択肢は、さまざまな Unicode バリアントを既に処理しているライブラリを使用することです。最も強力なのはおそらくICU - International Components For Unicodeです。マニュアルを参照して、それを使用してタスクを実行する方法を確認してください。

于 2013-03-31T22:30:07.523 に答える
1

プログラムの要件を明確に指定していませんが、キャラクターのアイデンティティを気にする必要があるかもしれない2つの側面しか思い浮かびません:

  1. 入力テキストに大文字と小文字が混在している場合、同じ単語の大文字と小文字が異なるバージョンが一緒にカウントされるように、すべての単語を同じ大文字と小文字にマップすることができます。

  2. 入力が混合正規化形式 (構成済みの文字と分解済みの文字) の場合は、正規化を実行して、この方法のみが異なる単語が一緒にカウントされるようにする必要があります。

たとえば、入力がすべて小文字の NFC である場合、ASCII のみを念頭に置いて作成されたプログラムは、タスクに対して完全にうまく機能します。これはおそらく当てはまらないため、要件を評価する必要があります。問題 1 (ケース) については、おそらくワイド文字 stdio 関数 (またはバイト指向の stdio およびmbsrtowcs) を使用towlowerして、ケース マッピングを行うことでうまくいくでしょう。問題 2 (正規化) については、C 用の既存の Unicode ライブラリを使用するか、独自のライブラリを作成する必要があります。

于 2013-03-31T22:53:28.110 に答える
0

ヘッダー ファイルで定義されている文字列wchar_tと関数を使用できます。wchar.h

于 2013-03-31T21:54:12.520 に答える