• ベストアンサー

同じ種類の単語だけを抽出したい

mitarashiの回答

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.1

Excel VBAのコードです。先日文章中の特定文字列のカウントの回答をしたものを改造してみました。ご呈示の文例では動作しましたが、他の文例に対しても適用できるかどうかは不明ですので、あらかじめ言い訳をしておきます。 'A部のコメントアウトを外すと、テキストファイルを読み込んで処理します。(Wordのファイルではありませんので悪しからず。Wordからテキスト形式で保存してから処理してください。実際のテキストファイルのパス、ファイル名に合わせてコードを変更して下さい。) その場合、B部のテストデータ部はコメントアウトして下さい。 末尾のmyCellPrintは、debug.printで試験したのを書き換えるのが面倒なので、ワークシート上でシミュレートしようと即興で作成してみました。分かり難くしているだけと思いますがご容赦下さい。 Dim rowCounter As Long Sub Test() Dim FSO, buf As String Dim strPattern As String Dim srcFilePath As String Dim Matches As Variant Dim i As Long, j As Long Dim myDic As Object Dim myKey As Variant Dim hitWord As String 'A:read from Textfile ' srcFilePath = "C:\Documents and Settings\?????\デスクトップ\testText.txt" ' Set FSO = CreateObject("Scripting.FileSystemObject") ' With FSO.GetFile(srcFilePath).OpenAsTextStream ' buf = .ReadAll ' .Close ' End With ' Set FSO = Nothing 'B:Test Data buf = "What_2 is_1 a_1 burrito_0? What_2 is_1 that_3?" rowCounter = 0 Cells.Clear For j = 0 To 9 Step 1 strPattern = "(\S+)_" & CStr(j) & "[ .?]" With CreateObject("VBScript.RegExp") .Pattern = strPattern .Global = True Set Matches = .Execute(buf) End With myCellPrint j If Matches.Count > 0 Then Set myDic = CreateObject("Scripting.Dictionary") For i = 0 To Matches.Count - 1 hitWord = Matches(i).submatches(0) If Not myDic.exists(hitWord) Then myDic.Add hitWord, 1 Else myDic.Item(hitWord) = myDic.Item(hitWord) + 1 End If Next i myKey = myDic.keys For i = 0 To myDic.Count - 1 myCellPrint myKey(i), myDic.Item(myKey(i)) Next i Set myDic = Nothing End If myCellPrint Next j End Sub 'debug.print をワークシートでシミュレートしたつもり Sub myCellPrint(Optional arg1 As Variant, Optional arg2 As Variant) If rowCounter = 0 Then rowCounter = 1 If Not IsMissing(arg1) Then Cells(rowCounter, 1).Value = arg1 If Not IsMissing(arg2) Then Cells(rowCounter, 2).Value = arg2 End If rowCounter = rowCounter + 1 End Sub 正規表現でパターンマッチングしています。 strPattern = "(\S+)_" & CStr(j) & "[ .?]" のところは環境に合わせて修正して下さい。 「VBA 正規表現」で検索すると多数参考サイトが見つかります。

junpei12
質問者

補足

mitarashiさま、ご返答いただき、ありがとうございます。 せっかくVBAコードを書いていただいて恐縮ですが、、VBAの知識がなくExcelに組み込むことすらできないので、残念ながら実行出来ません。 もしもお時間があるようでしたら、エクセルのど素人にも分かるように使い方を教えていただけないでしょうかm_ _m

