投稿

5月, 2021の投稿を表示しています

ワードクラウドを自作する②

イメージ
ワードクラウドを自作する② ワードクラウドを自作する② 前回 C#でワードクラウドを自作しました。しかし、文字が重なったり、はみ出してしまったりと課題は色々とありました。なので今回は前回出た課題を解決し、より見やすいワードクラウドに改善したいと思います。 前回の画像がこちら 問題は描画する左上の座標のみしか指定していないこと、描画した場所を記録していないため重なる描画をしてしまうことです。そのため。描画する文字が縦横どのくらいの長さになるのか計測することと、描画場所を記録できる仕組みを作る必要があります。 描画する文字列の長さは MeasureStringメソッド を使用し縦横の長さを取得することができるため、このメソッドを利用したいと思います。また、描画場所については2次元配列で管理する方針で進めたいと思います。 なお MeasureStringメソッド を使用するためには、一度Graphicsに描画するため、計測用のGraphicsを用意します。 文字がはみ出さないようにする まずは、「文字がはみ出す問題」を解決したいと思います。 文字がはみ出してしまう原因は、描画する文字列のx座標とy座標の終了値が生成する画像の右のx座標と下のy座標を超えてしまっていることです。 なので描画する前に、描画予定の文字列の長さを取得し右上と左下の座標が描画範囲に収まっていることを確認します。そのうえで描画可能であれば文字列の描画を行います。 コードで実現すると以下のようになります。(長さを取得するために描画するBitmap(demoG)を用意しています。) var size2 = demoG.MeasureString(str, fontData); if(height <= size2.Height+y ) { return false; // 描画できないのでfalseを返す } else if(width <=

ワードクラウドを自作する①

イメージ
C#でWordCloudを自作する① WordCloudを自作する 以前、C#でスクレイピングと形態素解析を行うプログラムを自作してきましたが、今回はこれらのプログラムで収集したデータを活用するべく ワードクラウド を自作しようと思います。 スクレイピング同様にWordCloudをするならPythonって感じがしますが、私はやっぱりC#で作成したい!! ということで、C#でWordCloudを自作しようと思います。ちなみにライブラリを使用するのではなく、1から自分で作るつもりでいます。 作るイメージ WordCloud を作るイメージとしては、まず単語の個数が多ければ字を大きくする。そして色々なところに単語を配置する。これらを描画するための Bitmap を使用する感じで行きたいと思います。 描画用のBitmapを用意する 単語を描画するための土台として Bitmap を使用します。 そして字を描画するために Graphics の DrawString を使って図を作成します。 このあたりはまだ知識不足で、もっと良い方法などあれば教えていただきたいです。 Bitmap img = new Bitmap(400, 200); Graphics g = Graphics.FromImage(img); 頻度に応じて字を大きくする 今回は試作として頻度の多い上位10個を描画します。データ自体は単語と個数を保持している List で管理しているため、事前に文字の大きさを決めておけば、総数に対する比率をかけることで単語の大きさを調整することが可能になります。

C#で形態素解析をしてみる

C#で形態素解析 C#で形態素解析をしてみる 以前 スクレイピングのコードを自作してみる にて、C#でスクレイピングを行うコードを紹介しました。 今回は、そのコードを活用し情報を集めるプログラムを作成したので集めた情報を活用するべく、形態素解析を行い単語ごとに区切るプログラムの作成をしました。 スクレイピングもそうなのですが、形態素解析も普通は Python を使用することが多いと思いますが、せっかくなので今回もC#を使用して作成を行おうと思います。 「形態素解析、ライブラリ」で検索を行うと janome や mecab などがよく出てくると思います。私も以前Pythonで形態素解析のプログラムを作成したときは janome を使用しました。ですがそもそもPythonが書きづらく、少しのコードでも時間がかかりました。。。 今回はC#を使用するので、「C#、形態素解析」などで検索し、上位にあった Mecab を使用することにしました。 コーディング 私はコーディングにVisualStudioを使用しているので、NuGetからインストールを行いました。 プロジェクトタブからNuGetパッケージ管理を選択し、表示される画面にて、 Mecab.DotNet と検索し、インストールします。 これで下準備は完了です。 いよいよコーディングですが、今回形態素解析後に収集するものは名詞のみにしております。 形態素解析解析を行う機能は、引数を対象の文字列、戻り値を分解後にカンマ区切りで接続した文字列としたメソッドを作成しました。この方が複数の文字列を分解するとに楽なので。 private static string ExtractionNoun(string text) { string resultText = ""; var tagger = MeCabTagger.Create();

