Perl で自然言語処理

31,173
-1

Published on

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

Published in: Technology, Education
0 Comments
36 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
31,173
On Slideshare
0
From Embeds
0
Number of Embeds
6
Actions
Shares
0
Downloads
145
Comments
0
Likes
36
Embeds 0
No embeds

No notes for slide

Perl で自然言語処理

  1. 1. Perl で自然言語処理<br />佐藤 敏紀(さとうとしのり)<br />@overlast<br />1<br />
  2. 2. 私(佐藤敏紀)の自己紹介<br />名前:佐藤敏紀(さとうとしのり)<br />ID : overlast(Twitter : @overlast)<br />key : 自然言語処理/機械学習/検索/圧縮/順序学習<br />blog : Overlasting::Life(http://diary.overlasting.net/) <br />略歴<br />2005年4月〜2008年3月:東工大の奥村研究室<br />自然言語処理(比較関係抽出)の研究<br />2008年5月〜:某大手ポータルサイト<br />自然言語処理・機械学習技術をWeb文書に応用<br />類似文字列検索ライブラリの研究・開発<br />スペル訂正システムの研究・開発<br />2<br />
  3. 3. アジェンダ<br />自然言語処理って何?<br />何をやったら自然言語処理なの?<br />自然言語処理の勉強のはじめ方<br />Webサービスと自然言語処理<br />上手な自然言語処理との付き合い方<br />改善ポイント発見のためのキーワード<br />3<br />
  4. 4. 自然言語処理って何?<br />4<br />
  5. 5. 自然言語処理(NLP : Natural Language Processing)とは= 「自然言語」をコンピュータで「処理」すること<br />自然言語(Natural Language)<br />人間が意思疎通のために使っている言葉<br />言葉による意思疎通の手法例:読み・書き・話し<br />コンピュータ用の人工言語と区別される<br />自然言語処理<br />分野 : 人工知能 + 言語学<br />内容 = 解析をする際にどのように高い性能を達成するか<br />計算言語学(Computational Linguistics)と関連<br />NLPと聞いて神経的なモノを浮かべては駄目<br />5<br />
  6. 6. 自然言語処理技術の応用例Google 日本語入力 - CGI API<br />6<br />
  7. 7. 自然言語処理技術者に必須な要素<br />扱うデータに含まれる言語に関する知識<br />言語に関する文法、用語<br />テキストデータ中の単語の分布、文の構造など<br />必要な処理を実現できるプログラミングスキル<br />実現したいことによって、必要なスキルが異なる<br />できれば確率・統計に関連する知識<br />何をやる場合でも、ほぼ必ず必要になる<br />7<br />
  8. 8. 自然言語処理に関連する知識・技術<br />自然言語処理を実現するための知識<br />データ構造とアルゴリズム、機械学習、代数学、離散数学、グラフ理論、確率統計、情報理論、データ圧縮、組み合わせ最適化など<br />自然言語処理の基盤技術<br />形態素解析、構文解析、意味解析、文脈解析など<br />自然言語処理技術を応用して実現できる技術<br />情報検索、固有表現抽出、テキストマイニング、情報抽出、かな漢字変換、機械翻訳、文書分類、OCR、スペルチェック、音声認識、自動要約など<br />8<br />このあたりが自然言語処理と呼ばれる<br />
  9. 9. 自然言語処理の勉強のはじめ方- これから勉強する人向け -<br />9<br />
  10. 10. 日本語の教科書などを読む<br />自然言語処理の基礎(奥村学著)<br />薄いので読みやすい<br />自然言語処理(長尾真 著)<br />多少(かなり?)古いが網羅的<br />基礎日本語文法(増岡・田窪著)<br />日本語の自然言語処理に必要な用語を知る<br />言語処理のための機械学習入門<br />自然言語処理を学びつつ機械学習にも入門できる<br />生駒日記:NAISTの小町守さんのブログ<br />NLP関連の良質な記事をピックアップして下さる<br />毎日読んでいれば理解が深まる(半年ROM)<br />海外インターンに行きたくなる(副作用)<br />10<br />
  11. 11. 英語の教科書などを読む<br />最初の参考書<br />Foundations of Statistical Natural Language Processing<br />多少古いが、未読なら通読する価値がある<br />様々な自然言語処理の研究室で読まれている<br />略称 : FSNLP<br />学会・研究会<br />自然言語処理の学会<br />PFIの岡野原さんによる学会の解説<br />Link of NLP/CL Conference<br />東京大学喜連川研特認助教の吉永直樹さんのリスト。便利。<br />ACL Anthology<br />情報処理学会電子図書館(有料)<br />ACM Digital Library(有料)<br />11<br />
  12. 12. 勉強会・研究会・学会に参加する<br />勉強会・コミュニティ<br />自然言語処理勉強会@東京<br />@nokunoさんが主催。参加時の心理的ハードルが低い。<br />NLP若手の会<br />研究会や勉強会を頻繁に開催している。<br />研究会<br />情報処理学会の自然言語処理研究会<br />定期開催しているので割と気軽に参加できる。<br />学会の全国大会<br />言語処理学会の年次大会 => お祭。参加すべき。<br />12<br />
  13. 13. その他のおすすめ資料<br />集合知プログラミング<br />自然言語処理の応用を体験できる<br />Pythonのコードを見ながらPerlで書く<br />大規模サービス技術入門(伊藤・田中著)<br />通読すると何かをやった気分になれる<br />入門自然言語処理<br />Natural Language Processing with Pythonの邦訳<br />オライリーさん。12章が日本語で書き下ろし<br />情報検索と言語処理-言語と計算-徳永(徳永著)<br />おすすめ。Amazonで本書の関連書籍を見ると良い。<br />「たつをのChangeLog」のサンプルコード<br />Perl でWebAPIから得た結果を加工するサンプル<br />13<br />
  14. 14. 自然言語処理に必要な3つの心構え<br />最初は簡単に実装し、徐々に洗練する<br />簡単で効果が高いところから解決しよう<br />機械はミスをする<br />多少の間違えは諦めよう。70%正解してれば十分<br />データは自前で集めて、自前で管理する<br />他社のAPIや外注に依存しきるのは危険<br />14<br />
  15. 15. 簡単な方法からやって、洗練する<br />最初に<br />『かなり効果が高い & 割と簡単に導入できる』<br /> 技術に絞って開発し、サービスに導入する。<br />導入後にユーザの動きが変わるので、ログを分析し、次に効果が高い技術を考える<br />15<br />
  16. 16. 機械はミスをする<br />人間は優秀。機械では真似しきれない。<br />例:以下の文から、日本語の誤り箇所を探せ<br />ちょっと、そのケーブルで貸して下さい<br />一度は紙と鉛筆を用意して問題を解こう<br />どの位の精度が期待できるかを試そう。<br />例:リンゴを分類して、分類精度を得てみよう<br />リンゴとみかんを分類<br />簡単すぎ<br />甘い赤リンゴと甘くない赤リンゴを分類<br />難しすぎる(世の中には、この分類をする仕事がある)<br />16<br />
  17. 17. 日本語の口語文テキストは難しい<br />難しい自然言語処理には間違えがつきもの。<br />多くの自然言語処理技術がもっている仮定<br />形態素解析器などによる分かち書き処理は100%うまくいく<br />  <br />実際には、100%うまくいくわけではない<br />多くの形態素解析器は新聞のような文書向けに調整済み<br />ブログやTwitterの文書は新聞テキストより解析が難しい<br />そのため、形態素解析以降の処理にエラーが出てくる<br />多少の間違えは許容しよう。気にしないこと<br />17<br />
  18. 18. データは自前で集め、自前で持つ<br />データを自分で収集しなかった場合<br />他人がデータに何か処理を行なっていた場合に困ることがある<br />デーやを自前で持っていなかった場合<br />ある日、他社が提供するAPIが止まるとサービスが続行できなくなる<br />データをネットワーク越しに利用している場合<br />頻繁なデータ転送に時間を食ってしまう<br />データが超巨大な場合は解決できないので諦めて良い<br />理想:言語処理用データは計算機のローカルディスクに置く<br />自然言語処理をすると必ず意外に長い処理時間がかかる。<br />自然言語処理はアプリケーションのメイン処理ではない<br />ソートとか正規化とか、事前にできることは全て事前にやっておく<br />18<br />
  19. 19. Webサービスと自然言語処理<br />いざ実践!!<br />19<br />
  20. 20. 自然言語処理は最初は意外と簡単<br />自然言語処理は<br />Webサービスを盛り上げるスパイス、と考えてみよう<br />塩やコショウのようなもの。<br />何かを始められるかどうかの目安<br />自分の計算機上で形態素解析器を動かして、何かの文書における単語の出現頻度をカウントできる<br />技術を使いこなすことや、オリジナル手法を考えようとすると、難易度が飛躍的に上がる<br />最初は Web API やライブラリを利用すればOK<br />試作は Perl でサクッと作ればOK<br />20<br />
  21. 21. 課題を見つけてチャレンジする<br />データの獲得手法<br />自社・他社が提供するAPIを使用<br />他社からデータを購入・提供<br />自社で独自にデータ収集<br />データ処理の手法<br />自社・他社が提供するAPIを使用<br />コンピュータを用意。ライブラリをインストール・使用<br />自分でライブラリを開発<br />21<br />
  22. 22. Webサービスにありがちな悩み<br />サイト内のユーザ回遊性を高めたい<br />データはある。だけど、検索できない<br />単語Aと単語Bって一緒にならないの?<br />ユーザが全アイテムを見てくれない<br />ソートの順序が気にいらない<br />データにカテゴリ的なものを付けたい<br />-> これらの問題は導入が簡単で効果も高い<br />22<br />
  23. 23. 0/7<br />23<br />
  24. 24. Web API を使って問題解決<br />もう皆さん飽きてますよね。<br />他の方が沢山プレゼンをしてるはずなのでググってください。<br />個人的には、他者が提供しているAPIへの依存を減らした方が良いと思います。<br />24<br />
  25. 25. 1/7<br />25<br />
  26. 26. サイト内のユーザ回遊性を高めたい-> 『レコメンド』<br />あるユーザの興味をひきそうな「アイテム」や「ユーザ」を推薦<br />アイテムの例:商品、Webページ、芸能人など<br />2つの手法がある<br />コンテンツベース<br />「アイテム」が持つ情報から類似する「アイテム」を探す<br />協調フィルタリング<br />「情報」と「ユーザの行動」の関係から類似度を計算<br />ユーザを推薦<br />アイテム空間に基づき高類似度のユーザを抽出<br />アイテムを推薦<br />ユーザ空間に基づき高類似度のアイテムを抽出<br />26<br />
  27. 27. 例:Twitterのお気に入りレコメンド(1/2)- 協調フィルタリングでアイテム空間に基づきユーザを推薦 -<br />ユーザ 1 : 発言 A、発言 B、発言 C …<br />ユーザ 2 : 発言A、発言 D、発言 G … <br />ユーザ 3 : 発言 E、発言 F、発言G … <br />ユーザ 4 : 発言 B、発言 G、発言I … <br />ユーザ 5 : 発言 C、発言 G、発言I … <br />ユーザ 5 : 発言 O、発言 R、発言 Z … <br />27<br />
  28. 28. 例:Twitterのお気に入りレコメンド(2/2)- 協調フィルタリングでアイテム空間に基づきユーザを推薦 -<br />あなた : 発言 B、発言 C、発言 G …<br />ユーザ 1 : 発言A、発言 B、発言 C … <br />ユーザ 4 : 発言 B、発言 G、発言 I …<br />ユーザ 4 : 発言 C、発言 G、発言 I …<br />28<br /><ul><li>ユーザ 1 : 発言 A、発言 B、発言 C …
  29. 29. ユーザ 2 : 発言 A、発言 D、発言 G …
  30. 30. ユーザ 3 : 発言 E、発言 F、発言 G …
  31. 31. ユーザ 4 : 発言 B、発言 G、発言 I …
  32. 32. ユーザ 5 : 発言 C、発言 G、発言 I …
  33. 33. ユーザ 6 : 発言 O、発言 R、発言 Z …</li></ul>お気に入りが  共通している<br />ユーザを抽出<br />
  34. 34. 例:はてなブックマークの関連エントリー<br />29<br />
  35. 35. CPANモジュールの例Algorithm::NaiveBayes<br />30<br />実行結果<br />--- 'ユーザ1 : 0.935928608918598'<br />--- 'ユーザ3 : 0.263229921258356'<br />--- 'ユーザ2 : 0.233982152229649'<br />
  36. 36. 2/7<br />31<br />
  37. 37. データはある。だけど検索できない。=> まよわず「検索機能をつける」<br />迷わず「検索」機能をつけよう<br />もし「全文検索を実現する技術者がいない」なら<br />SitemapをGoogleに登録しよう。<br />それ以外<br />自前で検索ライブラリを導入する。 or 外注する。<br />もし「検索機能の設置で損なわれる価値がない」なら<br />即リリースしよう。<br />個人が特定されて困る種類の情報もある<br />クレームが来そうなら、検索できない方が良いかも<br />例:Twitterの発言に性別を推定したタグを付けたデータ<br />32<br />
  38. 38. 3/7<br />33<br />
  39. 39. 単語Aと単語Bって一緒にならないの?=> 「正規化・データクレンジング・名寄せ」では<br />「正規化・データクレンジング・名寄せ」が必要な例<br />全角半角とかグチャグチャ<br />送り仮名の振り方がバラバラ<br />一部の記号が邪魔<br />複数のフォーマットが混在している<br />旧漢字と新漢字が混ざってる<br />文字コードがサービスごとにちがう<br />ユーザが商品名に余計な文字や記号を付ける。<br />活用がちょっと違う動詞をまとめたい<br />要するに、どういう場合に困るの? <br />(発音がほぼ同じ && 意味がほぼ同じ)だが、文字の表層が違う<br />34<br />
  40. 40. 例:電話番号っぽい数字<br />例:電話番号<br />「0120345678」と「0120(34)5678」は<br />同じ番号?<br />そもそも、電話番号として使える?<br />CPANモジュール「Number::Phone::JP」を使う<br />事前に記号をヒントに番号を切り分けたり、番号を桁数をヒントに切り分けたりする<br />判定の結果vaildなだったら0120-34-5678に束ねる<br />=> 戦略:『信用して大丈夫かをチェックして、代表表記を決めて、代表表記に紐づける』ことを自動化する<br />人手は最強だが、均質な作業を高速には行なえない<br />35<br />
  41. 41. 表記を揃える手順の例<br />データを調査する<br />処理するデータに特有な傾向をつかむ<br />特有のフォーマット、や、同じ意味の異なる表記<br />英数字や記号や全角半角文字を揃える<br />半角または全角にそろえる<br />不要な文字を消す<br />代表となる表記を決める<br />データに特有な同じ意味を表す表現を代表表記に揃える<br />例:住所 => 「1-2-3」と「1丁目2番地3号」<br />代表表記との文字列類似度が自分で決めた閾値以上ならまとめる<br />再び人間がデータを調査。処理全体を洗練する。<br />36<br />
  42. 42. 4/7<br />37<br />
  43. 43. サイト内のユーザ回遊性を高めたい-> 『アンカーテキスト化』<br />手法<br />あらかじめ辞書にキーワードを登録<br />テキストに辞書中のキーワードが含まれていたらアンカーテキスト化する<br />例:はてなのキーワードリンク<br />38<br />
  44. 44. CPANモジュールの例Text::Darts<br />39<br />--- 今日は<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> か。<br />
  45. 45. 5/7<br />40<br />
  46. 46. ユーザが全アイテムを見てくれない=> 『ランダム表示』してログを観察<br />たとえば?<br />ソート結果のランク外の候補をランダムで混ぜる<br />しばらく運用してクリックスルーログをためる<br />より多くクリックされる候補をソート結果に混ぜる<br />どういうとこで使われてるの?<br />「検索エンジンの検索結果」や「広告」の精度向上<br />具体的な手法の例<br />「N本腕バンディット問題」というキーワードから<br />41<br />
  47. 47. 6/7<br />42<br />
  48. 48. 出力結果の順番が気に入らない-> 『ソート方法』を変えてはどうか<br />ユーザに示すアイテムをソートする順序<br />利便性に直結する<br />どうやるのか<br />日付や値段など、「とある属性の昇順降順」<br />頻度<br />人気度、回数<br />確率<br />例:お気に入り数 / ページビュー数<br />機械学習技術で並び順を学習<br />43<br />
  49. 49. 例:ショッピングサイトの検索<br />楽天市場<br />Amazon<br />44<br />
  50. 50. 例:クックパッドのプレミアムサービス(月294円)<br />45<br />
  51. 51. 例:食べログのiPhone版<br />46<br /><ul><li>プレミアム会員(月315円)になると、「人気順」ソートを使える。
  52. 52. PC版:今のところ無料
  53. 53. 有料化時に話題になった
  54. 54. 食べログがユーザの評価に関係なくログを集計して算出した注目順の方を有料化すべきだった?</li></li></ul><li>CPANモジュールの例Algorithm::SVMLight<br />SVMlightのRanking SVMsを手軽に使える<br /> CPANモジュールを使わないなら他のライブラリもある<br />Ranking SVMs<br />事前の学習:複数の事例セットを用意し、素性(そせい)抽出後に学習<br />入力    :ランキングしたい複数の候補<br />出力    :ランキングした入力<br />インストール方法<br />JPerl Advent Calenderで紹介した<br />「Algorithm::SVMLight をインストールして使ってみよう」<br />47<br />
  55. 55. Algorithm::SVMLightのRanking SVMsのサンプルデータ<br />学習データ<br />順位<br />事例セットのID<br />素性1:スコア<br />素性2:スコア<br />….<br />テストデータ<br />未知の事例セットのID<br />48<br />
  56. 56. 7/7<br />49<br />
  57. 57. データにカテゴリ的なものを付けたい=>「分類」か「クラスタリング」<br />分類<br />事前に各データにカテゴリ付けしたデータ集合を用意<br />用意したデータを教師データとして分類器を学習<br />=> 分類器で、未知のデータを分類しカテゴリ名をつける<br /> <br />クラスタリング<br />データを近いものから結合してデータの塊をつくっていく<br />事前に指定した数、ルールから導かれる結合を達成した時点で計算終了<br />=> 出来上がった塊に、なんとかしてカテゴリをつける。<br /> <br />辞書マッチ<br />カテゴリ辞書を作っておいて、マッチしたらカテゴリをつける。<br />50<br />
  58. 58. 文書分類の概要の例<br />欲しいカテゴリごとに分類された文書集合を用意<br />機械学習器に学習させる<br />新しい文書を学習させた機械学習器で判定する<br />51<br />中華<br />和食<br />洋食<br />カレー<br />モデルファイル<br />和食<br />洋食<br />素性(そせい)抽出<br />して学習させる<br />学習した<br />中華<br />カレー<br />疲れた:1<br />中華:1<br />暑い:1<br />食欲:1<br />昨日の<br />自分の<br />Twitter<br />カレー?<br />素性抽出<br />判定させる<br />
  59. 59. 文書クラスタリング概要の例<br />事前に文書集合を何個に分けるか考えておく<br />抽出した素性(そせい)が近い文書をまとめる<br />まとめる時に一番寄与した特徴でラベル付け<br />52<br />文書<br />文書<br />文書<br />文書<br />文書<br />文書<br />文書<br />文書<br />文書<br />文書<br />文書<br />文書<br />文書<br />文書<br />文書<br />文書<br />文書<br />文書<br />文書<br />文書<br />文書<br />文書<br />文書<br />文書<br />文書<br />文書<br />文書<br />文書<br />文書<br />文書<br />文書<br />文書<br />Perl Ruby PHP C++ Python<br />
  60. 60. どんなときに嬉しい?例1:キーワード検索で見つからないデータ<br />Amazonで「アルゴリズム」に関する新刊が欲しい<br />カテゴリ選択で候補数を減らす。<br />上位のものから探す<br />53<br />
  61. 61. どんなときに嬉しい?例2:カテゴリを全部付け直したい<br />私のブログの「日記カテゴリ」がひどい<br />54<br />
  62. 62. CPANモジュール<br />分類<br />ナイーブベイズ<br />さっきのAlgorithm::NaiveBayes<br />サポートベクターマシン<br />さっきのAlgorithm::SVMLight<br />クラスタリング<br />Text::Bayon<br />@fujimizuさんが開発した軽量クラスタリングツール<br />55<br />
  63. 63. 分類はその他のタスクにも必要<br />属性推定(明かされていないプロフィールとか)<br />発言などの文字列を元に、ユーザの性別、年齢、地域、職業、家族構成、趣味などを推定<br />  <br />スパム判定<br />リクエスト内容や頻度、IPアドレスや文書の内容、通報をもとに学習データを作成して判定<br /> <br />アダルト判定<br />キーワード辞書や、画像・動画中の色、通報を元に学習データを作成して判定<br />56<br />
  64. 64. まとめ<br />57<br />
  65. 65. まとめ<br />自然言語処理は<br />Webサービスを盛り上げるスパイス<br />キーワードを覚えて足りない機能を探す<br />必要な機能が無いなら<br />導入時の『効果が高くて簡単なこと』からやる<br />自分が困る問題は、自分で解決するしかない<br />ユーザや保持するデータが違うなら解決法は変わる<br />58<br />
  66. 66. 課題の見つけ方<br />チェックリストを使い、足りない機能を探す<br />「あると便利な機能」チェックリスト<br />検索機能の追加・改善<br />分類、クラスタリング<br />アンカーテキスト(リンク)<br />レコメンド<br />ソート<br />正規化・名寄せ・原型への変換<br />要約・重要文抽出<br />59<br />
  67. 67. ご清聴ありがとうございました<br />@echizen_tm、@uchumik、@machy、@nokunoの各氏にアドバイスをいただきました。ありがとうございます。<br />60<br />
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×