Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Pythonを用いて文書をデータ化し見える化へ

 Pythonを用いて文書をデータ化し見える化へ

オープンデベロッパーズカンファレンス 2019にて
@terapyon
日本語の文書をデータ化し文書の類似度や単語の頻度を見える化していきます。
日本語の難しさを確認し、プログラミング言語Pythonを使ってWebサイトのデータを使った実践を行います。
最後に、その他の応用方法などを考えていきます

Manabu TERADA

August 24, 2019
Tweet

More Decks by Manabu TERADA

Other Decks in Technology

Transcript

  1. Python を用いて文書をデータ化し見 Python を用いて文書をデータ化し見 Python を用いて文書をデータ化し見 Python を用いて文書をデータ化し見 Python を用いて文書をデータ化し見

    Python を用いて文書をデータ化し見 える化へ える化へ える化へ える化へ える化へ える化へ ODC 蒲田 ODC 蒲田 ODC 蒲田 ODC 蒲田 ODC 蒲田 ODC 蒲田 - 2019-08-24 - - 2019-08-24 - - 2019-08-24 - - 2019-08-24 - - 2019-08-24 - - 2019-08-24 - @terapyon @terapyon @terapyon @terapyon @terapyon @terapyon 1 / 73
  2. Self introduction Self introduction Self introduction Self introduction Self introduction

    Self introduction Manabu TERADA Manabu TERADA Manabu TERADA Manabu TERADA Manabu TERADA Manabu TERADA ( 寺田 学) ( 寺田 学) ( 寺田 学) ( 寺田 学) ( 寺田 学) ( 寺田 学) Python エンジニア Python エンジニア Python エンジニア Python エンジニア Python エンジニア Python エンジニア 一般社団法人PyCon JP 代表理事 一般社団法人PyCon JP 代表理事 一般社団法人PyCon JP 代表理事 一般社団法人PyCon JP 代表理事 一般社団法人PyCon JP 代表理事 一般社団法人PyCon JP 代表理事 一般社団法人Python エンジニア育成推進協会 顧問理事 一般社団法人Python エンジニア育成推進協会 顧問理事 一般社団法人Python エンジニア育成推進協会 顧問理事 一般社団法人Python エンジニア育成推進協会 顧問理事 一般社団法人Python エンジニア育成推進協会 顧問理事 一般社団法人Python エンジニア育成推進協会 顧問理事 Plone Foundation Ambassador Plone Foundation Ambassador Plone Foundation Ambassador Plone Foundation Ambassador Plone Foundation Ambassador Plone Foundation Ambassador PSF Contributing member PSF Contributing member PSF Contributing member PSF Contributing member PSF Contributing member PSF Contributing member Member of NVDA Japanese Team Member of NVDA Japanese Team Member of NVDA Japanese Team Member of NVDA Japanese Team Member of NVDA Japanese Team Member of NVDA Japanese Team                                     2 / 73
  3. Our company Our company Our company Our company Our company

    Our company CMS Communications Inc. CMS Communications Inc. CMS Communications Inc. CMS Communications Inc. CMS Communications Inc. CMS Communications Inc. https://www.cmscom.jp https://www.cmscom.jp https://www.cmscom.jp https://www.cmscom.jp https://www.cmscom.jp https://www.cmscom.jp Plone を使って、大学のサイトとか企業サイトなどを構築 Plone を使って、大学のサイトとか企業サイトなどを構築 Plone を使って、大学のサイトとか企業サイトなどを構築 Plone を使って、大学のサイトとか企業サイトなどを構築 Plone を使って、大学のサイトとか企業サイトなどを構築 Plone を使って、大学のサイトとか企業サイトなどを構築 Python の技術サポートやコンサルティングを行う Python の技術サポートやコンサルティングを行う Python の技術サポートやコンサルティングを行う Python の技術サポートやコンサルティングを行う Python の技術サポートやコンサルティングを行う Python の技術サポートやコンサルティングを行う 技術集団( フロント、サーバサイド、インフラ) 技術集団( フロント、サーバサイド、インフラ) 技術集団( フロント、サーバサイド、インフラ) 技術集団( フロント、サーバサイド、インフラ) 技術集団( フロント、サーバサイド、インフラ) 技術集団( フロント、サーバサイド、インフラ) 教育系ツールもサポート 教育系ツールもサポート 教育系ツールもサポート 教育系ツールもサポート 教育系ツールもサポート 教育系ツールもサポート Plone Plone Plone Plone Plone Plone, , , , , , Pyramid and Open edX Pyramid and Open edX Pyramid and Open edX Pyramid and Open edX Pyramid and Open edX Pyramid and Open edX データ分析系の業務も行っている データ分析系の業務も行っている データ分析系の業務も行っている データ分析系の業務も行っている データ分析系の業務も行っている データ分析系の業務も行っている                                     3 / 73
  4. PyCon JP PyCon JP PyCon JP PyCon JP PyCon JP

    PyCon JP 2019 年9月に大田区産業プラザで開催 2019 年9月に大田区産業プラザで開催 2019 年9月に大田区産業プラザで開催 2019 年9月に大田区産業プラザで開催 2019 年9月に大田区産業プラザで開催 2019 年9月に大田区産業プラザで開催 1000 人規模 1000 人規模 1000 人規模 1000 人規模 1000 人規模 1000 人規模 チケットはすでに売り切れ チケットはすでに売り切れ チケットはすでに売り切れ チケットはすでに売り切れ チケットはすでに売り切れ チケットはすでに売り切れ 地方でPython のチュートリアルイベントを開催 地方でPython のチュートリアルイベントを開催 地方でPython のチュートリアルイベントを開催 地方でPython のチュートリアルイベントを開催 地方でPython のチュートリアルイベントを開催 地方でPython のチュートリアルイベントを開催 女性のコミュニティPyLadies.Tokyo とも連携し支援 女性のコミュニティPyLadies.Tokyo とも連携し支援 女性のコミュニティPyLadies.Tokyo とも連携し支援 女性のコミュニティPyLadies.Tokyo とも連携し支援 女性のコミュニティPyLadies.Tokyo とも連携し支援 女性のコミュニティPyLadies.Tokyo とも連携し支援                               6 / 73
  5. セッションの内容 セッションの内容 セッションの内容 セッションの内容 セッションの内容 セッションの内容 日本語の文書をデータとして扱う(3 分) 日本語の文書をデータとして扱う(3 分)

    日本語の文書をデータとして扱う(3 分) 日本語の文書をデータとして扱う(3 分) 日本語の文書をデータとして扱う(3 分) 日本語の文書をデータとして扱う(3 分) 文章から何が見えてくるか考える(4 分) 文章から何が見えてくるか考える(4 分) 文章から何が見えてくるか考える(4 分) 文章から何が見えてくるか考える(4 分) 文章から何が見えてくるか考える(4 分) 文章から何が見えてくるか考える(4 分) 日本語の難しさ(3 分) 日本語の難しさ(3 分) 日本語の難しさ(3 分) 日本語の難しさ(3 分) 日本語の難しさ(3 分) 日本語の難しさ(3 分) 日本語以外の場合(3 分) 日本語以外の場合(3 分) 日本語以外の場合(3 分) 日本語以外の場合(3 分) 日本語以外の場合(3 分) 日本語以外の場合(3 分) Python を使って日本語を扱う(10 分) Python を使って日本語を扱う(10 分) Python を使って日本語を扱う(10 分) Python を使って日本語を扱う(10 分) Python を使って日本語を扱う(10 分) Python を使って日本語を扱う(10 分) Web サイトのデータを使った実践(15 分) Web サイトのデータを使った実践(15 分) Web サイトのデータを使った実践(15 分) Web サイトのデータを使った実践(15 分) Web サイトのデータを使った実践(15 分) Web サイトのデータを使った実践(15 分) その他の応用を考える(5 分) その他の応用を考える(5 分) その他の応用を考える(5 分) その他の応用を考える(5 分) その他の応用を考える(5 分) その他の応用を考える(5 分)                                           7 / 73
  6. 日本語の文書をデータとして扱う 日本語の文書をデータとして扱う 日本語の文書をデータとして扱う 日本語の文書をデータとして扱う 日本語の文書をデータとして扱う 日本語の文書をデータとして扱う デジタル化 デジタル化 デジタル化 デジタル化

    デジタル化 デジタル化 扱いやすいデータとは 扱いやすいデータとは 扱いやすいデータとは 扱いやすいデータとは 扱いやすいデータとは 扱いやすいデータとは 文書にラベル( 番号など) を付ける 文書にラベル( 番号など) を付ける 文書にラベル( 番号など) を付ける 文書にラベル( 番号など) を付ける 文書にラベル( 番号など) を付ける 文書にラベル( 番号など) を付ける 文書の構造別に分ける ( タイトル、概要、本文、補足など) 文書の構造別に分ける ( タイトル、概要、本文、補足など) 文書の構造別に分ける ( タイトル、概要、本文、補足など) 文書の構造別に分ける ( タイトル、概要、本文、補足など) 文書の構造別に分ける ( タイトル、概要、本文、補足など) 文書の構造別に分ける ( タイトル、概要、本文、補足など) 構造別に、文を単語に分ける 構造別に、文を単語に分ける 構造別に、文を単語に分ける 構造別に、文を単語に分ける 構造別に、文を単語に分ける 構造別に、文を単語に分ける 単語ごとにラベル付け・形態素解析 ( 品詞に分けるとか) 単語ごとにラベル付け・形態素解析 ( 品詞に分けるとか) 単語ごとにラベル付け・形態素解析 ( 品詞に分けるとか) 単語ごとにラベル付け・形態素解析 ( 品詞に分けるとか) 単語ごとにラベル付け・形態素解析 ( 品詞に分けるとか) 単語ごとにラベル付け・形態素解析 ( 品詞に分けるとか) 不要な単語の処理 不要な単語の処理 不要な単語の処理 不要な単語の処理 不要な単語の処理 不要な単語の処理                                           8 / 73
  7. 日本語の文書をデジタル化 日本語の文書をデジタル化 日本語の文書をデジタル化 日本語の文書をデジタル化 日本語の文書をデジタル化 日本語の文書をデジタル化 紙に書かれている状態だと扱えない 紙に書かれている状態だと扱えない 紙に書かれている状態だと扱えない 紙に書かれている状態だと扱えない

    紙に書かれている状態だと扱えない 紙に書かれている状態だと扱えない OCR するとか、人手で入力するとか OCR するとか、人手で入力するとか OCR するとか、人手で入力するとか OCR するとか、人手で入力するとか OCR するとか、人手で入力するとか OCR するとか、人手で入力するとか デジタルデータにすることが最初の一歩 デジタルデータにすることが最初の一歩 デジタルデータにすることが最初の一歩 デジタルデータにすることが最初の一歩 デジタルデータにすることが最初の一歩 デジタルデータにすることが最初の一歩                   9 / 73
  8. 扱いやすいデータとは 扱いやすいデータとは 扱いやすいデータとは 扱いやすいデータとは 扱いやすいデータとは 扱いやすいデータとは 構造化されたデータ 構造化されたデータ 構造化されたデータ 構造化されたデータ

    構造化されたデータ 構造化されたデータ 例えば 例えば 例えば 例えば 例えば 例えば 文書が番号で管理されている 文書が番号で管理されている 文書が番号で管理されている 文書が番号で管理されている 文書が番号で管理されている 文書が番号で管理されている 文書内のタイトルや概要文が個別に管理されている 文書内のタイトルや概要文が個別に管理されている 文書内のタイトルや概要文が個別に管理されている 文書内のタイトルや概要文が個別に管理されている 文書内のタイトルや概要文が個別に管理されている 文書内のタイトルや概要文が個別に管理されている 文書ごとのタグ付けがされている 文書ごとのタグ付けがされている 文書ごとのタグ付けがされている 文書ごとのタグ付けがされている 文書ごとのタグ付けがされている 文書ごとのタグ付けがされている 文書の更新日がわかる 文書の更新日がわかる 文書の更新日がわかる 文書の更新日がわかる 文書の更新日がわかる 文書の更新日がわかる                                     10 / 73
  9. 文書にラベル( 番号など) を付ける 文書にラベル( 番号など) を付ける 文書にラベル( 番号など) を付ける 文書にラベル(

    番号など) を付ける 文書にラベル( 番号など) を付ける 文書にラベル( 番号など) を付ける 文書毎に目印を付ける 文書毎に目印を付ける 文書毎に目印を付ける 文書毎に目印を付ける 文書毎に目印を付ける 文書毎に目印を付ける 文書にID をつけるとか 文書にID をつけるとか 文書にID をつけるとか 文書にID をつけるとか 文書にID をつけるとか 文書にID をつけるとか ファイル名 --> 文書 ファイル名 --> 文書 ファイル名 --> 文書 ファイル名 --> 文書 ファイル名 --> 文書 ファイル名 --> 文書 URL --> 文書 URL --> 文書 URL --> 文書 URL --> 文書 URL --> 文書 URL --> 文書                         11 / 73
  10. 文書の中を構造別に分ける 文書の中を構造別に分ける 文書の中を構造別に分ける 文書の中を構造別に分ける 文書の中を構造別に分ける 文書の中を構造別に分ける 以下のような構造がある 以下のような構造がある 以下のような構造がある 以下のような構造がある

    以下のような構造がある 以下のような構造がある タイトル タイトル タイトル タイトル タイトル タイトル 概要文 概要文 概要文 概要文 概要文 概要文 本文 本文 本文 本文 本文 本文 公開日 公開日 公開日 公開日 公開日 公開日 補足など 補足など 補足など 補足など 補足など 補足など                               12 / 73
  11. 構造別に、文を単語に分ける 構造別に、文を単語に分ける 構造別に、文を単語に分ける 構造別に、文を単語に分ける 構造別に、文を単語に分ける 構造別に、文を単語に分ける 単語に分割する 単語に分割する 単語に分割する 単語に分割する

    単語に分割する 単語に分割する 私の名前は寺田学です。エンジニアをしています。 私の名前は寺田学です。エンジニアをしています。 [' 私', ' の', ' 名前', ' は', ' 寺田', ' 学', ' です', ' 。', ' エンジニア', [' 私', ' の', ' 名前', ' は', ' 寺田', ' 学', ' です', ' 。', ' エンジニア', ' を', ' し', ' て', ' い', ' ます', ' 。'] ' を', ' し', ' て', ' い', ' ます', ' 。'] by Janome by Janome by Janome by Janome by Janome by Janome       14 / 73
  12. 単語ごとにラベル付け・形態素解析 単語ごとにラベル付け・形態素解析 単語ごとにラベル付け・形態素解析 単語ごとにラベル付け・形態素解析 単語ごとにラベル付け・形態素解析 単語ごとにラベル付け・形態素解析 品詞に分ける 品詞に分ける 品詞に分ける 品詞に分ける

    品詞に分ける 品詞に分ける 読みを付加する 読みを付加する 読みを付加する 読みを付加する 読みを付加する 読みを付加する 単語の原形に変換する 単語の原形に変換する 単語の原形に変換する 単語の原形に変換する 単語の原形に変換する 単語の原形に変換する                   15 / 73
  13. 私 名詞, 代名詞, 一般,*,*,*, 私, ワタシ, ワタシ 私 名詞, 代名詞,

    一般,*,*,*, 私, ワタシ, ワタシ の 助詞, 連体化,*,*,*,*, の, ノ, ノ の 助詞, 連体化,*,*,*,*, の, ノ, ノ 名前 名詞, 一般,*,*,*,*, 名前, ナマエ, ナマエ 名前 名詞, 一般,*,*,*,*, 名前, ナマエ, ナマエ は 助詞, 係助詞,*,*,*,*, は, ハ, ワ は 助詞, 係助詞,*,*,*,*, は, ハ, ワ 寺田 名詞, 固有名詞, 人名, 姓,*,*, 寺田, テラダ, テラダ 寺田 名詞, 固有名詞, 人名, 姓,*,*, 寺田, テラダ, テラダ 学 名詞, 固有名詞, 人名, 名,*,*, 学, マナブ, マナブ 学 名詞, 固有名詞, 人名, 名,*,*, 学, マナブ, マナブ です 助動詞,*,*,*, 特殊・デス, 基本形, です, デス, デス です 助動詞,*,*,*, 特殊・デス, 基本形, です, デス, デス 。 記号, 句点,*,*,*,*, 。, 。, 。 。 記号, 句点,*,*,*,*, 。, 。, 。 エンジニア 名詞, 一般,*,*,*,*, エンジニア, エンジニア, エンジニア エンジニア 名詞, 一般,*,*,*,*, エンジニア, エンジニア, エンジニア を 助詞, 格助詞, 一般,*,*,*, を, ヲ, ヲ を 助詞, 格助詞, 一般,*,*,*, を, ヲ, ヲ し 動詞, 自立,*,*, サ変・スル, 連用形, する, シ, シ し 動詞, 自立,*,*, サ変・スル, 連用形, する, シ, シ て 助詞, 接続助詞,*,*,*,*, て, テ, テ て 助詞, 接続助詞,*,*,*,*, て, テ, テ い 動詞, 非自立,*,*, 一段, 連用形, いる, イ, イ い 動詞, 非自立,*,*, 一段, 連用形, いる, イ, イ ます 助動詞,*,*,*, 特殊・マス, 基本形, ます, マス, マス ます 助動詞,*,*,*, 特殊・マス, 基本形, ます, マス, マス 。 記号, 句点,*,*,*,*, 。, 。, 。 。 記号, 句点,*,*,*,*, 。, 。, 。 16 / 73
  14. 不要な単語の処理 不要な単語の処理 不要な単語の処理 不要な単語の処理 不要な単語の処理 不要な単語の処理 ストップワード処理 ストップワード処理 ストップワード処理 ストップワード処理

    ストップワード処理 ストップワード処理 英語だと、 英語だと、 英語だと、 英語だと、 英語だと、 英語だと、 a a a a a a や や や や や や the the the the the the のような冠詞を取り除く のような冠詞を取り除く のような冠詞を取り除く のような冠詞を取り除く のような冠詞を取り除く のような冠詞を取り除く 日本語の助詞を取り除く 日本語の助詞を取り除く 日本語の助詞を取り除く 日本語の助詞を取り除く 日本語の助詞を取り除く 日本語の助詞を取り除く 意味を持たない記号などを取り除く 意味を持たない記号などを取り除く 意味を持たない記号などを取り除く 意味を持たない記号などを取り除く 意味を持たない記号などを取り除く 意味を持たない記号などを取り除く                         17 / 73
  15. 文書から何が見えてくるか考える 文書から何が見えてくるか考える 文書から何が見えてくるか考える 文書から何が見えてくるか考える 文書から何が見えてくるか考える 文書から何が見えてくるか考える 文字を探し出す 文字を探し出す 文字を探し出す 文字を探し出す

    文字を探し出す 文字を探し出す 単語をひもとく 単語をひもとく 単語をひもとく 単語をひもとく 単語をひもとく 単語をひもとく 文書間の関連を見つける 文書間の関連を見つける 文書間の関連を見つける 文書間の関連を見つける 文書間の関連を見つける 文書間の関連を見つける 文書の自動タグ付け 文書の自動タグ付け 文書の自動タグ付け 文書の自動タグ付け 文書の自動タグ付け 文書の自動タグ付け 単語間の関係性 単語間の関係性 単語間の関係性 単語間の関係性 単語間の関係性 単語間の関係性 もしかして・スペルミス・表記揺れチェック もしかして・スペルミス・表記揺れチェック もしかして・スペルミス・表記揺れチェック もしかして・スペルミス・表記揺れチェック もしかして・スペルミス・表記揺れチェック もしかして・スペルミス・表記揺れチェック                                     18 / 73
  16. 文字を探し出す 文字を探し出す 文字を探し出す 文字を探し出す 文字を探し出す 文字を探し出す 検索 検索 検索 検索

    検索 検索 網羅的に捜査する 網羅的に捜査する 網羅的に捜査する 網羅的に捜査する 網羅的に捜査する 網羅的に捜査する 転置インデックスを作る 転置インデックスを作る 転置インデックスを作る 転置インデックスを作る 転置インデックスを作る 転置インデックスを作る             19 / 73
  17. 転置インデックス(1) 転置インデックス(1) 転置インデックス(1) 転置インデックス(1) 転置インデックス(1) 転置インデックス(1) 文書1: Python はソフトウエア 文書1:

    Python はソフトウエア 文書1: Python はソフトウエア 文書1: Python はソフトウエア 文書1: Python はソフトウエア 文書1: Python はソフトウエア 文書2: ソフトウエアを使ってアプリを作る 文書2: ソフトウエアを使ってアプリを作る 文書2: ソフトウエアを使ってアプリを作る 文書2: ソフトウエアを使ってアプリを作る 文書2: ソフトウエアを使ってアプリを作る 文書2: ソフトウエアを使ってアプリを作る 文書3: Python で検索エンジンを作る 文書3: Python で検索エンジンを作る 文書3: Python で検索エンジンを作る 文書3: Python で検索エンジンを作る 文書3: Python で検索エンジンを作る 文書3: Python で検索エンジンを作る 単語を文書ごとに番号付け 単語を文書ごとに番号付け 単語を文書ごとに番号付け 単語を文書ごとに番号付け 単語を文書ごとに番号付け 単語を文書ごとに番号付け {'Python': 1, ' ソフトウエア': 1} {'Python': 1, ' ソフトウエア': 1} {' ソフトウエア': 2, ' 使う': 2, ' アプリ': 2, ' 作る': 2} {' ソフトウエア': 2, ' 使う': 2, ' アプリ': 2, ' 作る': 2} {'Python': 3, ' 検索': 3, ' エンジン': 3, ' 作る': 3} {'Python': 3, ' 検索': 3, ' エンジン': 3, ' 作る': 3}                   20 / 73
  18. 転置インデックス(2) 転置インデックス(2) 転置インデックス(2) 転置インデックス(2) 転置インデックス(2) 転置インデックス(2) 'Python': {1, 3}, 'Python':

    {1, 3}, ' ソフトウエア': {1, 2}, ' ソフトウエア': {1, 2}, ' 使う': {2}, ' 使う': {2}, ' アプリ': {2}, ' アプリ': {2}, ' 作る': {2, 3}, ' 作る': {2, 3}, ' 検索': {3}, ' 検索': {3}, ' エンジン': {3} ' エンジン': {3} 21 / 73
  19. 転置インデックス(3) 転置インデックス(3) 転置インデックス(3) 転置インデックス(3) 転置インデックス(3) 転置インデックス(3) "Python and 作る" 

    で検索 "Python and 作る"  で検索 "Python and 作る"  で検索 "Python and 作る"  で検索 "Python and 作る"  で検索 "Python and 作る"  で検索 'Python': {1, 3}, 'Python': {1, 3}, ' 作る': {2, 3}, ' 作る': {2, 3}, 文書3 が該当文書となる 文書3 が該当文書となる 文書3 が該当文書となる 文書3 が該当文書となる 文書3 が該当文書となる 文書3 が該当文書となる {1, 3} & {2, 3} --> {3} {1, 3} & {2, 3} --> {3} 22 / 73
  20. 単語をひもとく 単語をひもとく 単語をひもとく 単語をひもとく 単語をひもとく 単語をひもとく 頻出頻度 頻出頻度 頻出頻度 頻出頻度

    頻出頻度 頻出頻度 ワードクラウド ワードクラウド ワードクラウド ワードクラウド ワードクラウド ワードクラウド             23 / 73
  21. 文書間の関連を見つける 文書間の関連を見つける 文書間の関連を見つける 文書間の関連を見つける 文書間の関連を見つける 文書間の関連を見つける この文書とこの文書は似ているか? この文書とこの文書は似ているか? この文書とこの文書は似ているか? この文書とこの文書は似ているか?

    この文書とこの文書は似ているか? この文書とこの文書は似ているか? 人は文書を読むと似ているかどうか分かる 人は文書を読むと似ているかどうか分かる 人は文書を読むと似ているかどうか分かる 人は文書を読むと似ているかどうか分かる 人は文書を読むと似ているかどうか分かる 人は文書を読むと似ているかどうか分かる 高速道路で40km の渋滞が発生 高速道路で40km の渋滞が発生 5G ネットワークによる高速通信サービス開始 5G ネットワークによる高速通信サービス開始 スマホの不正利用が発生 スマホの不正利用が発生             24 / 73
  22. 文書の自動タグ付け 文書の自動タグ付け 文書の自動タグ付け 文書の自動タグ付け 文書の自動タグ付け 文書の自動タグ付け ニュースタイトルと考えると ニュースタイトルと考えると ニュースタイトルと考えると ニュースタイトルと考えると

    ニュースタイトルと考えると ニュースタイトルと考えると 高速道路で40km の渋滞が発生 --> 交通情報 高速道路で40km の渋滞が発生 --> 交通情報 5G ネットワークによる高速通信サービス開始 --> 携帯電話サービス 5G ネットワークによる高速通信サービス開始 --> 携帯電話サービス スマホの不正利用が発生 --> 携帯電話サービス スマホの不正利用が発生 --> 携帯電話サービス       25 / 73
  23. 単語間の関係性 単語間の関係性 単語間の関係性 単語間の関係性 単語間の関係性 単語間の関係性 関連を見つける 関連を見つける 関連を見つける 関連を見つける

    関連を見つける 関連を見つける 似ている単語を見つける 似ている単語を見つける 似ている単語を見つける 似ている単語を見つける 似ている単語を見つける 似ている単語を見つける ' ロボット' ' ロボット' (' 対話', 0.9823681116104126), (' 対話', 0.9823681116104126), (' 人間', 0.9746276140213013), (' 人間', 0.9746276140213013), ('ai', 0.9576572775840759), ('ai', 0.9576572775840759), (' 表情', 0.9486445188522339), (' 表情', 0.9486445188522339), (' アンドロイド', 0.9475428462028503) (' アンドロイド', 0.9475428462028503)             26 / 73
  24. 追加の機能 追加の機能 追加の機能 追加の機能 追加の機能 追加の機能 もしかして もしかして もしかして もしかして

    もしかして もしかして スペルミスを発見 スペルミスを発見 スペルミスを発見 スペルミスを発見 スペルミスを発見 スペルミスを発見 表記揺れチェック 表記揺れチェック 表記揺れチェック 表記揺れチェック 表記揺れチェック 表記揺れチェック                   27 / 73
  25. 日本語の難しさ 日本語の難しさ 日本語の難しさ 日本語の難しさ 日本語の難しさ 日本語の難しさ 単語がスペースで区切られていない 単語がスペースで区切られていない 単語がスペースで区切られていない 単語がスペースで区切られていない

    単語がスペースで区切られていない 単語がスペースで区切られていない アラビア数字でも全角・半角の2 つの表記がある アラビア数字でも全角・半角の2 つの表記がある アラビア数字でも全角・半角の2 つの表記がある アラビア数字でも全角・半角の2 つの表記がある アラビア数字でも全角・半角の2 つの表記がある アラビア数字でも全角・半角の2 つの表記がある 同じ単語でも複数の表記がある 同じ単語でも複数の表記がある 同じ単語でも複数の表記がある 同じ単語でも複数の表記がある 同じ単語でも複数の表記がある 同じ単語でも複数の表記がある キャラクタ数が多い キャラクタ数が多い キャラクタ数が多い キャラクタ数が多い キャラクタ数が多い キャラクタ数が多い                         28 / 73
  26. 単語がスペースで区切られていない 単語がスペースで区切られていない 単語がスペースで区切られていない 単語がスペースで区切られていない 単語がスペースで区切られていない 単語がスペースで区切られていない My name is Manabu

    Terada. I am an engineer My name is Manabu Terada. I am an engineer ['My', 'name', 'is', 'Manabu', 'Terada.', 'I', 'am', 'an', 'enginee ['My', 'name', 'is', 'Manabu', 'Terada.', 'I', 'am', 'an', 'enginee r'] r'] 英語 vs 日本語 英語 vs 日本語 英語 vs 日本語 英語 vs 日本語 英語 vs 日本語 英語 vs 日本語 私の名前は寺田学です。エンジニアをしています。 私の名前は寺田学です。エンジニアをしています。 [' 私', ' の', ' 名前', ' は', ' 寺田', ' 学', ' です', ' 。', ' エンジニア', [' 私', ' の', ' 名前', ' は', ' 寺田', ' 学', ' です', ' 。', ' エンジニア', ' を', ' し', ' て', ' い', ' ます', ' 。'] ' を', ' し', ' て', ' い', ' ます', ' 。'] 29 / 73
  27. アラビア数字でも全角・半角の2 つの アラビア数字でも全角・半角の2 つの アラビア数字でも全角・半角の2 つの アラビア数字でも全角・半角の2 つの アラビア数字でも全角・半角の2 つの

    アラビア数字でも全角・半角の2 つの 表記がある 表記がある 表記がある 表記がある 表記がある 表記がある 半角: "1", "2", "3" 半角: "1", "2", "3" 全角: " 1", " 2", " 3" 全角: " 1", " 2", " 3" 30 / 73
  28. 同じ単語でも複数の表記がある 同じ単語でも複数の表記がある 同じ単語でも複数の表記がある 同じ単語でも複数の表記がある 同じ単語でも複数の表記がある 同じ単語でも複数の表記がある 複数のキャラクタを使う珍しい言語 複数のキャラクタを使う珍しい言語 複数のキャラクタを使う珍しい言語 複数のキャラクタを使う珍しい言語

    複数のキャラクタを使う珍しい言語 複数のキャラクタを使う珍しい言語 漢字 漢字 漢字 漢字 漢字 漢字 カタカナ カタカナ カタカナ カタカナ カタカナ カタカナ ひらがな ひらがな ひらがな ひらがな ひらがな ひらがな                   31 / 73
  29. キャラクタ数が多い キャラクタ数が多い キャラクタ数が多い キャラクタ数が多い キャラクタ数が多い キャラクタ数が多い 常用漢字: 約2000 常用漢字: 約2000

    常用漢字: 約2000 常用漢字: 約2000 常用漢字: 約2000 常用漢字: 約2000 漢字: 5 万とも言われている 漢字: 5 万とも言われている 漢字: 5 万とも言われている 漢字: 5 万とも言われている 漢字: 5 万とも言われている 漢字: 5 万とも言われている ひらがな・カタカナ: 100 ひらがな・カタカナ: 100 ひらがな・カタカナ: 100 ひらがな・カタカナ: 100 ひらがな・カタカナ: 100 ひらがな・カタカナ: 100                   32 / 73
  30. 日本語以外の場合 日本語以外の場合 日本語以外の場合 日本語以外の場合 日本語以外の場合 日本語以外の場合 英語 英語 英語 英語

    英語 英語 多くの欧米言語 多くの欧米言語 多くの欧米言語 多くの欧米言語 多くの欧米言語 多くの欧米言語 中国語や韓国語 中国語や韓国語 中国語や韓国語 中国語や韓国語 中国語や韓国語 中国語や韓国語 アラビア語系 アラビア語系 アラビア語系 アラビア語系 アラビア語系 アラビア語系                         33 / 73
  31. 英語 英語 英語 英語 英語 英語 英語を単語に区切るのは簡単 英語を単語に区切るのは簡単 英語を単語に区切るのは簡単 英語を単語に区切るのは簡単

    英語を単語に区切るのは簡単 英語を単語に区切るのは簡単 英語のキャラクタ数 英語のキャラクタ数 英語のキャラクタ数 英語のキャラクタ数 英語のキャラクタ数 英語のキャラクタ数 26 × 2 しかない 26 × 2 しかない 26 × 2 しかない 26 × 2 しかない 26 × 2 しかない 26 × 2 しかない 数字や記号を入れても128 以下 数字や記号を入れても128 以下 数字や記号を入れても128 以下 数字や記号を入れても128 以下 数字や記号を入れても128 以下 数字や記号を入れても128 以下                         34 / 73
  32. 多くの欧米言語 多くの欧米言語 多くの欧米言語 多くの欧米言語 多くの欧米言語 多くの欧米言語 多くの欧米言語がスペースで区切られている 多くの欧米言語がスペースで区切られている 多くの欧米言語がスペースで区切られている 多くの欧米言語がスペースで区切られている

    多くの欧米言語がスペースで区切られている 多くの欧米言語がスペースで区切られている キャラクタ数も限られている キャラクタ数も限られている キャラクタ数も限られている キャラクタ数も限られている キャラクタ数も限られている キャラクタ数も限られている             35 / 73
  33. 中国語や韓国語 中国語や韓国語 中国語や韓国語 中国語や韓国語 中国語や韓国語 中国語や韓国語 日本語と同様にスペースで区切られていない 日本語と同様にスペースで区切られていない 日本語と同様にスペースで区切られていない 日本語と同様にスペースで区切られていない

    日本語と同様にスペースで区切られていない 日本語と同様にスペースで区切られていない キャラクタ数が多い キャラクタ数が多い キャラクタ数が多い キャラクタ数が多い キャラクタ数が多い キャラクタ数が多い             36 / 73
  34. アラビア語系 アラビア語系 アラビア語系 アラビア語系 アラビア語系 アラビア語系 右から表記をする 右から表記をする 右から表記をする 右から表記をする

    右から表記をする 右から表記をする 単語をスペースで区切られている 単語をスペースで区切られている 単語をスペースで区切られている 単語をスペースで区切られている 単語をスペースで区切られている 単語をスペースで区切られている キャラクタ数も 28 × 約4 と少ない キャラクタ数も 28 × 約4 と少ない キャラクタ数も 28 × 約4 と少ない キャラクタ数も 28 × 約4 と少ない キャラクタ数も 28 × 約4 と少ない キャラクタ数も 28 × 約4 と少ない 独立形・頭字・中字・尾字 独立形・頭字・中字・尾字 独立形・頭字・中字・尾字 独立形・頭字・中字・尾字 独立形・頭字・中字・尾字 独立形・頭字・中字・尾字                         37 / 73
  35. Python を使って日本語を扱う Python を使って日本語を扱う Python を使って日本語を扱う Python を使って日本語を扱う Python を使って日本語を扱う

    Python を使って日本語を扱う ここからが本題!! ここからが本題!! ここからが本題!! ここからが本題!! ここからが本題!! ここからが本題!! 38 / 73
  36. Python を使って日本語を扱う Python を使って日本語を扱う Python を使って日本語を扱う Python を使って日本語を扱う Python を使って日本語を扱う

    Python を使って日本語を扱う 前提 前提 前提 前提 前提 前提 このセッションでは、 このセッションでは、 このセッションでは、 このセッションでは、 このセッションでは、 このセッションでは、 OCR の話しはしません ( デジタルデータになっている前提) OCR の話しはしません ( デジタルデータになっている前提) OCR の話しはしません ( デジタルデータになっている前提) OCR の話しはしません ( デジタルデータになっている前提) OCR の話しはしません ( デジタルデータになっている前提) OCR の話しはしません ( デジタルデータになっている前提) Excel にデータがあるとする Excel にデータがあるとする Excel にデータがあるとする Excel にデータがあるとする Excel にデータがあるとする Excel にデータがあるとする             39 / 73
  37. Python とは Python とは Python とは Python とは Python とは

    Python とは プログラム言語 プログラム言語 プログラム言語 プログラム言語 プログラム言語 プログラム言語 動的型付け、コンパイル不要 動的型付け、コンパイル不要 動的型付け、コンパイル不要 動的型付け、コンパイル不要 動的型付け、コンパイル不要 動的型付け、コンパイル不要 シンプルな仕様で簡単に使い始められる シンプルな仕様で簡単に使い始められる シンプルな仕様で簡単に使い始められる シンプルな仕様で簡単に使い始められる シンプルな仕様で簡単に使い始められる シンプルな仕様で簡単に使い始められる データ解析、機械学習などで使われている データ解析、機械学習などで使われている データ解析、機械学習などで使われている データ解析、機械学習などで使われている データ解析、機械学習などで使われている データ解析、機械学習などで使われている Web システムやOS 基盤などでも使われている Web システムやOS 基盤などでも使われている Web システムやOS 基盤などでも使われている Web システムやOS 基盤などでも使われている Web システムやOS 基盤などでも使われている Web システムやOS 基盤などでも使われている                               40 / 73
  38. Excel からPython のデータにする(1) Excel からPython のデータにする(1) Excel からPython のデータにする(1) Excel

    からPython のデータにする(1) Excel からPython のデータにする(1) Excel からPython のデータにする(1) ライブラリを使うと簡単にできる ライブラリを使うと簡単にできる ライブラリを使うと簡単にできる ライブラリを使うと簡単にできる ライブラリを使うと簡単にできる ライブラリを使うと簡単にできる openpyxl を使う openpyxl を使う openpyxl を使う openpyxl を使う openpyxl を使う openpyxl を使う >> >>> > import import openpyxl openpyxl >> >>> > wb wb = = openpyxl openpyxl. .load_workbook load_workbook( ("c2data-ja.xlsx" "c2data-ja.xlsx") ) >> >>> > ws ws = = wb wb. .active active >> >>> > ws ws[ ["C4" "C4"] ]. .value value '20171208_1' '20171208_1' 41 / 73
  39. Excel からPython のデータにする(2) Excel からPython のデータにする(2) Excel からPython のデータにする(2) Excel

    からPython のデータにする(2) Excel からPython のデータにする(2) Excel からPython のデータにする(2) ライブラリを使うと簡単にできる ライブラリを使うと簡単にできる ライブラリを使うと簡単にできる ライブラリを使うと簡単にできる ライブラリを使うと簡単にできる ライブラリを使うと簡単にできる pandas を使う pandas を使う pandas を使う pandas を使う pandas を使う pandas を使う >> >>> > import import pandas pandas as as pd pd >> >>> > df df = = pd pd. .read_excel read_excel( ("c2data-ja.xlsx" "c2data-ja.xlsx") ) >> >>> > df df. .iloc iloc[ [2 2, , 2 2] ] '20171208_1' '20171208_1' 42 / 73
  40. データをPython のstr として扱う データをPython のstr として扱う データをPython のstr として扱う データをPython

    のstr として扱う データをPython のstr として扱う データをPython のstr として扱う str: 文字列 str: 文字列 str: 文字列 str: 文字列 str: 文字列 str: 文字列 >> >>> > text text = = "Python は日本語を扱える。" "Python は日本語を扱える。" >> >>> > len len( (text text) ) 15 15 >> >>> > text text[ [: :6 6] ] 'Python' 'Python' 43 / 73
  41. 形態素解析エンジンで、単語を取得 形態素解析エンジンで、単語を取得 形態素解析エンジンで、単語を取得 形態素解析エンジンで、単語を取得 形態素解析エンジンで、単語を取得 形態素解析エンジンで、単語を取得 単語を最小限の単位に分けて、品詞を付加 単語を最小限の単位に分けて、品詞を付加 単語を最小限の単位に分けて、品詞を付加 単語を最小限の単位に分けて、品詞を付加

    単語を最小限の単位に分けて、品詞を付加 単語を最小限の単位に分けて、品詞を付加 >> >>> > from from janome janome. .tokenizer tokenizer import import Tokenizer Tokenizer >> >>> > t t = = Tokenizer Tokenizer( () ) >> >>> > for for token token in in t t. .tokenize tokenize( ("Python は日本語を扱える" "Python は日本語を扱える") ): : . .. .. . print print( (token token) ) Python 名詞 Python 名詞, , 固有名詞 固有名詞, , 組織 組織, ,* *, ,* *, ,* *, ,Python Python, ,* *, ,* * は 助詞 は 助詞, , 係助詞 係助詞, ,* *, ,* *, ,* *, ,* *, , は は, , ハ ハ, , ワ ワ 日本語 名詞 日本語 名詞, , 一般 一般, ,* *, ,* *, ,* *, ,* *, , 日本語 日本語, , ニホンゴ ニホンゴ, , ニホンゴ ニホンゴ を 助詞 を 助詞, , 格助詞 格助詞, , 一般 一般, ,* *, ,* *, ,* *, , を を, , ヲ ヲ, , ヲ ヲ 扱える 動詞 扱える 動詞, , 自立 自立, ,* *, ,* *, , 一段 一段, , 基本形 基本形, , 扱える 扱える, , アツカエル アツカエル, , アツカエル アツカエル 44 / 73
  42. 形態素解析エンジンの種類 形態素解析エンジンの種類 形態素解析エンジンの種類 形態素解析エンジンの種類 形態素解析エンジンの種類 形態素解析エンジンの種類 MeCab (Python バインディングがある) MeCab

    (Python バインディングがある) MeCab (Python バインディングがある) MeCab (Python バインディングがある) MeCab (Python バインディングがある) MeCab (Python バインディングがある) Janome (Pure Python) Janome (Pure Python) Janome (Pure Python) Janome (Pure Python) Janome (Pure Python) Janome (Pure Python) Kuromoji (Java) Kuromoji (Java) Kuromoji (Java) Kuromoji (Java) Kuromoji (Java) Kuromoji (Java) NLTK ( 英語の場合) NLTK ( 英語の場合) NLTK ( 英語の場合) NLTK ( 英語の場合) NLTK ( 英語の場合) NLTK ( 英語の場合)                         45 / 73
  43. 形態素解析以外のアプローチ 形態素解析以外のアプローチ 形態素解析以外のアプローチ 形態素解析以外のアプローチ 形態素解析以外のアプローチ 形態素解析以外のアプローチ N-gram N-gram N-gram N-gram

    N-gram N-gram 2-gram の例 2-gram の例 2-gram の例 2-gram の例 2-gram の例 2-gram の例 >> >>> > text text = = "Python は日本語を扱える" "Python は日本語を扱える" >> >>> > sp sp = = [ [] ] >> >>> > for for i i in in range range( (len len( (text text) )) ): : . .. .. . if if i i != != len len( (text text) )- -1 1: : . .. .. . sp sp. .append append( (text text[ [i i] ] + + text text[ [i i+ +1 1] ]) ) [ ['Py' 'Py', , 'yt' 'yt', , 'th' 'th', , 'ho' 'ho', , 'on' 'on', , 'n は' 'n は', , ' は日' ' は日', , ' 日本' ' 日本', , ' 本語' ' 本語', , ' 語を' ' 語を', , ' を扱' ' を扱', , ' 扱え' ' 扱え', , ' える' ' える'] ] 46 / 73
  44. 英語の場合の単語を取得 英語の場合の単語を取得 英語の場合の単語を取得 英語の場合の単語を取得 英語の場合の単語を取得 英語の場合の単語を取得 スペースで区切れば、単語が取得できる スペースで区切れば、単語が取得できる スペースで区切れば、単語が取得できる スペースで区切れば、単語が取得できる

    スペースで区切れば、単語が取得できる スペースで区切れば、単語が取得できる 原形に戻すことはしておきたい 原形に戻すことはしておきたい 原形に戻すことはしておきたい 原形に戻すことはしておきたい 原形に戻すことはしておきたい 原形に戻すことはしておきたい 品詞が必要になる場合は、なにかしらのツールが必要 品詞が必要になる場合は、なにかしらのツールが必要 品詞が必要になる場合は、なにかしらのツールが必要 品詞が必要になる場合は、なにかしらのツールが必要 品詞が必要になる場合は、なにかしらのツールが必要 品詞が必要になる場合は、なにかしらのツールが必要 >> >>> > text text = = "My name is Manabu Terada. I am an engineer" "My name is Manabu Terada. I am an engineer" >> >>> > text text. .split split( () ) [ ['My' 'My', , 'name' 'name', , 'is' 'is', , 'Manabu' 'Manabu', , 'Terada.' 'Terada.', , 'I' 'I', , 'am' 'am', , 'an' 'an', , 'enginee 'enginee r' r'] ]                   47 / 73
  45. ノーマライズ ノーマライズ ノーマライズ ノーマライズ ノーマライズ ノーマライズ 全角・半角をどちらかにしたい 全角・半角をどちらかにしたい 全角・半角をどちらかにしたい 全角・半角をどちらかにしたい

    全角・半角をどちらかにしたい 全角・半角をどちらかにしたい 大文字・小文字をどちからにしたい 大文字・小文字をどちからにしたい 大文字・小文字をどちからにしたい 大文字・小文字をどちからにしたい 大文字・小文字をどちからにしたい 大文字・小文字をどちからにしたい 原形やオリジナル表記にしたい 原形やオリジナル表記にしたい 原形やオリジナル表記にしたい 原形やオリジナル表記にしたい 原形やオリジナル表記にしたい 原形やオリジナル表記にしたい >> >>> > import import unicodedata unicodedata >> >>> > text text = = "Py thon で日本語を扱えるエンジニアに2年でなるぞ。" "Py thon で日本語を扱えるエンジニアに2年でなるぞ。" >> >>> > new new = = unicodedata unicodedata. .normalize normalize( ('NFKD' 'NFKD', , text text) ) >> >>> > print print( (new new) ) Python で日本語を扱えるエンジニアに Python で日本語を扱えるエンジニアに2 2 年でなるぞ。 年でなるぞ。                   48 / 73
  46. 文字列操作 文字列操作 文字列操作 文字列操作 文字列操作 文字列操作 >> >>> > text

    text = = "Python は日本語を扱える。" "Python は日本語を扱える。" >> >>> > text text. .upper upper( () ) 'PYTHON は日本語を扱える。' 'PYTHON は日本語を扱える。' >> >>> > text text. .replace replace( (" 日本語" " 日本語", , "Japanese" "Japanese") ) 'Python はJapanese を扱える。' 'Python はJapanese を扱える。' >> >>> > text text. .endswith endswith( (" 。" " 。") ) True True 49 / 73
  47. Web サイトのデータを使った実践 Web サイトのデータを使った実践 Web サイトのデータを使った実践 Web サイトのデータを使った実践 Web サイトのデータを使った実践

    Web サイトのデータを使った実践 事前処理 事前処理 事前処理 事前処理 事前処理 事前処理 単語の頻出頻度をだす 単語の頻出頻度をだす 単語の頻出頻度をだす 単語の頻出頻度をだす 単語の頻出頻度をだす 単語の頻出頻度をだす Top50 単語を出力 Top50 単語を出力 Top50 単語を出力 Top50 単語を出力 Top50 単語を出力 Top50 単語を出力 ワードクラウドを出力する ワードクラウドを出力する ワードクラウドを出力する ワードクラウドを出力する ワードクラウドを出力する ワードクラウドを出力する エントリー毎に似ているエントリーTop3 を出力 エントリー毎に似ているエントリーTop3 を出力 エントリー毎に似ているエントリーTop3 を出力 エントリー毎に似ているエントリーTop3 を出力 エントリー毎に似ているエントリーTop3 を出力 エントリー毎に似ているエントリーTop3 を出力 同じ意味を持つ単語を出力 同じ意味を持つ単語を出力 同じ意味を持つ単語を出力 同じ意味を持つ単語を出力 同じ意味を持つ単語を出力 同じ意味を持つ単語を出力                                     50 / 73
  48. 例題の説明 例題の説明 例題の説明 例題の説明 例題の説明 例題の説明 大阪大学が運営する、ResOU では研究成果を紹介 大阪大学が運営する、ResOU では研究成果を紹介

    大阪大学が運営する、ResOU では研究成果を紹介 大阪大学が運営する、ResOU では研究成果を紹介 大阪大学が運営する、ResOU では研究成果を紹介 大阪大学が運営する、ResOU では研究成果を紹介 https://resou.osaka-u.ac.jp/ https://resou.osaka-u.ac.jp/ https://resou.osaka-u.ac.jp/ https://resou.osaka-u.ac.jp/ https://resou.osaka-u.ac.jp/ https://resou.osaka-u.ac.jp/ ResOU の1200 エントリーを解析してみる ResOU の1200 エントリーを解析してみる ResOU の1200 エントリーを解析してみる ResOU の1200 エントリーを解析してみる ResOU の1200 エントリーを解析してみる ResOU の1200 エントリーを解析してみる ワードクラウドを作る ワードクラウドを作る ワードクラウドを作る ワードクラウドを作る ワードクラウドを作る ワードクラウドを作る エントリー間の関連を見る エントリー間の関連を見る エントリー間の関連を見る エントリー間の関連を見る エントリー間の関連を見る エントリー間の関連を見る よく使われている単語と同じ意味を持つ単語を探す よく使われている単語と同じ意味を持つ単語を探す よく使われている単語と同じ意味を持つ単語を探す よく使われている単語と同じ意味を持つ単語を探す よく使われている単語と同じ意味を持つ単語を探す よく使われている単語と同じ意味を持つ単語を探す                               51 / 73
  49. 事前処理 事前処理 事前処理 事前処理 事前処理 事前処理 データをExcel で取得 データをExcel で取得

    データをExcel で取得 データをExcel で取得 データをExcel で取得 データをExcel で取得 Excel からPython のデータにする(Pandas) Excel からPython のデータにする(Pandas) Excel からPython のデータにする(Pandas) Excel からPython のデータにする(Pandas) Excel からPython のデータにする(Pandas) Excel からPython のデータにする(Pandas) データから形態素解析で単語化 (Janome) データから形態素解析で単語化 (Janome) データから形態素解析で単語化 (Janome) データから形態素解析で単語化 (Janome) データから形態素解析で単語化 (Janome) データから形態素解析で単語化 (Janome) ストップワードを取り除く (Janome) ストップワードを取り除く (Janome) ストップワードを取り除く (Janome) ストップワードを取り除く (Janome) ストップワードを取り除く (Janome) ストップワードを取り除く (Janome)                         53 / 73
  50. 事前処理の準備 事前処理の準備 事前処理の準備 事前処理の準備 事前処理の準備 事前処理の準備 % %matplotlib inline matplotlib

    inline import import numpy numpy as as np np import import pandas pandas as as pd pd import import matplotlib matplotlib. .pyplot pyplot as as plt plt from from bs4 bs4 import import BeautifulSoup BeautifulSoup from from janome janome. .tokenizer tokenizer import import Tokenizer Tokenizer from from janome janome. .charfilter charfilter import import UnicodeNormalizeCharFilter UnicodeNormalizeCharFilter from from janome janome. .tokenfilter tokenfilter import import CompoundNounFilter CompoundNounFilter, , POSKeepFilter POSKeepFilter from from janome janome. .tokenfilter tokenfilter import import LowerCaseFilter LowerCaseFilter, , TokenFilter TokenFilter from from janome janome. .analyzer analyzer import import Analyzer Analyzer 54 / 73
  51. 事前処理のコード(1) Excel からDF 事前処理のコード(1) Excel からDF 事前処理のコード(1) Excel からDF 事前処理のコード(1)

    Excel からDF 事前処理のコード(1) Excel からDF 事前処理のコード(1) Excel からDF def def merged_str merged_str( (col col) ): : s s = = "" "" for for w w in in col col: : if if isinstance isinstance( (w w, , str str) ): : s s += += w w s s += += " " " " return return s s >> >>> > df df = = pd pd. .read_excel read_excel( ('c2data-ja.xlsx' 'c2data-ja.xlsx') ) >> >>> > df_small df_small = = pd pd. .DataFrame DataFrame( ([ [] ], , columns columns= =[ ["url" "url", , "data" "data"] ]) ) >> >>> > df_small df_small[ ["url" "url"] ] = = df df. .loc loc[ [: :, , "id" "id"] ]) ) >> >>> > df_small df_small[ ["data" "data"] ] = = df df. .loc loc[ [: :, , [ ["title" "title", , "sub_title" "sub_title", , "body" "body", , "description" "description"] ]] ]. .apply apply( (merged_str merged_str, , axis axis= =1 1) ) 55 / 73
  52. 事前処理のコード(2) StopWordFilter 事前処理のコード(2) StopWordFilter 事前処理のコード(2) StopWordFilter 事前処理のコード(2) StopWordFilter 事前処理のコード(2) StopWordFilter

    事前処理のコード(2) StopWordFilter class class StopWordFilter StopWordFilter( (TokenFilter TokenFilter) ): : def def __init__ __init__( (self self, , filename filename) ): : self self. .stopwords stopwords = =[ [] ] with with open open( (filename filename, , 'r' 'r', , encoding encoding= ='utf-8' 'utf-8') ) as as f f: : for for line line in in f f: : self self. .stopwords stopwords. .append append( (line line. .strip strip( () )) ) def def apply apply( (self self, , tokens tokens) ): : for for token token in in tokens tokens: : if if token token. .surface surface in in self self. .stopwords stopwords: : continue continue yield yield token token 56 / 73
  53. 事前処理のコード(3) analyzer を設定 事前処理のコード(3) analyzer を設定 事前処理のコード(3) analyzer を設定 事前処理のコード(3)

    analyzer を設定 事前処理のコード(3) analyzer を設定 事前処理のコード(3) analyzer を設定 >> >>> > char_filters char_filters = = [ [UnicodeNormalizeCharFilter UnicodeNormalizeCharFilter( () )] ] >> >>> > token_filters token_filters = = [ [CompoundNounFilter CompoundNounFilter( () ), , POSKeepFilter POSKeepFilter( ([ [' 名詞' ' 名詞'] ]) ), , LowerCaseFilter LowerCaseFilter( () ), , StopWordFilter StopWordFilter( ('./resou-stopword.txt' './resou-stopword.txt') ) ] ] >> >>> > tokenizer tokenizer = = Tokenizer Tokenizer( () ) >> >>> > analyzer analyzer = = Analyzer Analyzer( (char_filters char_filters, , tokenizer tokenizer, , token_filters token_filters) ) 57 / 73
  54. 事前処理のコード(4) 単語リスト作成 事前処理のコード(4) 単語リスト作成 事前処理のコード(4) 単語リスト作成 事前処理のコード(4) 単語リスト作成 事前処理のコード(4) 単語リスト作成

    事前処理のコード(4) 単語リスト作成 def def get_words get_words( (analyzer analyzer, , text text) ): : for for token token in in analyzer analyzer. .analyze analyze( (text text) ): : yield yield token token. .base_form base_form >> >>> > lines_words lines_words = = [ [] ] >> >>> > for for _ _, , ( (url url, , text text) ) in in df_small df_small. .loc loc[ [1 1: :, , [ ["url" "url", , "data" "data"] ]] ]. .iterrow iterrow s s( () ): : . .. .. . soup soup = = BeautifulSoup BeautifulSoup( (text text) ) . .. .. . lines_words lines_words. .append append( (( (url url, , list list( (get_words get_words( (analyzer analyzer, , soup soup. .get_ get_ text text( () )) )) )) )) ) 58 / 73
  55. 単語の頻出頻度をだす(1) 単語の頻出頻度をだす(1) 単語の頻出頻度をだす(1) 単語の頻出頻度をだす(1) 単語の頻出頻度をだす(1) 単語の頻出頻度をだす(1) words words = =

    [ [] ] for for url url, , line line in in lines_words lines_words: : for for word word in in line line: : words words. .append append( (word word. .strip strip( () )) ) >> >>> > len len( (words words) ) 1708613 1708613 >> >>> > from from collections collections import import Counter Counter >> >>> > count count = = Counter Counter( (words words) ) >> >>> > len len( (count count) ) 105001 105001 59 / 73
  56. 単語の頻出頻度をだす(2) 単語の頻出頻度をだす(2) 単語の頻出頻度をだす(2) 単語の頻出頻度をだす(2) 単語の頻出頻度をだす(2) 単語の頻出頻度をだす(2) >> >>> > count

    count Counter Counter( ({ {' 大阪大学発' ' 大阪大学発': : 8 8, , ' 軟骨再生治療法' ' 軟骨再生治療法': : 1 1, , ' 臨床応用' ' 臨床応用': : 60 60, , ' 最終段階' ' 最終段階': : 8 8, , ' 企業治験' ' 企業治験': : 10 10, , . .. .. . 60 / 73
  57. Top50 単語を出力 Top50 単語を出力 Top50 単語を出力 Top50 単語を出力 Top50 単語を出力

    Top50 単語を出力 >> >>> > top50 top50 = = count count. .most_common most_common( (50 50) ) >> >>> > top50 top50 [ [( (' 研究' ' 研究', , 5797 5797) ), , ( (' 研究成果' ' 研究成果', , 4443 4443) ), , ( (' 明らか' ' 明らか', , 2784 2784) ), , ( (' 研究グループ' ' 研究グループ', , 2249 2249) ), , ( (' 細胞' ' 細胞', , 2218 2218) ), , . .. .. . 61 / 73
  58. ワードクラウドを出力する ワードクラウドを出力する ワードクラウドを出力する ワードクラウドを出力する ワードクラウドを出力する ワードクラウドを出力する % %matplotlib inline matplotlib

    inline import import matplotlib matplotlib. .pyplot pyplot as as plt plt from from wordcloud wordcloud import import WordCloud WordCloud >> >>> > top50_keys top50_keys = = [ [k k for for k k, , v v in in top50 top50] ] >> >>> > text text = = ' ' ' '. .join join( (w w for for w w in in words words if if w w in in top50_keys top50_keys) ) >> >>> > wordcloud wordcloud = = WordCloud WordCloud( (font_path font_path= ='./NotoSansJP-Bold.otf' './NotoSansJP-Bold.otf', , background_color background_color= ='white' 'white', , width width= =1024 1024, , height height= =674 674) ). .generate generate( (text text) ) >> >>> > plt plt. .imshow imshow( (wordcloud wordcloud, , interpolation interpolation= ='bilinear' 'bilinear') ) >> >>> > plt plt. .axis axis( ("off" "off") ) >> >>> > plt plt. .figure figure( () ) 62 / 73
  59. エントリー毎に似ているエントリー エントリー毎に似ているエントリー エントリー毎に似ているエントリー エントリー毎に似ているエントリー エントリー毎に似ているエントリー エントリー毎に似ているエントリー Top3 を出力 Top3 を出力

    Top3 を出力 Top3 を出力 Top3 を出力 Top3 を出力 Doc2Vec を使う Doc2Vec を使う Doc2Vec を使う Doc2Vec を使う Doc2Vec を使う Doc2Vec を使う 単語のリストとタグを紐付けたリストを作る 単語のリストとタグを紐付けたリストを作る 単語のリストとタグを紐付けたリストを作る 単語のリストとタグを紐付けたリストを作る 単語のリストとタグを紐付けたリストを作る 単語のリストとタグを紐付けたリストを作る モデルを作る ( 学習) モデルを作る ( 学習) モデルを作る ( 学習) モデルを作る ( 学習) モデルを作る ( 学習) モデルを作る ( 学習) 似ているエントリーを出力 似ているエントリーを出力 似ているエントリーを出力 似ているエントリーを出力 似ているエントリーを出力 似ているエントリーを出力                   64 / 73
  60. 単語のリストとタグを紐付けたリスト 単語のリストとタグを紐付けたリスト 単語のリストとタグを紐付けたリスト 単語のリストとタグを紐付けたリスト 単語のリストとタグを紐付けたリスト 単語のリストとタグを紐付けたリスト from from gensim gensim.

    .models models. .doc2vec doc2vec import import TaggedDocument TaggedDocument >> >>> > sentences sentences = = [ [] ] >> >>> > for for url url, , data data in in lines_words lines_words: : . .. .. . td td = = TaggedDocument TaggedDocument( (words words= =data data, , tags tags= =[ [url url] ]) ) . .. .. . sentences sentences. .append append( (td td) ) 65 / 73
  61. モデルを作る ( 学習) モデルを作る ( 学習) モデルを作る ( 学習) モデルを作る

    ( 学習) モデルを作る ( 学習) モデルを作る ( 学習) >> >>> > model model = = models models. .Doc2Vec Doc2Vec( (sentences sentences, , dm dm= =0 0, , vector_size vector_size= =300 300, , window window= =15 15, , alpha alpha= =.025 .025, , min_alpha min_alpha= =.025 .025, , min_count min_count= =1 1, , sample sample= =1e 1e- -6 6) ) >> >>> > print print( ('\n 訓練開始' '\n 訓練開始') ) >> >>> > for for epoch epoch in in range range( (20 20) ): : . .. .. . print print( ('Epoch: {}' 'Epoch: {}'. .format format( (epoch epoch + + 1 1) )) ) . .. .. . model model. .train train( (sentences sentences, , total_examples total_examples= =model model. .corpus_count corpus_count, , epochs epochs= =model model. .epochs epochs) ) . .. .. . model model. .alpha alpha -= -= ( (0.025 0.025 - - 0.0001 0.0001) ) / / 19 19 . .. .. . model model. .min_alpha min_alpha = = model model. .alpha alpha 66 / 73
  62. 似ているエントリーを出力 似ているエントリーを出力 似ているエントリーを出力 似ているエントリーを出力 似ているエントリーを出力 似ているエントリーを出力 >> >>> > ls_similar_doc

    ls_similar_doc = = [ [] ] >> >>> > for for url url, , data data in in lines_words lines_words: : . .. .. . similar_doc similar_doc = = { {'url' 'url': : url url} } . .. .. . similar_ids similar_ids = = model model. .docvecs docvecs. .most_similar most_similar( (url url, , topn topn= =3 3) ) . .. .. . for for i i, , ( (cname cname, , value value) ) in in enumerate enumerate( (similar_ids similar_ids) ): : . .. .. . similar_doc similar_doc[ [f f'{i+1} 位' '{i+1} 位'] ] = = cname cname . .. .. . similar_doc similar_doc[ [f f'score{i+1}' 'score{i+1}'] ] = = f f"{value:.2f}" "{value:.2f}" . .. .. . ls_similar_doc ls_similar_doc. .append append( (similar_doc similar_doc) ) . .. .. . df_sim df_sim = = pd pd. .DataFrame DataFrame( (ls_similar_doc ls_similar_doc) )[ [[ ['url' 'url', , '1 位' '1 位', , '2 位' '2 位', , '3 位' '3 位', , 'score1' 'score1', , 'score2' 'score2', , 'score3' 'score3'] ]] ] . .. .. . df_sim df_sim. .to_excel to_excel( ('resou-sim.xlsx' 'resou-sim.xlsx') ) 67 / 73
  63. 同じ意味を持つ単語を出力 同じ意味を持つ単語を出力 同じ意味を持つ単語を出力 同じ意味を持つ単語を出力 同じ意味を持つ単語を出力 同じ意味を持つ単語を出力 Word2Vec を使う Word2Vec を使う

    Word2Vec を使う Word2Vec を使う Word2Vec を使う Word2Vec を使う >> >>> > from from gensim gensim. .models models import import word2vec word2vec >> >>> > sentences sentences = = word2vec word2vec. .Text8Corpus Text8Corpus( ('words.txt' 'words.txt') ) >> >>> > model model = = word2vec word2vec. .Word2Vec Word2Vec( (sentences sentences, , size size= =200 200, , min_count min_count= =20 20, , window window= =15 15) ) >> >>> > [ [w w for for w w in in model model. .wv wv. .most_similar most_similar( (positive positive= =[ [' ロボット' ' ロボット'] ]) )] ] [ [( (' 対話' ' 対話', , 0.9823681116104126 0.9823681116104126) ), , ( (' 人間' ' 人間', , 0.9746276140213013 0.9746276140213013) ), , ( ('ai' 'ai', , 0.9576572775840759 0.9576572775840759) ), , ( (' 表情' ' 表情', , 0.9486445188522339 0.9486445188522339) ), , ( (' アンドロイド' ' アンドロイド', , 0.9475428462028503 0.9475428462028503) ), , . .. .. .. . 68 / 73
  64. Wikipedia のデータと比較 Wikipedia のデータと比較 Wikipedia のデータと比較 Wikipedia のデータと比較 Wikipedia のデータと比較

    Wikipedia のデータと比較 ロボット ロボット ロボット ロボット ロボット ロボット 1 位| OU Word: 対話 | Wiki word: メカ 1 位| OU Word: 対話 | Wiki word: メカ 2 位| OU Word: 人間 | Wiki word: アンドロイド 2 位| OU Word: 人間 | Wiki word: アンドロイド 3 位| OU Word: ai | Wiki word: ロボ 3 位| OU Word: ai | Wiki word: ロボ 4 位| OU Word: 表情 | Wiki word: パワードスーツ 4 位| OU Word: 表情 | Wiki word: パワードスーツ 免疫 免疫 免疫 免疫 免疫 免疫 1 位| OU Word: 自己免疫疾患 | Wiki word: 代謝 1 位| OU Word: 自己免疫疾患 | Wiki word: 代謝 2 位| OU Word: アレルギー疾患 | Wiki word: 病態 2 位| OU Word: アレルギー疾患 | Wiki word: 病態 3 位| OU Word: インフルエンザ | Wiki word: 血小板 3 位| OU Word: インフルエンザ | Wiki word: 血小板 4 位| OU Word: 炎症性疾患 | Wiki word: アレルギー 4 位| OU Word: 炎症性疾患 | Wiki word: アレルギー 69 / 73
  65. その他の応用を考える その他の応用を考える その他の応用を考える その他の応用を考える その他の応用を考える その他の応用を考える アンケート結果から、専門性のある単語を抜き出す アンケート結果から、専門性のある単語を抜き出す アンケート結果から、専門性のある単語を抜き出す アンケート結果から、専門性のある単語を抜き出す

    アンケート結果から、専門性のある単語を抜き出す アンケート結果から、専門性のある単語を抜き出す 注目が上がっている単語をピックアップする 注目が上がっている単語をピックアップする 注目が上がっている単語をピックアップする 注目が上がっている単語をピックアップする 注目が上がっている単語をピックアップする 注目が上がっている単語をピックアップする 似ていて同じ意味の単語をまとめる 似ていて同じ意味の単語をまとめる 似ていて同じ意味の単語をまとめる 似ていて同じ意味の単語をまとめる 似ていて同じ意味の単語をまとめる 似ていて同じ意味の単語をまとめる アンケートの自動タグ付け、似たアンケートを集計する アンケートの自動タグ付け、似たアンケートを集計する アンケートの自動タグ付け、似たアンケートを集計する アンケートの自動タグ付け、似たアンケートを集計する アンケートの自動タグ付け、似たアンケートを集計する アンケートの自動タグ付け、似たアンケートを集計する カナ文字列にして、読み仮名をふる カナ文字列にして、読み仮名をふる カナ文字列にして、読み仮名をふる カナ文字列にして、読み仮名をふる カナ文字列にして、読み仮名をふる カナ文字列にして、読み仮名をふる 編集距離から表記揺れを見つける 編集距離から表記揺れを見つける 編集距離から表記揺れを見つける 編集距離から表記揺れを見つける 編集距離から表記揺れを見つける 編集距離から表記揺れを見つける                                     72 / 73
  66. Thank you! Thank you! Thank you! Thank you! Thank you!

    Thank you! ご質問をお待ちしております ご質問をお待ちしております ご質問をお待ちしております ご質問をお待ちしております ご質問をお待ちしております ご質問をお待ちしております @terapyon @terapyon @terapyon @terapyon @terapyon @terapyon 73 / 73