perl で自然言語処理

60
Perl ででででででで でで でで でででででででで () @ overlast 1

Upload: toshinori-sato

Post on 24-May-2015

30.286 views

Category:

Technology


3 download

DESCRIPTION

これから自然言語処理を業務でやってみようとしている技術者を対象にしています。 前半は自然言語処理や学習方法について述べており、後半はWebサービスに適用しやすい自然言語処理技術について述べています。

TRANSCRIPT

Page 1: Perl で自然言語処理

1

Perl で自然言語処理

佐藤 敏紀(さとうとしのり)@overlast

Page 2: Perl で自然言語処理

2

私(佐藤敏紀)の自己紹介• 名前 :佐藤敏紀(さとうとしのり)• ID : overlast ( Twitter : @overlast)• key : 自然言語処理 / 機械学習 / 検索 / 圧縮 / 順序学習• blog : Overlasting::Life(http://diary.overlasting.net/) • 略歴– 2005 年 4 月〜 2008 年 3 月:東工大の奥村研究室

• 自然言語処理(比較関係抽出)の研究– 2008 年 5 月〜 : 某大手ポータルサイト

• 自然言語処理・機械学習技術を Web 文書に応用• 類似文字列検索ライブラリの研究・開発• スペル訂正システムの研究・開発

Page 3: Perl で自然言語処理

3

アジェンダ• 自然言語処理って何?– 何をやったら自然言語処理なの?

• 自然言語処理の勉強のはじめ方

• Web サービスと自然言語処理– 上手な自然言語処理との付き合い方– 改善ポイント発見のためのキーワード

Page 4: Perl で自然言語処理

4

自然言語処理って何?

Page 5: Perl で自然言語処理

5

自然言語処理 (NLP : Natural Language Processing) とは= 「自然言語」をコンピュータで「処理」すること

• 自然言語 (Natural Language)– 人間が意思疎通のために使っている言葉

• 言葉による意思疎通の手法例 : 読み・書き・話し– コンピュータ用の人工言語と区別される

• 自然言語処理– 分野 : 人工知能 + 言語学

• 内容 = 解析をする際にどのように高い性能を達成するか– 計算言語学 (Computational Linguistics) と関連

• NLP と聞いて神経的なモノを浮かべては駄目

Page 6: Perl で自然言語処理

6

自然言語処理技術の応用例Google 日本語入力 - CGI API

Page 7: Perl で自然言語処理

7

自然言語処理技術者に必須な要素

• 扱うデータに含まれる言語に関する知識– 言語に関する文法、用語– テキストデータ中の単語の分布、文の構造など

• 必要な処理を実現できるプログラミングスキル– 実現したいことによって、必要なスキルが異なる

• できれば確率・統計に関連する知識– 何をやる場合でも、ほぼ必ず必要になる

Page 8: Perl で自然言語処理

8

自然言語処理に関連する知識・技術

• 自然言語処理を実現するための知識– データ構造とアルゴリズム、機械学習、代数学、離散数学、

グラフ理論、確率統計、情報理論、データ圧縮、組み合わせ最適化など

• 自然言語処理の基盤技術– 形態素解析、構文解析、意味解析、文脈解析など

• 自然言語処理技術を応用して実現できる技術– 情報検索、固有表現抽出、テキストマイニング、情報抽出、

かな漢字変換、機械翻訳、文書分類、 OCR 、スペルチェック、音声認識、自動要約など

このあたりが自然言語処理と呼ばれる

Page 9: Perl で自然言語処理

9

自然言語処理の勉強のはじめ方- これから勉強する人向け -

Page 10: Perl で自然言語処理

10

日本語の教科書などを読む• 自然言語処理の基礎(奥村学 著)

– 薄いので読みやすい• 自然言語処理(長尾真 著)

– 多少(かなり ? )古いが網羅的• 基礎日本語文法(増岡・田窪 著)

– 日本語の自然言語処理に必要な用語を知る• 言語処理のための機械学習入門

– 自然言語処理を学びつつ機械学習にも入門できる• 生駒日記:NAISTの小町守さんのブログ

– NLP 関連の良質な記事をピックアップして下さる– 毎日読んでいれば理解が深まる (半年 ROM)– 海外インターンに行きたくなる(副作用)

Page 11: Perl で自然言語処理

11

英語の教科書などを読む• 最初の参考書

– Foundations of Statistical Natural Language Processing• 多少古いが、未読なら通読する価値がある• 様々な自然言語処理の研究室で読まれている• 略称 : FSNLP

• 学会・研究会– 自然言語処理の学会

• PFI の岡野原さんによる学会の解説– Link of NLP/CL Conference

• 東京大学喜連川研特認助教の吉永直樹さんのリスト。便利。– ACL Anthology– 情報処理学会電子図書館( 有料 )

– ACM Digital Library( 有料 )

Page 12: Perl で自然言語処理

12

勉強会・研究会・学会に参加する

• 勉強会・コミュニティ– 自然言語処理勉強会@東京

• @nokuno さんが主催。参加時の心理的ハードルが低い。– NLP若手の会

• 研究会や勉強会を頻繁に開催している。• 研究会– 情報処理学会の自然言語処理研究会

• 定期開催しているので割と気軽に参加できる。• 学会の全国大会– 言語処理学会の年次大会 => お祭。参加すべき。

Page 13: Perl で自然言語処理

13

その他のおすすめ資料• 集合知プログラミング

– 自然言語処理の応用を体験できる– Python のコードを見ながら Perl で書く

• 大規模サービス技術入門(伊藤・田中 著)

– 通読すると何かをやった気分になれる• 入門 自然言語処理

– Natural Language Processing with Python の邦訳– オライリーさん。 12章が日本語で書き下ろし

• 情報検索と言語処理-言語と計算-徳永(徳永 著)

– おすすめ。 Amazonで本書の関連書籍を見ると良い。• 「たつをのChangeLog」のサンプルコード

– Perl で WebAPI から得た結果を加工するサンプル

Page 14: Perl で自然言語処理

14

自然言語処理に必要な 3つの心構え• 最初は簡単に実装し、徐々に洗練する– 簡単で効果が高いところから解決しよう

• 機械はミスをする– 多少の間違えは諦めよう。 70% 正解してれば十分

• データは自前で集めて、自前で管理する– 他社の API や外注に依存しきるのは危険

Page 15: Perl で自然言語処理

15

簡単な方法からやって、洗練する

• 最初に

『かなり効果が高い & 割と簡単に導入できる』

 技術に絞って開発し、サービスに導入する。

• 導入後にユーザの動きが変わるので、ログを分析し、次に効果が高い技術を考える

Page 16: Perl で自然言語処理

16

機械はミスをする• 人間は優秀。機械では真似しきれない。– 例:以下の文から、日本語の誤り箇所を探せ• ちょっと、そのケーブルで貸して下さい

• 一度は紙と鉛筆を用意して問題を解こう– どの位の精度が期待できるかを試そう。– 例:リンゴを分類して、分類精度を得てみよう• リンゴとみかんを分類

– 簡単すぎ• 甘い赤リンゴと甘くない赤リンゴを分類

– 難しすぎる (世の中には、この分類をする仕事がある )

Page 17: Perl で自然言語処理

17

日本語の口語文テキストは難しい• 難しい自然言語処理には間違えがつきもの。

• 多くの自然言語処理技術がもっている仮定– 形態素解析器などによる分かち書き処理は 100% うまくいく

  • 実際には、 100% うまくいくわけではない

– 多くの形態素解析器は新聞のような文書向けに調整済み– ブログや Twitter の文書は新聞テキストより解析が難しい– そのため、形態素解析以降の処理にエラーが出てくる

• 多少の間違えは許容しよう。気にしないこと

Page 18: Perl で自然言語処理

18

データは自前で集め、自前で持つ• データを自分で収集しなかった場合

– 他人がデータに何か処理を行なっていた場合に困ることがある

• デーやを自前で持っていなかった場合– ある日、他社が提供する API が止まるとサービスが続行できなくなる

• データをネットワーク越しに利用している場合– 頻繁なデータ転送に時間を食ってしまう– データが超巨大な場合は解決できないので諦めて良い

• 理想:言語処理用データは計算機のローカルディスクに置く– 自然言語処理をすると必ず意外に長い処理時間がかかる。

• 自然言語処理はアプリケーションのメイン処理ではない– ソートとか正規化とか、事前にできることは全て事前にやっておく

Page 19: Perl で自然言語処理

19

Web サービスと自然言語処理

いざ実践!!

Page 20: Perl で自然言語処理

20

自然言語処理は最初は意外と簡単• 自然言語処理は

– Web サービスを盛り上げるスパイス、と考えてみよう• 塩やコショウのようなもの。

• 何かを始められるかどうかの目安– 自分の計算機上で形態素解析器を動かして、

何かの文書における単語の出現頻度をカウントできる

• 技術を使いこなすことや、オリジナル手法を考えようとすると、難易度が飛躍的に上がる– 最初は Web API やライブラリを利用すれば OK– 試作は Perl でサクッと作れば OK

Page 21: Perl で自然言語処理

21

課題を見つけてチャレンジする• データの獲得手法– 自社・他社が提供する API を使用– 他社からデータを購入・提供– 自社で独自にデータ収集

• データ処理の手法– 自社・他社が提供する API を使用– コンピュータを用意。ライブラリをインストール・使

用– 自分でライブラリを開発

Page 22: Perl で自然言語処理

22

Web サービスにありがちな悩み• サイト内のユーザ回遊性を高めたい• データはある。だけど、検索できない• 単語 A と単語 B って一緒にならないの?• ユーザが全アイテムを見てくれない• ソートの順序が気にいらない• データにカテゴリ的なものを付けたい

→ これらの問題は導入が簡単で効果も高い

Page 23: Perl で自然言語処理

23

0/7

Page 24: Perl で自然言語処理

24

Web API を使って問題解決• もう皆さん飽きてますよね。

• 他の方が沢山プレゼンをしてるはずなのでググってください。

• 個人的には、他者が提供しているAPIへの依存を減らした方が良いと思います。

Page 25: Perl で自然言語処理

25

1/7

Page 26: Perl で自然言語処理

26

サイト内のユーザ回遊性を高めたい→ 『レコメンド』• あるユーザの興味をひきそうな「アイテム」や「ユーザ」を推薦

– アイテムの例 : 商品、 Web ページ、芸能人など

• 2つの手法がある– コンテンツベース

• 「アイテム」が持つ情報から類似する「アイテム」を探す– 協調フィルタリング

• 「情報」と「ユーザの行動」の関係から類似度を計算– ユーザを推薦

» アイテム空間に基づき高類似度のユーザを抽出– アイテムを推薦

» ユーザ空間に基づき高類似度のアイテムを抽出

Page 27: Perl で自然言語処理

27

例: Twitter のお気に入りレコメンド (1/2)- 協調フィルタリングでアイテム空間に基づきユーザを推薦 -

• ユーザ 1 : 発言 A 、発言 B 、発言 C …• ユーザ 2 : 発言 A 、発言 D 、発言 G …

• ユーザ 3 : 発言 E 、発言 F 、発言 G … • ユーザ 4 : 発言 B 、発言 G 、発言 I … • ユーザ 5 : 発言 C 、発言 G 、発言 I … • ユーザ 5 : 発言 O 、発言 R 、発言 Z …

Page 28: Perl で自然言語処理

28

例: Twitter のお気に入りレコメンド (2/2)- 協調フィルタリングでアイテム空間に基づきユーザを推薦 -

• あなた : 発言 B 、発言 C 、発言 G …

• ユーザ 1 : 発言 A 、発言 B 、発言 C … • ユーザ 4 : 発言 B 、発言 G 、発言 I …• ユーザ 4 : 発言 C 、発言 G 、発言 I …

• ユーザ 1 : 発言 A 、発言 B 、発言 C …• ユーザ 2 : 発言 A 、発言 D 、発言 G …• ユーザ 3 : 発言 E 、発言 F 、発言 G … • ユーザ 4 : 発言 B 、発言 G 、発言 I … • ユーザ 5 : 発言 C 、発言 G 、発言 I … • ユーザ 6 : 発言 O 、発言 R 、発言 Z …

お気に入りが  

共通しているユーザを抽出

Page 29: Perl で自然言語処理

29

例:はてなブックマークの関連エントリー

Page 30: Perl で自然言語処理

30

CPAN モジュールの例Algorithm::NaiveBayes

実行結果--- 'ユーザ 1 : 0.935928608918598'--- 'ユーザ 3 : 0.263229921258356'--- 'ユーザ 2 : 0.233982152229649'

Page 31: Perl で自然言語処理

31

2/7

Page 32: Perl で自然言語処理

32

データはある。だけど検索できない。=> まよわず「検索機能をつける」

• 迷わず「検索」機能をつけよう

• もし「全文検索を実現する技術者がいない」 なら– Sitemap を Google に登録しよう。

• それ以外– 自前で検索ライブラリを導入する。 or 外注する。

• もし「検索機能の設置で損なわれる価値がない」なら– 即リリースしよう。– 個人が特定されて困る種類の情報もある

• クレームが来そうなら、検索できない方が良いかも• 例: Twitter の発言に性別を推定したタグを付けたデータ

Page 33: Perl で自然言語処理

33

3/7

Page 34: Perl で自然言語処理

34

単語 A と単語 B って一緒にならないの?=> 「正規化・データクレンジング・名寄せ」では

• 「正規化・データクレンジング・名寄せ」が必要な例– 全角半角とかグチャグチャ– 送り仮名の振り方がバラバラ– 一部の記号が邪魔– 複数のフォーマットが混在している– 旧漢字と新漢字が混ざってる– 文字コードがサービスごとにちがう– ユーザが商品名に余計な文字や記号を付ける。– 活用がちょっと違う動詞をまとめたい

• 要するに、どういう場合に困るの? – ( 発音がほぼ同じ && 意味がほぼ同じ )だが、文字の表層が違う

Page 35: Perl で自然言語処理

35

例:電話番号っぽい数字

• 例:電話番号– 「 0120345678 」と「 0120(34)5678 」は

• 同じ番号?• そもそも、電話番号として使える?

– CPAN モジュール「 Number::Phone::JP 」を使う• 事前に記号をヒントに番号を切り分けたり、番号を桁数をヒント

に切り分けたりする• 判定の結果 vaild なだったら 0120-34-5678 に束ねる

=> 戦略:『信用して大丈夫かをチェックして、代表表記を決めて、代表表記に紐づける』ことを自動化する– 人手は最強だが、均質な作業を高速には行なえない

Page 36: Perl で自然言語処理

36

表記を揃える手順の例• データを調査する

– 処理するデータに特有な傾向をつかむ• 特有のフォーマット、や、同じ意味の異なる表記

• 英数字や記号や全角半角文字を揃える– 半角または全角にそろえる– 不要な文字を消す

• 代表となる表記を決める

• データに特有な同じ意味を表す表現を代表表記に揃える– 例:住所 => 「 1-2-3 」 と 「 1丁目 2番地 3号」

• 代表表記との文字列類似度が自分で決めた閾値以上ならまとめる

• 再び人間がデータを調査。処理全体を洗練する。

Page 37: Perl で自然言語処理

37

4/7

Page 38: Perl で自然言語処理

38

サイト内のユーザ回遊性を高めたい→ 『アンカーテキスト化』• 手法–あらかじめ辞書にキーワードを登録– テキストに辞書中のキーワードが含まれてい

たらアンカーテキスト化する

• 例:はてなのキーワードリンク

Page 39: Perl で自然言語処理

39

CPAN モジュールの例Text::Darts

• --- 今日は <a href="http://www.google.co.jp/search?ie=UTF-8&q=YAPC">YAPC</a> に <a href="http://www.google.co.jp/search?ie=UTF-8&q=NLP">NLP</a> のことを話に来たが、 <a href="http://www.google.co.jp/search?ie=UTF-8&q= 大丈夫 "> 大丈夫 </a> か。

Page 40: Perl で自然言語処理

40

5/7

Page 41: Perl で自然言語処理

41

ユーザが全アイテムを見てくれない=> 『ランダム表示』してログを観察• たとえば?– ソート結果のランク外の候補をランダムで混ぜる– しばらく運用してクリックスルーログをためる– より多くクリックされる候補をソート結果に混ぜる

• どういうとこで使われてるの?– 「検索エンジンの検索結果」や「広告」の精度向上

• 具体的な手法の例– 「 N 本腕バンディット問題」というキーワードから

Page 42: Perl で自然言語処理

42

6/7

Page 43: Perl で自然言語処理

43

出力結果の順番が気に入らない→ 『ソート方法』を変えてはどうか• ユーザに示すアイテムをソートする順序– 利便性に直結する

• どうやるのか– 日付や値段など、「とある属性の昇順降順」– 頻度

• 人気度、回数– 確率

• 例:お気に入り数 / ページビュー数– 機械学習技術で並び順を学習

Page 44: Perl で自然言語処理

44

例:ショッピングサイトの検索• 楽天市場

• Amazon

Page 45: Perl で自然言語処理

45

例:クックパッドのプレミアムサービス(月 294円)

Page 46: Perl で自然言語処理

46

例:食べログの iPhone版• プレミアム会員(月 315円)

になると、「人気順」ソートを使える。• PC版 : 今のところ無料

• 有料化時に話題になった• 食べログがユーザの評価

に関係なくログを集計して算出した注目順の方を有料化すべきだった?

Page 47: Perl で自然言語処理

47

CPAN モジュールの例Algorithm::SVMLight

• SVMlight の Ranking SVMs を手軽に使える– CPAN モジュールを使わないなら他のライブラリもある

• Ranking SVMs– 事前の学習 : 複数の事例セットを用意し、素性(そせい)抽出後

に学習– 入力     : ランキングしたい複数の候補– 出力     : ランキングした入力

• インストール方法– JPerl Advent Calender で紹介した– 「 Algorithm::SVMLight をインストールして使ってみよう

Page 48: Perl で自然言語処理

48

Algorithm::SVMLight のRanking SVMs のサンプルデータ• 学習データ– 順位– 事例セットの ID– 素性 1 :スコア– 素性 2 :スコア– ….

• テストデータ– 未知の事例セットの ID

Page 49: Perl で自然言語処理

49

7/7

Page 50: Perl で自然言語処理

50

データにカテゴリ的なものを付けたい=> 「分類」か「クラスタリング」

• 分類– 事前に各データにカテゴリ付けしたデータ集合を用意– 用意したデータを教師データとして分類器を学習=> 分類器で、未知のデータを分類しカテゴリ名をつける

 • クラスタリング

– データを近いものから結合してデータの塊をつくっていく– 事前に指定した数、ルールから導かれる結合を達成した時点

で計算終了=> 出来上がった塊に、なんとかしてカテゴリをつける。

 • 辞書マッチ

– カテゴリ辞書を作っておいて、マッチしたらカテゴリをつける。

Page 51: Perl で自然言語処理

51

文書分類の概要の例• 欲しいカテゴリごとに分類された文書集合を用意

• 機械学習器に学習させる

• 新しい文書を学習させた機械学習器で判定する

中華和食 洋食 カレー

中華和食 洋食

カレー

モデルファイル素性(そせい)抽出

して学習させる 学習した

カレー?昨日の自分のTwitter

素性抽出 判定させる疲れた: 1中華 :1暑い :1食欲 :1

Page 52: Perl で自然言語処理

52

文書クラスタリング概要の例• 事前に文書集合を何個に分けるか考えておく

• 抽出した素性(そせい)が近い文書をまとめる• まとめる時に一番寄与した特徴でラベル付け

文書 文書文書 文書文書 文書文書 文書文書 文書文書 文書文書 文書文書 文書

文書文書

文書文書 文書

文書文書文書

文書文書文書

文書

文書

文書文書

文書

Perl Ruby PHP C++ Python

Page 53: Perl で自然言語処理

53

どんなときに嬉しい?例1:キーワード検索で見つからないデータ• Amazon で「アルゴリズム」に関する新刊が欲しい

• カテゴリ選択で候補数を減らす。– 上位のものから探す

Page 54: Perl で自然言語処理

54

どんなときに嬉しい?例 2 :カテゴリを全部付け直したい• 私のブログの「日記カテゴリ」がひどい

Page 55: Perl で自然言語処理

55

CPAN モジュール• 分類–ナイーブベイズ• さっきの Algorithm::NaiveBayes

– サポートベクターマシン• さっきの Algorithm::SVMLight

• クラスタリング– Text::Bayon

• @fujimizuさんが開発した軽量クラスタリングツール

Page 56: Perl で自然言語処理

56

分類はその他のタスクにも必要

• 属性推定(明かされていないプロフィールとか)– 発言などの文字列を元に、ユーザの性別、年齢、地域、職業、家族構成、趣味などを推定

  • スパム判定

– リクエスト内容や頻度、 IP アドレスや文書の内容、通報をもとに学習データを作成して判定

 • アダルト判定

– キーワード辞書や、画像・動画中の色、通報を元に学習データを作成して判定

Page 57: Perl で自然言語処理

57

まとめ

Page 58: Perl で自然言語処理

58

まとめ• 自然言語処理は– Web サービスを盛り上げるスパイス

• キーワードを覚えて足りない機能を探す

• 必要な機能が無いなら– 導入時の『効果が高くて簡単なこと』からやる

• 自分が困る問題は、自分で解決するしかない– ユーザや保持するデータが違うなら解決法は変わる

Page 59: Perl で自然言語処理

59

課題の見つけ方• チェックリストを使い、足りない機能を探す

• 「あると便利な機能」チェックリスト– 検索機能の追加・改善– 分類、クラスタリング– アンカーテキスト(リンク)– レコメンド– ソート– 正規化・名寄せ・原型への変換– 要約・重要文抽出

Page 60: Perl で自然言語処理

60

ご清聴ありがとうございました

@echizen_tm、 @uchumik、 @machy、 @nokunoの各氏にアドバイスをいただきました。ありがとうございます。