C#でPowerShellを操作してみる

C#でpowershellを操作する C#でPowerShellを操作してみる もともとC#でのコーディングをしていますが、仕事で PowerShellコマンド を使うことがでてきました。 別にPowershellコマンドで読み込んだデータを処理することもできるのですが、なぜかデータの絞り込みができない状態にあい、どうにかコマンド後にデータ操作できないかと考えていました。 そこで行き着いた答えが、Powershellコマンドでデータをログファイルなどに出力し、C#側でログファイルを読み込んで操作すれば良いと行き着きました。 powershellだけでもやりようはあると思いますが、慣れているC#に逃げたわけです。。。 しかし、Powershellコマンドとexeが別で起動させるのも面倒ですので、今回はC#側からPowershellコマンドを実行し、そのままファイル読み込みを行う方針で実装しようと思います。 C#でPowershellを操作するには C#でPowershellコマンドを使用するには、 System.Management.Automation.dll を使用します。 上記dllファイルは「C:\Program Files (x86)\Reference Assemblies\Microsoft\WindowsPowerShell\3.0」のパスに存在しています。 もし上記のパスに存在しない場合は、「C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Management.Automation\v4.0_3.0.0.0__31bf3856ad364e35」にあるかもしれません。パスのバージョン名などは環境によって異なるかもしれないので、そこはご自身の環境に合わせてください。 実際のコードとしてはシンプルで、powershellコマンドを文字列として作成するか、ps1のファイルを指定できるようにします。その文字列も

スクレイピングのコードを自作してみる

自作スクレイピング スクレイピングクラスを自作してみる プログラミングの勉強や調べ物をしてると スクレイピング という言葉を見かけることが多いと思います。スクレイピングとは、あるサイトに記載されている情報の収集をプログラムで自動化することを言います。 人がわざわざサイトにアクセスし内容をメモして、また次のサイトにアクセスして。。。という行動を自動化させ、効率的に必要な情報を集めているのですね。 おそらく スクレイピング で検索をかけると python がよく出てくると思います。pythonにはスクレイピングに関するライブラリなどが充実しているので、簡単にコードを書くことが可能です。 しかし私は python はほぼ未経験です。これを機に python を勉強してもよいのですが何を間違えたのか、今回私は C# で書き、かつライブラリを使用せずに自作でスクレイピング用のコードを書いてみようと思いました。笑 なので、今回は スクレイピングとは を簡単に勉強し、自作したコードについて書いていこうかと思います。 スクレイピングとは さきほど記述しましたが、 スクレイピング とは、プログラムを使用してWebサイトから自動的に情報を収集することを指します。これにより、自分自身の労働を経減らすことができるので効率よく情報集ができるようになります。 これなら調べ物は全てスクレイピングにしてしまえば良いのでは?と思うかもしれません。しかし、このスクレイピングには注意すべきこともあり、一歩間違えると犯罪になる可能性もあります。そのため、スクレイピングをする場合には自己責任でお願いします。。。 何がどう犯罪になるのか?ですが、分かりやすいところでいくと 著作権侵害 などですね。 情報収集するためにアクセスするサイトの情報は、あくまでもそのサイトを運営している企業などものになります。そのため、取得自体は問題にならなくても、取得したデータを公開したりしてしまうと著作権違反になってしまう可能性があります。