- ベストアンサー
英・仏・独語で12文字以上の単語を効率的に抽出する方法は?
- 英・仏・独語のテキストファイルから12文字以上の単語を抽出したいが、効率的な方法がわからない。
- 英語の場合はテキストエディタの正規表現を使ったgrepで検索する方法があるが、仏・独語では問題がある。
- アポストロフィを2つ含む12文字以上の単語の抽出方法や、最初から12文字以上の単語だけを抽出する方法を教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
前回もemacs上でテストしたのですが、丁度いいファイルがなかったので、emacsに付属のTUTORIAL.frで試したところ(これはiso-8859-1ですが) awk '{for (i=1;i<=NF;i++)print $i}' TUTORIAL.fr | egrep "([a-zA-ZÀ-ý][']?){12,}" |sort |uniq その結果として次のようなものにマッチします。一部抜粋ですが Généralement, L'emplacement SUPPLÉMENTAIRE SUPPLÉMENTAIRES abréviations 語尾の(,)とかのゴミはawkに処理させるか、後処理で取り除けばいいと思います。(')は文字数に入れないようにしましたが、これは前回と同様です。 検索対象の文字À-ýは、実際には文字コードに合わせて調整する必要があるでしょうし、UTF-8ともなると使うツールが正しく文字コードを認識しないといけない。 逆にUTFとなれば、普通に文字数数えただけでいいわけで、CでもJavaでもプログラムざっくり組んだ方が早いかもしれませんね。
その他の回答 (2)
- trapezium
- ベストアンサー率62% (276/442)
ああ、忘れてた。Àとかに置き換えられちゃいましたが、コマンドラインでは実際の文字になってます。
- trapezium
- ベストアンサー率62% (276/442)
正規表現がOSによって少し違うので、環境に合わせなければなりませんが、 FreeBSDだと、 awk '{for (i=1;i<=NF;i++) print $i}' foo.txt| egrep "([a-zA-Z][-\'\`:^]?){12,}" |sort |uniq 複数処理するならループさせれば、これはLinux for f in *.txt; do awk '{for (i=1;i<=NF;i++) print $i}' $f| sed -nr "/([a-zA-Z][-\'\`:^]?){12,}/p" |sort |uniq > subdir/$f done [:alpha:]や\wだとロケール込みで処理してくれるので、うまく使えば何もしなくてもいいかもしれませんが、ここでは明示的に指定してます。 とここまで書いて気付きましたが、Windows環境ですね。cygwin入れればできそうな気もしますが、それは無しとなるとちょっと分りませんね。
補足
実は、[a-zA-Z] で検索したところ、ウムラウトなど欧文固有文字がヒットしないために、\w を使用した手法に切り替えたという経緯があります。 ただ、\w だとアンダーバーで連結されたストリングID部分も拾ってしまい困っています。 現在、UTF-8の文字コード範囲を指定した検索にトライしているのですが、[\x0x00010000-\x0x0010FFFF] や [\x0x0080-\x0x07FF] としても欧文固有文字にヒットしてくれません。 ä や ß のような欧文文字を一括して指定する方法ってあるのでしょうか。
お礼
ご回答ありがとうございます。 初心者の私よりさらにITオンチの人(正規表現って何?という感じの人達)でも扱える仕組みを考えていたので、できればVBSなど実行環境をインストールしなくても動くものを想定していたのですが、VBSって初心者向けの解説書が少ないのであきらめました。 プログラムを組んだことはないのですが、頑張って Perl か AWK を勉強したいと思います。 その際は下記のリストを参考にさせていただきます。