今回は、N-gram(エヌ-グラム)とは何かについて、解説したいと思います。
※個人的に収集した知識です。正確ではない表現や、大きな誤り等があるかもしれません。お気付きの際はご指摘いただけると幸いです。
N-gramとは
概要
文章を分割する方法。文章をN文字単位で区切る。
1文字で区切るunigram、2文字で区切るbigram、3文字で区切るtrigramなどがある。
日本語の場合、文章をそのまま文字単位で区切る方法と、形態素解析を実施した後に、単語単位で区切る方法の2種類が存在する。
恐らく例を見るのが一番分かりやすいです。
例:元の文章「今日学校に行く」
bigram(文字単位):今日, 日学, 学校, 校に, に行, 行く
bigram(単語単位):今日学校, 学校に, に行く
以上の通りやりたいことは実に簡単です。
google検索などの検索エンジンで使用されているのですが、これを知った時は、正直これって役に立つの?と思いました。
N-gramを使わずにMeCabなどを用いて形態素解析をしたら十分だと思ったからです。
もちろんN-gramにも利点があります。
例えばこれまでは存在していなかった単語(略語や造語など)を取り扱う際に、形態素解析だとその単語を認識できず、検索がうまく行えない可能性があります。
その点N-gramだと、機械的に文字を分割して検索を行えますので、そうした単語の検索でも比較的正しい検索が行えると考えられます。
コード
実際にpythonで作成したコードは以下。
def n_gram(phrase, n, word=True):
outcome_list = []
if word == True:
phrase_list = phrase.split()
for i in range(len(phrase_list) - n + 1):
outcome_list.append(phrase_list[i:i+n])
return outcome_list
else:
phrase = phrase.replace(" ", "")
for i in range(len(phrase) - n + 1):
outcome_list.append(phrase[i:i+n])
return outcome_list
こちらのコードでは、英語の文章についての文字・単語単位のN-gramとなっています。
※文字単位の場合は、スペースは除いて出力するようにしています。
N-gramに関しては多くの方が色々なコードで作成しております。
ぜひ他の方のコードもご参考にしてください。