Back to Top

プログラムの覚書

VB.NET ランダムストリング

ランダムに文字を選び文字列を作成する方法を記載します。

0-9 A-Z a-z の範囲の半角文字にて、ランダムに文字を選び文字列を作成します。

アルゴリズムは、多々あると思いますが参考までに記載します。

ランダムストリングの作成

''' <summary>
''' 0-9 A-Z a-zの範囲でランダムに文字列を作成する
''' </summary>
''' <param name="size">作成する文字列のバイト数</param>
''' <returns>文字列</returns>
Private Function RandomString(size As Integer) As String
    Dim builder As New StringBuilder()
    Dim random As New Random()
    Dim no As Integer

    For i As Integer = 0 To size - 1
        no = random.Next(0, 62)
        If no <= 9 Then                 '0-9(&H30-&H39)   
            no = no + &H30
        ElseIf no <= 35 Then            'A-Z(&H41-&H5A)
            no = no + (&H41 - 10)
        Else                            'a-z(&H61-&H7A)
            no = no + (&H61 - 36)
        End If
        builder.Append(Convert.ToChar(no))
    Next

    Return builder.ToString()
End Function

 

VB.NET NMeCabの使い方

NMeCabの使い方に付いて記載します。

NMeCabは、形態素解析をするMeCabをライブラリ化したものなので、MeCabと同じような使い方になります。

・NMeCabをインポートします。

 

メソッド

  • Parse
  • ParseToNode
  • ParseNBest
  • ParseNBestToNode

 

プロパティ

・AllMorphs(該当する全ての形態素を出力)

  • true:一致する可能性のある全ての形態素を出力
  • false:ベスト解のみ

 
・LatticeLevel(索性レベルを指定する)

  • 0 : 最適解のみが出力可能なレベル(デフォルト、高速)
  • 1 : N-best解が出力可能なレベル(中速)
  • 2 : ソフトわかち書きが可能なレベル(低速)

 
・OutPutFormatType(解析結果のフォーマット)

  • “lattice”:(デファルト)
  • ‘wakati”:分かち書き出力
  • “dump”:全情報を出力
  • “none” :何もしない
  • “em”:?

 
・Partial(制約付き解析)

  • MeCabでは、文章の中の「この部分は名詞として」、「この部分は動詞として」といった指定をした上で解析するはずですが、現在うまく動作しません。

 
・Theta(係数)

 

Parseメソッドによる解析

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim text = "庭に鶏が2羽います"
    Dim tagger = MeCabTagger.Create()
    TextBox1.Text = tagger.Parse(text)
End Sub

実行結果

庭	名詞,一般,*,*,*,*,庭,ニワ,ニワ
に	助詞,格助詞,一般,*,*,*,に,ニ,ニ
鶏	名詞,一般,*,*,*,*,鶏,ニワトリ,ニワトリ
が	助詞,格助詞,一般,*,*,*,が,ガ,ガ
2	名詞,数,*,*,*,*,2,ニ,ニ
羽	名詞,接尾,助数詞,*,*,*,羽,ワ,ワ
い	動詞,自立,*,*,一段,連用形,いる,イ,イ
ます	助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス
EOS

 

ParseToNodeメソッドによる解析

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim text = "庭に鶏が2羽います"
    Dim tagger = MeCabTagger.Create()
    Dim node = tagger.ParseToNode(text)
    While (node IsNot Nothing)
        ListBox1.Items.Add(node.Surface + ControlChars.Tab + node.Feature)
        node = node.Next
    End While
End Sub

実行結果

庭に鶏が2羽います	BOS/EOS,*,*,*,*,*,*,*,*
庭	名詞,一般,*,*,*,*,庭,ニワ,ニワ
に	助詞,格助詞,一般,*,*,*,に,ニ,ニ
鶏	名詞,一般,*,*,*,*,鶏,ニワトリ,ニワトリ
が	助詞,格助詞,一般,*,*,*,が,ガ,ガ
2	名詞,数,*,*,*,*,2,ニ,ニ
羽	名詞,接尾,助数詞,*,*,*,羽,ワ,ワ
い	動詞,自立,*,*,一段,連用形,いる,イ,イ
ます	助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス

 

ParseNBestメソッドによる解析

N-Best 解の出力

確からしいものから指定個解析結果を出力 します。

Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    Dim text = "庭に鶏が2羽います"
    Dim tagger = MeCabTagger.Create()
    tagger.LatticeLevel = NMeCab.MeCabLatticeLevel.One
    TextBox1.Text = tagger.ParseNBest(2, text)
End Sub

・LatticeLevelプロパティをOne、Twoにする必要があります。デファルトはZeroです。

実行結果

庭	名詞,一般,*,*,*,*,庭,ニワ,ニワ
に	助詞,格助詞,一般,*,*,*,に,ニ,ニ
鶏	名詞,一般,*,*,*,*,鶏,ニワトリ,ニワトリ
が	助詞,格助詞,一般,*,*,*,が,ガ,ガ
2	名詞,数,*,*,*,*,2,ニ,ニ
羽	名詞,接尾,助数詞,*,*,*,羽,ワ,ワ
い	動詞,自立,*,*,一段,連用形,いる,イ,イ
ます	助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス
EOS
庭	名詞,一般,*,*,*,*,庭,ニワ,ニワ
に	助詞,格助詞,一般,*,*,*,に,ニ,ニ
鶏	名詞,一般,*,*,*,*,鶏,ニワトリ,ニワトリ
が	助詞,格助詞,一般,*,*,*,が,ガ,ガ
2	名詞,数,*,*,*,*,2,ニ,ニ
羽	名詞,接尾,助数詞,*,*,*,羽,ワ,ワ
い	動詞,非自立,*,*,一段,連用形,いる,イ,イ
ます	助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス
EOS

 

ParseNBestToNodeメソッドによる解析

・このメソッドは通常使うことはないと思われます。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim text = "庭に鶏が2羽います"

    Dim param As NMeCab.MeCabParam = New NMeCab.MeCabParam()
    param.LoadDicRC()
    param.LatticeLevel = NMeCab.MeCabLatticeLevel.One
    param.OutputFormatType = "lattice"
    Dim tagger = NMeCab.MeCabTagger.Create(param)

    Dim os As System.Text.StringBuilder = New System.Text.StringBuilder()
    Dim writer As NMeCab.Core.Writer = New NMeCab.Core.Writer()
    writer.OutputFormatType = param.OutputFormatType

    Dim cnt = 2                                 '必要な解析結果の個数
    For Each node As NMeCab.MeCabNode In tagger.ParseNBestToNode(text)
        writer.Write(os, node)
        cnt = cnt - 1
        If cnt = 0 Then Exit For
    Next

    TextBox1.Text = os.ToString
End Sub

 

Posted in NMeCab | Leave a reply