言語処理100本ノック05(C#)

05. n-gram

与えられたシーケンス(文字列やリストなど)からn-gramを作る関数を作成せよ.この関数を用い,"I am an NLPer"という文から単語bi-gram,文字bi-gramを得よ.

  • n-gramとは、任意の文字列や文書を連続したn個の文字で分割するテキスト分割方法。特に,nが1の場合をユニグラム(uni-gram),2の場合をバイグラム(bi-gram),3の場合をトライグラム(tri-gram)と呼ぶ。
  • 文字単位のn-gramは、n文字単位で分割するが、単語単位のn-gramはn単語単位で分割する。だから分割前に形態素解析を行い単語単位での分割が必要。

→英語の場合の文字単位の分割時、スペースはどうなるのだ?

  • n-gramについてわかりやすい記事はこれだと思う。

日本語の文章で文字N-gram

そもそもN-gramがよくわからなかったので、さらっと調べて実装したんだけど、英語みたいに単語と単語の間にスペースがある場合は使えないし、これは単語と文字のN-gramは別のアルゴリズムを使うしかないことがわかったので、とりあえず墓場として置いておく。 単語N-gramを実現するためには、形態素解析を実施する必要があるが、paiza.IOでMeCabが利用できず、利用できるって書いてあるので問い合わせをしているところ。

using System.Linq;
using System.Collections.Generic;

public class MainClass{
    public static void Main(){

        GetNgramList(2, "今日はいい天気ですね。").ForEach(item => System.Console.WriteLine(item));
    }
    
    public static List<string> GetNgramList(int n, string target)
    {
        List<string> ngramList = new List<string>();
        for(var i=0; i<target.Length-n+1; i++)
        {
            ngramList.Add(target.Substring(i, n));
        }
        return ngramList;
    }
}