英・仏・独語で12文字以上の単語を効率的に抽出する方法は?

このQ&Aのポイント
  • 英・仏・独語のテキストファイルから12文字以上の単語を抽出したいが、効率的な方法がわからない。
  • 英語の場合はテキストエディタの正規表現を使ったgrepで検索する方法があるが、仏・独語では問題がある。
  • アポストロフィを2つ含む12文字以上の単語の抽出方法や、最初から12文字以上の単語だけを抽出する方法を教えてください。
回答を見る
  • ベストアンサー

英・仏・独語で12文字以上の単語を抽出

英・仏・独語の多数のテキストファイルから12文字以上の単語だけ抽出したいのですが効率のよい方法はないでしょうか。 英語だけならテキストエディタの正規表現を使ったgrepで \w{12,} で12文字以上の単語を含む行を検索したうえで、\w{1,11} を空白と置換して削除してしまえばいいのですが(一緒に表示させるフルパスは別途消す必要がありますが)、仏・独語となるとイロイロ問題が出てきます。 例えば、仏語では a'bc'def のようなパターンの単語があります。これを単に検索するだけなら \w'\w+'*\w* で検索できますが、12文字以上と指定する方法がわかりません(アポストロフィがひとつだけなら \w'\w{10,} で12文字以上ということになるのですが…)。 そこで質問なのですが: 1. 上記の仏語のようにアポストロフィを2つ含む12文字以上の単語を抽出するにはどうしたらいいでしょうか。 2. そもそも12文字以上の単語を含む行をgrepしたうえで、11文字以下の単語を消去したりせずに、最初から12文字以上の単語だけを抽出する方法はないのでしょうか。 できれば、フリーウェなどを導入せずにテキストエディタやOffice系アプリなどだけで対処したいと思います。VBSでもOKですが、その場合は、初歩的なことしかわかりませんので、アドヴァイスというより丸投げしてしまうことになります。 どうかよろしくご助言をお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • trapezium
  • ベストアンサー率62% (276/442)
回答No.2

前回もemacs上でテストしたのですが、丁度いいファイルがなかったので、emacsに付属のTUTORIAL.frで試したところ(これはiso-8859-1ですが) awk '{for (i=1;i<=NF;i++)print $i}' TUTORIAL.fr | egrep "([a-zA-Z&Agrave;-&yacute;][']?){12,}" |sort |uniq その結果として次のようなものにマッチします。一部抜粋ですが G&eacute;n&eacute;ralement, L'emplacement SUPPL&Eacute;MENTAIRE SUPPL&Eacute;MENTAIRES abr&eacute;viations 語尾の(,)とかのゴミはawkに処理させるか、後処理で取り除けばいいと思います。(')は文字数に入れないようにしましたが、これは前回と同様です。 検索対象の文字&Agrave;-&yacute;は、実際には文字コードに合わせて調整する必要があるでしょうし、UTF-8ともなると使うツールが正しく文字コードを認識しないといけない。 逆にUTFとなれば、普通に文字数数えただけでいいわけで、CでもJavaでもプログラムざっくり組んだ方が早いかもしれませんね。

その他の回答 (2)

  • trapezium
  • ベストアンサー率62% (276/442)
回答No.3

ああ、忘れてた。&Agraveとかに置き換えられちゃいましたが、コマンドラインでは実際の文字になってます。

Kazu_creator
質問者

お礼

ご回答ありがとうございます。 初心者の私よりさらにITオンチの人(正規表現って何?という感じの人達)でも扱える仕組みを考えていたので、できればVBSなど実行環境をインストールしなくても動くものを想定していたのですが、VBSって初心者向けの解説書が少ないのであきらめました。 プログラムを組んだことはないのですが、頑張って Perl か AWK を勉強したいと思います。 その際は下記のリストを参考にさせていただきます。

  • trapezium
  • ベストアンサー率62% (276/442)
回答No.1

正規表現が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入れればできそうな気もしますが、それは無しとなるとちょっと分りませんね。

Kazu_creator
質問者

補足

