見出し画像

テキスト分析の大通り#08: 係り受けとngram

縦持ちした形態素解析の結果を見ていく方法として、係り受け、もしくはngramという方法を見ていきます。これは単語の発生順序を集計する方法で、例えば「春日」「ピンク」「ベスト」「着る」といった単語がこの順序で発生した場合、これを「春日」「ピンク」と、「ピンク」「ベスト」、「ベスト」「着る」といった形で単語を1つずつずらしてグルーピングし、それを集計してみていく方法です。これを見ることによって、どの単語がどの単語にかかっているのか、どの単語とどの単語が連結されることが多いのかを理解できます。ngramもこれと同じ考え方で、任意の数の、順序だった単語の発生順序をグルーピングします。上述のケースはngram=2で、ngram=3であれば「春日」「ピンク」「ベスト」と、「ピンク」「ベスト」「着る」といった形となります。
利用目的は大きく2つで、1つはたくさんの文書があるなかで発生頻度が高い単語の並びから、共通して言われていること、メジャーな意見やトピックなどをピックアップすること、そしてもう1つは辞書登録単語の候補を見つけ出すことです。以下に処理を見ていきます。


ngram=2もしくは係り受け

処理SQLのサンプルを以下に示します。npathと呼ばれるパターンマッチングを行うテーブル関数を実行しています。単語(word)ではなく、正規化された表現(norm)を採用するのは、表現の揺らぎを矯正するためです。

docid(文書), seqno(単語の発生順序), norm(単語)というデータがあるとして、これをon句内に指定します。where句の中は前回確認した除外対象の文字列です。これに対して、docid単位(partition by)で、seqno順(order by)でデータを走査していきます。そしてその際、1行ずつ行をずらしながら(overlapping)、あらゆる行(true as A)をシンボルとして用いて、A.A(1行目と2行目、2行目と3行目)というパターンマッチングにかけています。最後にこの関数内における出力(result)として、最初のdocid、最初の単語(n1, A.Aの前の方)、次の単語(n2, A.Aの後ろの方)を出力し、うわかぶせした最後のクエリーにおける入力にしています。全体のクエリー文の最初(処理的には最後)の方ではn1,n2の組み合わせごとに集計し(cnt)、最終結果を取得しています。これによって得られた結果が以下です(一部割愛)。

「ボケ」「担当」と「ピンク」「ベスト」が2件、以降は1件ずつで出力されました。元のデータが小さいため、件数が寂しいですが、より多くのデータを用いた場合、上位にはよく併用される単語のパターンが並びます。ちなみにこれを可視化したのが以下です。

係り受けのネットワーク図

ネットワーク図を用い、点で単語を、線でn1からn2への関係を示し、線の色と太さで件数の大きさを示しています。太い、緑の矢印は上述の2パターンで示されています。またテレビ、ボケ、ツッコミなどが他の単語と関係性が強いことが分かります。単純なパターンの多さ少なさは表でもわかりますが、このような関係性はネットワーク図を用いないとわかりずらいです。


ngram=3

ngram=3の場合は、SQLが以下の通りとなります。結果の一部も併せて。

ngram=2との違いとしては、3単語の並びを集計するので、パターンがA.A.Aとなること、それから真ん中のシンボルを出力するため、nth(n番目)の指定があることくらいでしょうか。ngram>=3は可視化が難しくなるため、どちらかというと辞書登録候補や、頻出する単語パターンを理解するために用いることが多いかと思います。あくまで経験上ですが、ngramの数は2、3、4程度まで見ればおおよそのパターンを理解できると思います。テキスト分析において特に重要となるのは、辞書登録などを通じて単語の揺らぎをなるべく少なくすることです。同じこと、例えば「ツッコミ」という単語意を指しているのに、「ツッコミ」「つっこみ」「突っ込み」といった表層表現で泣き別れていると、単語の重要度や、前後で係り受ける単語との関係性を正確に評価できなくなります。実際の分析においても時間的に非常に大きな割合、例えば8割から9割を単語の矯正に費やします。

(TeradataやPython、およびPythonライブラリのインストールや環境構築、辞書登録、参考にしたページ等は以下にまとめています)

///

#analytics #ngram #npath #形態素解析 #text #nlp #データ #分析 #teradata #sql

この記事が気に入ったらサポートをしてみませんか?