関連するQ&A

  • 単語のリスト

    英語で一番よく使われている単語は、 the of and a is in he to have it だそうですが、もっと後のほうまで、リストがないでしょうか? あまり使われていない単語まで、何番目くらいの頻度で使われているかを知りたいのですが。

  • OpenOfficeで対象セルの単語抽出

    OpenOffice.Calcで家計簿を作ってます。 例えば【A列が支出費目】【B列が品名】だとして A列(費目)が【食費】という時だけB列(品名)を 違うシートにリスト化したいんですが出来ますか? B列は数字ではなく全て単語(じゃがいもなど)です。 また、A列は入力規則でリストから選ぶ様に設定しています。 なのでA列には食費や家賃、交通費など色々な単語が入ってるんですが その中が食費という時だけB列の単語を抽出したいんです。 分かる方居ましたらお願いします!!

  • 英文から英単語の抽出をしたい

    こんばんは HTML、テキストファイル、pdfファイルなどの英文のソースがあったときに、そこで使われている英単語を抽出してテキストファイルやExcelなどで英単語のリストを作りたいのですが、何かよい方法はあるでしょうか?少し調べてみたのですが、形態素解析などをすることになるのでしょうか?どなたか教えていただけると幸いです。 例えば、 「No other region has demonstrated the fragility of both human society and the international community more markedly than Africa.」 という英文があったとき、 Africa and demonstrate has other region … のように単語を抽出してくれて、できればその意味も Africa:アフリカ and:そして demonstrate:証明する has:持つ other:他の region:地域 … のようにできるととても助かります。

  • B列とC列の両方に存在する単語を抽出したい

    エクセルで、添付画像のように、「A列に頻度、B列に単語」が書かれています。 B列とC列の両方にある単語を抽出して、「E列に単語を、D列にその単語の頻度(A列の情報)」を書き出したいと思っています。 良い方法をご存知のかた、教えていただけますでしょうか?m_ _m

  • エクセル2007において、別々のデータの一致するものを削除したい。

    エクセル2007において、別々のデータの一致するものを削除したい。 ある文章中における英単語の出現頻度のリストAがあります。この中にだいたい3000語の単語とその出現頻度の数値が並んでいます。リストBに中学1年で習う英単語約400語が並んでいます。リストAからリストBの英単語と一致するものを削除したいと考えています。どのように行えばよいのか見当がつきません。参考になる情報を教えてもらえませんか。

  • エクセル2007にて、先頭が大文字の英単語のみを削除したい。

    エクセル2007にて、先頭が大文字の英単語のみを削除したい。  ある文章中に含まれる英単語の出現頻度のリストがあります。その英単語のうち、単語の先頭1文字が大文字で表記された英単語のみを削除したいですが、何か効率的な方法はないでしょうか。たとえば、GlanとかRobertというような単語を削除したいと考えています。よろしくお願いします。

  • Excelマクロによる単語リストの結合

    Excelマクロによる単語リストの結合についてご教授願えませんでしょうか。 2つの単語リストAとBとがあります。 (例) <単語リストA> go 3 work 4 (以下省略) <単語リストB> go 4 hear 5 (以下省略) 上の二つの単語リストA、Bを以下のように結合したいのです。 リストA リストB go 3 4 hear 0 5 work 4 0

  • 様々な「服」の単語?

    NHKラジオ英会話講座より What a glamorous outfit you have on. Are you going somewhere special tonight? I don't think I've ever seen you dressed that way. (質問)a glamorous outfit (魅力的な服)でふと疑問が湧きました。 服を表す単語は様々あります。ちょっと調べただけで、clothes/clothing/dress/costume/wear/apparel/garment/suit等があります。単語が違えば使い方も違うと思います。 (1)outfitは他の単語と置き換え可能ですか? (2)各々の単語が持つフィーリングの違いを教えていただけませんか? 日常会話で使い分けられれば素敵だと思います。宜しくお願いいたします。以上

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

    英・仏・独語の多数のテキストファイルから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ですが、その場合は、初歩的なことしかわかりませんので、アドヴァイスというより丸投げしてしまうことになります。 どうかよろしくご助言をお願いします

  • Windows版Perlでの行の抽出の問題

    Windowsのバッチファイルで、Perlを使って特定の文字列を含む行を抽出する処理を行っているのですが、うまくいかないケースがあります。 例えば、以下の線内のようなテキストがあって、 ---------------------- 〔a 〔A ゜a ゜A ---------------------- 大文字/小文字を問わず、「〔a」を含む行を抽出し、 以下の線内のような結果を得たいとします。 ---------------------- 〔a 〔A ---------------------- 検索対象ファイルの文字コードが「Shift-JIS」で、 「print if ( /〔a/i );」という構文で行を抽出すると、 以下の結果になってしまいます。 ---------------------- 〔a 〔A ゜a ゜A ---------------------- 「print if ( /〔a/ );」なら以下の結果になってしまいます。 ---------------------- 〔a ---------------------- 検索対象ファイルの文字コードを「UTF-8」にし、 「print if ( /〔a/ );」という構文で、 「〔a」を含む行を抽出しようとすると、何も行が抽出されません。 他のコマンドでの大文字/小文字問わない「〔a」を含む行の抽出は、 findstrでは得たい結果が得られ、 grep、AWKでは、Perl同様、「゜a」を含む行が抽出されてしまいます。 しかし、私が行いたい処理は、数百~数千程度の単語が書かれた単語のリストがあり、そのリストをスクリプト形式に置換して行を検索するので、スクリプトファイルに対応していないfindstrコマンドでは不便なのです。 上記の問題の原因が分かる方がおられましたら、お教え頂けないでしょうか。

    • ベストアンサー
    • Perl