実は、[a-zA-Z] で検索したところ、ウムラウトなど欧文固有文字がヒットしないために、\w を使用した手法に切り替えたという経緯があります。 ただ、\w だとアンダーバーで連結されたストリングID部分も拾ってしまい困っています。 現在、UTF-8の文字コード範囲を指定した検索にトライしているのですが、[\x0x00010000-\x0x0010FFFF] や [\x0x0080-\x0x07FF] としても欧文固有文字にヒットしてくれません。 ä や ß のような欧文文字を一括して指定する方法ってあるのでしょうか。

関連するQ&A

  • 文字数の多い単語だけ抽出(多言語テキスト)

    英・仏・独語の多数のテキストファイルから12文字以上の単語だけ抽出したいのですが効率のよい方法はないでしょうか。 英語だけならテキストエディタの正規表現を使ったgrepで \w{12,} で12文字以上の単語を含む行を検索したうえで、\w{1,11} を空白と置換して削除してしまえばいいのですが(一緒に表示させるフルパスは別途消す必要がありますが)、仏・独語となるとイロイロ問題が出てきます。 例えば、仏語では a'bc'def のようなパターンの単語があります。これを単に検索するだけなら \w'\w+'*\w* で検索できますが、12文字以上と指定する方法がわかりません(アポストロフィがひとつだけなら \w'\w{10,} で12文字以上ということになるのですが…)。 そこで質問なのですが: 1. 上記の仏語のようにアポストロフィを2つ含む12文字以上の単語を抽出するにはどうしたらいいでしょうか。 2. そもそも12文字以上の単語を含む行をgrepしたうえで、11文字以下の単語を消去したりせずに、最初から12文字以上の単語だけを抽出する方法はないのでしょうか。 できれば、フリーウェなどを導入せずにテキストエディタやOffice系アプリなどだけで対処したいと思います。VBSでもOKですが、その場合は、初歩的なことしかわかりませんので、アドヴァイスというより丸投げしてしまうことになります。 どうかよろしくご助言をお願いします

  • 単語を抽出する正規表現

    単語を抽出する正規表現を教えてください。grepを使うと、「○○を含む行」がすべて抽出されますが、下記のように単語だけを抽出したいのですが、どうすればいいかご存知の方がいらっしゃいましたら、教えてください。 --- ABC DEF GHIJ AB CDEF GHIJK ABCDE FGH I JKL 上記からGH始まりの単語だけを抽出したいです。 1行目と2行目のGHIJとGHIJKの2つだけが結果として欲しいです。1行目と2行目全体が出てくるのではなくて。 Windowsでは、エディタは秀丸を使ってます。 Windowsで不可能なら、UNIX上で実施することも考えていますが、Windowsのエディタ上で実行できる正規表現の文などありましたら教えてください。

  • grepで全角文字の行を抽出

    grepの検索でテキスト内のひとつでも全角文字がある行を 抽出したいと思ってます。1つの方法は見つかったのですが、 時たまバグがあるそうですので、 他の方法を探そうと思ってます。 わかっている方法は、以下のとおりです。 > grep -n '.*[^ -~。-゜].*' test_data.txt よろしくお願いします。

  • 12文字以上の単語リスト作成

    こんばんは。Perl初心者(プログラミングの初心者です)。 たびたびお世話になっております。 現在、カレントディレクトリにあるテキストファイルから12文字以上の単語を抽出し、新規テキストファイルにはき出すスクリプトを書こうとしているのですが、うまくいきません。 以下のようなリストを記述して見たのですが、どうやら12文字以上の単語が含む「行」を抽出しているようなのです(その処理自体も不安なのですが…)。 どこがいけないのか、そもそも根本的に間違っているのか、ご指摘いただけると非常に助かります。 ご助言よろしくお願いします。 use strict; use warnings; while ( my $file = glob '*.txt' ) { open my $reading, '<', $file or die; my @content = <$reading>; close $reading; my @results = grep(/[a-zA-Z']{12,}/,@content); foreach my $result (@results) { open (NEWFILE, ">LongWords_12.txt") or die "$!"; print NEWFILE @results; close(NEWFILE); } }

    • ベストアンサー
    • Perl
  • 特定文字の右側を抽出する方法(関数など)

    数が多いので、Excelやテキストエディタなどを使用して、特定文字の右側すべてや右側3文字などを抽出する方法を教えてください。 @以降の文字を抽出したいときなど 1行目 1345@678 2行目 1346@834 3行目 134@3464

  • ある文字列が含まれた行だけをテキストから抽出→結果を別のテキストに出力

    ある文字列が含まれた行だけをテキストから抽出→結果を別のテキストに出力したいです。 そのために何かいいソフトウェア、または方法は無いでしょうか? これまでは下記サイトを参考に秀丸エディタの検索&glep機能を使ってやってみたのですが、 抽出したい文字列の数が多く手動でやるのに限界を感じたので質問させていただきました。 http://hechimahige.blog71.fc2.com/blog-entry-4.html 秀丸エディタのマクロでも構いません。 よろしくお願いします。

  • exelで一番初めに出てきたひらがな単語抽出方法

    exelで各行にあるひらがなと他の文字が混じったテキストの中から全行含めて一番初め、一番左側に出てきたひらがな単語だけ一括で抽出しあいている列に表示する方法を教えて下さい ひらがな単語はひらがなのあとにひらがな以外の文字が続くところより前の部分と判断したい

  • テキストから特定の文字列をすべて抽出する方法

    例えば、「今年のホワイトデーにはお菓子の詰合せを贈ろうと思う。」というテキストファイルがあり、このテキストの『ホワイトデー』と『お菓子』という文字列を抽出し、その文字列に対して外部リンクを設定してページに表示させる場合の処理について、教えていただきたいです。 まず目的の文字列の前後には<w1>~<w2>という文字を付けておき、 文字列中から<w1>~<w2>を検索してその値を返そうとしています。 $str="今年のホワイトデーにはお菓子の詰合せを贈ろうと思う。"; preg_match('/<w1>(.*?)<w2>/is', $str, $keyword); この処理でいけば、マッチした文字列が$keywordに代入されます。 しかし、テキストに2つ以上の<w1>~<w2>がある場合、 そのすべてを抽出することができません。 プログラミング(php)は始めてまだ半年ぐらいなので、まだまだ初歩のレベルです。 どなたかこの抽出処理の部分についてご教授いただけますでしょうか? よろしくお願い致します。

    • ベストアンサー
    • PHP
  • ワード英単語の表示の方法

    ワードでローマ字を並べて英単語を作るとき、例えばWindowsと書くとします。 1.各ローマ字の横幅を同じにする。・・・1行の文字数が最初からわかるが、単語が見てくれ悪い。 2.iの横幅をWの半分くらいにして、Wの右横にくっ付けるように書く。1行に何文字入るか分からないが単語は格好いい。 などの方法があると思います。このような表記のことについてインターネットで検索しているのですが、キーワードが分からないため探せません。 A:これは何というキーワードで検索すればいいのでしょうか。「フォント」とは違うようですが。 B:ワード(2010)の設定にあるようなものでしょうか。 C:話は別になるかもしれませんが、日本語の中に英単語を入れると、前後にスペースが自動的に入るようですが、これの設定はどこにあるのでしょうか。  よろしくお願いします。

  • 文字検索結果のリスト化で困っております

    文字検索の質問です。どなたか助けてください。複数のテキストファイルの中から指定した文字(2種類)を検索して、抽出した文字の行内容をcsvリストで作りたいのですが、方法が分かりません。秀丸エディタでgrepを使用すると検索できることがわかりましたが、ファイル名までの表示で指定した文字が抽出できずEXCEL化の方法がわからないのです。 日時=xx時cc分 利用者=YAMADA このような記述があるxxx.txtが1000個あります。1000個のテキストファイルから日時と利用者を抽出してYAMADAが何件あるかEXCEL化して利用率を調べたいのです。どうぞよろしくお願い致します。