期待する結果を得るためにはMeCabで処理をする前に大文字小文字の統一、全角半角の統一が必要になります。私の場合は「英数字は半角小文字」「カタカナは全角」で統一することにしました。

 

ある程度入力データが小さく、全角または半角どちらか一方にのみ統一する場合はExcelJISまたはASC関数を使うことができるのでプログラムが面倒な場合はこちらを利用すると楽だと思います。(私も最初はそうしていました)

 

ではC#で実際にプログラムすると・・・結構大変なようです。そこでVB.NETStrConvを使う事にしました。ソリューションにVB.NETのクラスライブラリプロジェクトを追加してC#からStrConvを呼び出すようにします。

 

さて、実際にクラスライブラリを作成しようと思ったのですが、この手の話は良く聞きますしすでに誰かが作成している可能性が高いので、ネットで探してみました。するとズバリなブログが(^-^)。ブログ作者の方ありがとうございます。

 

VB.NETで全角英数字のみを半角にする

http://www.tech-do.com/blog/archives/64

 

これで仮に入力が

Office 2010のメニューのカタカナが半角のようで全角な件について。

(実際どっちなんでしょう・・・「フォルダー」の濁点を見る限り全角ですよね?)

office 2010のメニューのカタカナが半角のようで全角な件について。

と変換されてMeCabに渡すことができます。

 

-----C#

strLine = CStrConv.StrConvAlpha(strLine);
strLine = strLine.ToLower();

-----VB.NET

Imports System.Text.RegularExpressions

Public Class CStrConv

Public Shared Function StrConvAlpha(ByVal strInput As String) As String

Dim strLine As String
Dim regexString As String

regexString = "[ア-ンァィゥェォャュョッ。「」、・ヲー゙゚]+"
strLine = StrConv(strInput, VbStrConv.Narrow)

Dim rKana As Regex
Dim mev As MatchEvaluator

rKana = New Regex(regexString, RegexOptions.Singleline)

mev = New MatchEvaluator(AddressOf ToWide)
StrConvAlpha = rKana.Replace(strLine, mev)

End Function

Private Shared Function ToWide(ByVal m As Match) As String

ToWide = StrConv(m.ToString, VbStrConv.Wide)

End Function

End Class