{"nbformat":4,"nbformat_minor":0,"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.7.1"},"colab":{"name":"typical_methods.ipynb","provenance":[],"collapsed_sections":[],"toc_visible":true}},"cells":[{"cell_type":"markdown","metadata":{"id":"d7GEdY43-cX6"},"source":["# 代表的な自然言語処理; 日本語, mecabコード編\n","- [補足説明](./typical_methods.md)\n","- mecabによる形態素解析\n","    - 出力オプションの例\n","    - ノード単位で処理し、原型取得する例\n","- NLTKの利用\n","    - KWIC（もしくはKWIC index）\n","    - コロケーション（collocations）\n","    - 単語の出現頻度順\n","    - 単語の条件付き出現頻度\n","- KNPによる係り受け解析\n","    - 文節単位での処理例\n","    - 係り受けを利用したクエリ検索例"]},{"cell_type":"markdown","metadata":{"id":"nSt_r56U-ukW"},"source":["## 環境構築\n","- 形態素解析ツール: mecab\n","  - 形態素解析用辞書: Neologd\n","- 係り受け解析ツール: KNP\n","  - 内部で利用するための形態素解析システム: JUMAN (JUMAN++ではない)斜体テキスト"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"e7LXIqSH-itH","executionInfo":{"status":"ok","timestamp":1618232992045,"user_tz":-540,"elapsed":610983,"user":{"displayName":"TOMA Naruaki","photoUrl":"","userId":"11747312442870110137"}},"outputId":"0ee55635-7303-4206-f3c6-60fe9bce5d53"},"source":["!date\n","\n","# 1. MeCab と 辞書(mecab-ipadic-NEologd)のインストール\n","!apt-get -q -y install sudo file mecab libmecab-dev mecab-ipadic-utf8 git curl python-mecab > /dev/null\n","!git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git > /dev/null \n","!echo yes | mecab-ipadic-neologd/bin/install-mecab-ipadic-neologd -n > /dev/null 2>&1\n","!pip install mecab-python3 > /dev/null\n","\n","# シンボリックリンクによるエラー回避\n","!ln -s /etc/mecabrc /usr/local/etc/mecabrc\n","\n","\n","# 2. NLTKインストール\n","!pip install nltk\n","\n","import nltk\n","nltk.download('stopwords')\n","\n","# 3. データセット用意\n","# データ準備\n","# https://newtechnologylifestyle.net/711-2/\n","# momotaro.txtは、上記を使ってルビを除外したもの。\n","!curl -O https://raw.githubusercontent.com/naltoma/datamining_intro/master/3-nlp/corpus/momotaro.txt\n","!mkdir corpus\n","!mv momotaro.txt corpus/\n","filename = \"./corpus/momotaro.txt\"\n","\n","# 4. matplotlib で日本語フォントを使うための環境構築\n","!pip install japanize-matplotlib\n","\n","# 5. JUMAN\n","!wget \"http://nlp.ist.i.kyoto-u.ac.jp/nl-resource/juman/juman-7.01.tar.bz2\"\n","!bzip2 -dc juman-7.01.tar.bz2 | tar xvf - >& /dev/null\n","%cd juman-7.01/\n","!./configure >& /dev/null\n","!make >& /dev/null\n","!make install >& /dev/null\n","%cd ..\n","!ldconfig\n","\n","# 6. KNP\n","!wget http://nlp.ist.i.kyoto-u.ac.jp/nl-resource/knp/knp-4.19.tar.bz2\n","!tar jxvf knp-4.19.tar.bz2 >& /dev/null\n","%cd knp-4.19\n","!./configure >& /dev/null\n","!make >& /dev/null\n","!make install >& /dev/null\n","%cd ..\n","\n","!pip install pyknp\n","!date"],"execution_count":1,"outputs":[{"output_type":"stream","text":["Mon Apr 12 12:59:41 UTC 2021\n","Cloning into 'mecab-ipadic-neologd'...\n","remote: Enumerating objects: 75, done.\u001b[K\n","remote: Counting objects: 100% (75/75), done.\u001b[K\n","remote: Compressing objects: 100% (74/74), done.\u001b[K\n","remote: Total 75 (delta 5), reused 54 (delta 0), pack-reused 0\u001b[K\n","Unpacking objects: 100% (75/75), done.\n","Requirement already satisfied: nltk in /usr/local/lib/python3.7/dist-packages (3.2.5)\n","Requirement already satisfied: six in /usr/local/lib/python3.7/dist-packages (from nltk) (1.15.0)\n","[nltk_data] Downloading package stopwords to /root/nltk_data...\n","[nltk_data]   Unzipping corpora/stopwords.zip.\n","  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current\n","                                 Dload  Upload   Total   Spent    Left  Speed\n","100 16575  100 16575    0     0   126k      0 --:--:-- --:--:-- --:--:--  126k\n","Collecting japanize-matplotlib\n","\u001b[?25l  Downloading https://files.pythonhosted.org/packages/aa/85/08a4b7fe8987582d99d9bb7ad0ff1ec75439359a7f9690a0dbf2dbf98b15/japanize-matplotlib-1.1.3.tar.gz (4.1MB)\n","\u001b[K     |████████████████████████████████| 4.1MB 4.5MB/s \n","\u001b[?25hRequirement already satisfied: matplotlib in /usr/local/lib/python3.7/dist-packages (from japanize-matplotlib) (3.2.2)\n","Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.7/dist-packages (from matplotlib->japanize-matplotlib) (0.10.0)\n","Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib->japanize-matplotlib) (2.4.7)\n","Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib->japanize-matplotlib) (2.8.1)\n","Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib->japanize-matplotlib) (1.3.1)\n","Requirement already satisfied: numpy>=1.11 in /usr/local/lib/python3.7/dist-packages (from matplotlib->japanize-matplotlib) (1.19.5)\n","Requirement already satisfied: six in /usr/local/lib/python3.7/dist-packages (from cycler>=0.10->matplotlib->japanize-matplotlib) (1.15.0)\n","Building wheels for collected packages: japanize-matplotlib\n","  Building wheel for japanize-matplotlib (setup.py) ... \u001b[?25l\u001b[?25hdone\n","  Created wheel for japanize-matplotlib: filename=japanize_matplotlib-1.1.3-cp37-none-any.whl size=4120276 sha256=695ba8dd02c88edb5bf0d29dde9f054c5de6f45ef70a99fdf33428c00c7629cd\n","  Stored in directory: /root/.cache/pip/wheels/b7/d9/a2/f907d50b32a2d2008ce5d691d30fb6569c2c93eefcfde55202\n","Successfully built japanize-matplotlib\n","Installing collected packages: japanize-matplotlib\n","Successfully installed japanize-matplotlib-1.1.3\n","--2021-04-12 13:01:15--  http://nlp.ist.i.kyoto-u.ac.jp/nl-resource/juman/juman-7.01.tar.bz2\n","Resolving nlp.ist.i.kyoto-u.ac.jp (nlp.ist.i.kyoto-u.ac.jp)... 133.242.249.182\n","Connecting to nlp.ist.i.kyoto-u.ac.jp (nlp.ist.i.kyoto-u.ac.jp)|133.242.249.182|:80... connected.\n","HTTP request sent, awaiting response... 301 Moved Permanently\n","Location: https://nlp.ist.i.kyoto-u.ac.jp/nl-resource/juman/juman-7.01.tar.bz2 [following]\n","--2021-04-12 13:01:15--  https://nlp.ist.i.kyoto-u.ac.jp/nl-resource/juman/juman-7.01.tar.bz2\n","Connecting to nlp.ist.i.kyoto-u.ac.jp (nlp.ist.i.kyoto-u.ac.jp)|133.242.249.182|:443... connected.\n","HTTP request sent, awaiting response... 200 OK\n","Length: 4286891 (4.1M) [application/x-bzip2]\n","Saving to: ‘juman-7.01.tar.bz2’\n","\n","juman-7.01.tar.bz2  100%[===================>]   4.09M  1.12MB/s    in 4.5s    \n","\n","2021-04-12 13:01:20 (922 KB/s) - ‘juman-7.01.tar.bz2’ saved [4286891/4286891]\n","\n","/content/juman-7.01\n","/content\n","/sbin/ldconfig.real: /usr/local/lib/python3.7/dist-packages/ideep4py/lib/libmkldnn.so.0 is not a symbolic link\n","\n","--2021-04-12 13:01:47--  http://nlp.ist.i.kyoto-u.ac.jp/nl-resource/knp/knp-4.19.tar.bz2\n","Resolving nlp.ist.i.kyoto-u.ac.jp (nlp.ist.i.kyoto-u.ac.jp)... 133.242.249.182\n","Connecting to nlp.ist.i.kyoto-u.ac.jp (nlp.ist.i.kyoto-u.ac.jp)|133.242.249.182|:80... connected.\n","HTTP request sent, awaiting response... 301 Moved Permanently\n","Location: https://nlp.ist.i.kyoto-u.ac.jp/nl-resource/knp/knp-4.19.tar.bz2 [following]\n","--2021-04-12 13:01:48--  https://nlp.ist.i.kyoto-u.ac.jp/nl-resource/knp/knp-4.19.tar.bz2\n","Connecting to nlp.ist.i.kyoto-u.ac.jp (nlp.ist.i.kyoto-u.ac.jp)|133.242.249.182|:443... connected.\n","HTTP request sent, awaiting response... 200 OK\n","Length: 799622946 (763M) [application/x-bzip2]\n","Saving to: ‘knp-4.19.tar.bz2’\n","\n","knp-4.19.tar.bz2    100%[===================>] 762.58M  11.6MB/s    in 72s     \n","\n","2021-04-12 13:03:00 (10.6 MB/s) - ‘knp-4.19.tar.bz2’ saved [799622946/799622946]\n","\n","/content/knp-4.19\n","/content\n","Collecting pyknp\n","\u001b[?25l  Downloading https://files.pythonhosted.org/packages/da/4c/40d20e3161001c8c5f84e992fa7e646b72dd87a578ae2f434ea48d747d32/pyknp-0.4.6.zip (43kB)\n","\u001b[K     |████████████████████████████████| 51kB 2.4MB/s \n","\u001b[?25hRequirement already satisfied: six in /usr/local/lib/python3.7/dist-packages (from pyknp) (1.15.0)\n","Building wheels for collected packages: pyknp\n","  Building wheel for pyknp (setup.py) ... \u001b[?25l\u001b[?25hdone\n","  Created wheel for pyknp: filename=pyknp-0.4.6-cp37-none-any.whl size=40483 sha256=61e3e909efdea3318c4b65f836fba482422c4b06cb37ac8163f37b29306b69ac\n","  Stored in directory: /root/.cache/pip/wheels/83/7d/57/26589109b4711fda6fd9c8b30408a744269c93e2bbac8b7a23\n","Successfully built pyknp\n","Installing collected packages: pyknp\n","Successfully installed pyknp-0.4.6\n","Mon Apr 12 13:09:51 UTC 2021\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"D5kBFad5ITS4"},"source":["## 形態素解析"]},{"cell_type":"code","metadata":{"scrolled":true,"colab":{"base_uri":"https://localhost:8080/"},"id":"LXksRV0Z-cYE","executionInfo":{"status":"ok","timestamp":1618232992570,"user_tz":-540,"elapsed":611493,"user":{"displayName":"TOMA Naruaki","photoUrl":"","userId":"11747312442870110137"}},"outputId":"b15b5073-f5f8-4655-f611-2b2b62706ce2"},"source":["# 形態素解析\n","# 辞書により解析結果(推定結果)が変わる\n","import MeCab\n","tagger = MeCab.Tagger() #デフォルト辞書利用\n","print(tagger.parse(\"すもももももももものうち\"))\n","\n","print('----')\n","\n","# Neologd利用\n","path = \"-d /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd\"\n","tagger = MeCab.Tagger(path)\n","print(tagger.parse(\"すもももももももものうち\"))"],"execution_count":2,"outputs":[{"output_type":"stream","text":["すもも\t名詞,一般,*,*,*,*,すもも,スモモ,スモモ\n","も\t助詞,係助詞,*,*,*,*,も,モ,モ\n","もも\t名詞,一般,*,*,*,*,もも,モモ,モモ\n","も\t助詞,係助詞,*,*,*,*,も,モ,モ\n","もも\t名詞,一般,*,*,*,*,もも,モモ,モモ\n","の\t助詞,連体化,*,*,*,*,の,ノ,ノ\n","うち\t名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ\n","EOS\n","\n","----\n","すもももももももものうち\t名詞,固有名詞,一般,*,*,*,すもももももももものうち,スモモモモモモモモノウチ,スモモモモモモモモノウチ\n","EOS\n","\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"9P2aGfRH-cYF","executionInfo":{"status":"ok","timestamp":1618232992571,"user_tz":-540,"elapsed":611483,"user":{"displayName":"TOMA Naruaki","photoUrl":"","userId":"11747312442870110137"}},"outputId":"2b9a903b-1086-4fcc-e3bf-98a9054dbc6a"},"source":["# MeCab.Tagger() 時の出力オプションで、パース結果が変わる。\n","# parse() は単に文字列出力する。オプションは mecab --help で調べよう。\n","tagger = MeCab.Tagger('-Ochasen ' + path)\n","print(tagger.parse(\"すもももももももものうち\"))\n","\n","print('----')\n","\n","tagger = MeCab.Tagger('-Owakati ' + path)\n","print(tagger.parse(\"すもももももももものうち\"))"],"execution_count":3,"outputs":[{"output_type":"stream","text":["すもももももももものうち\tスモモモモモモモモノウチ\tすもももももももものうち\t名詞-固有名詞-一般\t\t\n","EOS\n","\n","----\n","すもももももももものうち \n","\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"VkrjvsZ7-cYG","executionInfo":{"status":"ok","timestamp":1618232992571,"user_tz":-540,"elapsed":611473,"user":{"displayName":"TOMA Naruaki","photoUrl":"","userId":"11747312442870110137"}},"outputId":"00bf56e6-f853-4e13-e2a0-ff0951f7c4be"},"source":["# parseToNode() を使うと、ノード単位で処理しやすい。\n","import MeCab\n","tagger = MeCab.Tagger(path)\n","\n","sentence = \"おじいさんは山へしば刈かりに、おばあさんは川へ洗濯せんたくに行きました。\"\n","node = tagger.parseToNode(sentence)\n","while node:\n","   features = node.feature.split(\",\")\n","   original = features[6]\n","   print('node.surface={}, node.feature={} => original = {}'.format(node.surface,node.feature,original))\n","   node = node.next\n"],"execution_count":4,"outputs":[{"output_type":"stream","text":["node.surface=, node.feature=BOS/EOS,*,*,*,*,*,*,*,* => original = *\n","node.surface=おじいさん, node.feature=名詞,一般,*,*,*,*,おじいさん,オジイサン,オジーサン => original = おじいさん\n","node.surface=は, node.feature=助詞,係助詞,*,*,*,*,は,ハ,ワ => original = は\n","node.surface=山, node.feature=名詞,一般,*,*,*,*,山,ヤマ,ヤマ => original = 山\n","node.surface=へ, node.feature=助詞,格助詞,一般,*,*,*,へ,ヘ,エ => original = へ\n","node.surface=しば, node.feature=名詞,一般,*,*,*,*,しば,シバ,シバ => original = しば\n","node.surface=刈, node.feature=名詞,一般,*,*,*,*,刈,カリ,カリ => original = 刈\n","node.surface=かりに, node.feature=副詞,一般,*,*,*,*,かりに,カリニ,カリニ => original = かりに\n","node.surface=、, node.feature=記号,読点,*,*,*,*,、,、,、 => original = 、\n","node.surface=おばあさん, node.feature=名詞,一般,*,*,*,*,おばあさん,オバアサン,オバーサン => original = おばあさん\n","node.surface=は, node.feature=助詞,係助詞,*,*,*,*,は,ハ,ワ => original = は\n","node.surface=川, node.feature=名詞,一般,*,*,*,*,川,カワ,カワ => original = 川\n","node.surface=へ, node.feature=助詞,格助詞,一般,*,*,*,へ,ヘ,エ => original = へ\n","node.surface=洗濯, node.feature=名詞,サ変接続,*,*,*,*,洗濯,センタク,センタク => original = 洗濯\n","node.surface=せんたく, node.feature=名詞,固有名詞,一般,*,*,*,せんたく,センタク,センタク => original = せんたく\n","node.surface=に, node.feature=助詞,格助詞,一般,*,*,*,に,ニ,ニ => original = に\n","node.surface=行き, node.feature=動詞,自立,*,*,五段・カ行促音便,連用形,行く,イキ,イキ => original = 行く\n","node.surface=まし, node.feature=助動詞,*,*,*,特殊・マス,連用形,ます,マシ,マシ => original = ます\n","node.surface=た, node.feature=助動詞,*,*,*,特殊・タ,基本形,た,タ,タ => original = た\n","node.surface=。, node.feature=記号,句点,*,*,*,*,。,。,。 => original = 。\n","node.surface=, node.feature=BOS/EOS,*,*,*,*,*,*,*,* => original = *\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"0-5wxPv3Idb5"},"source":["## コンコーダンス（語句集）"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"rzBArHT5-cYG","executionInfo":{"status":"ok","timestamp":1618232994075,"user_tz":-540,"elapsed":612967,"user":{"displayName":"TOMA Naruaki","photoUrl":"","userId":"11747312442870110137"}},"outputId":"8354f60a-e6ef-410d-a89d-015c042d2721"},"source":["# concordance\n","\n","with open(filename, \"r\") as fh:\n","    sentences = \"\"\n","    for line in fh.readlines():\n","        sentences += line + \" \"\n","\n","def tokenize(sentences):\n","    \"\"\"文章を分かち書きする。\n","\n","    :param sentences(str): 複数の文章を含む文字列。日本語想定。\n","    :return(list): 分かち書きした単語をlistとしてまとめたもの。\n","    \"\"\"\n","\n","    # 「。」、「！」、「？」で終わる一連の文字列を文として認識し分割する。\n","    jp_sent_tokenizer = nltk.RegexpTokenizer(u'[^　「」！？。]*[！？。]')\n","    tagger = MeCab.Tagger('-Owakati ' + path)\n","\n","    sents = jp_sent_tokenizer.tokenize(sentences)\n","    tokens = []\n","    for sent in sents:\n","        for word in tagger.parse(sent).split(\" \"):\n","            if word == \" \" or word == \"\\n\":\n","                continue\n","            tokens.append(word)\n","    return tokens\n","\n","tokens = tokenize(sentences)\n","text = nltk.Text(tokens)\n","print('\\n# nltk.Text.concordance with \"おじいさん\"')\n","text.concordance(\"おじいさん\")"],"execution_count":5,"outputs":[{"output_type":"stream","text":["\n","# nltk.Text.concordance with \"おじいさん\"\n","Displaying 17 of 17 matches:\n","                                     おじいさん と おばあさん が あり まし た 。 まいにち 、 おじいさん は 山\n","                                     おじいさん は 山 へ しば刈り に 、 おばあさん は 川 へ 洗濯 に 行き ま\n"," 来 まし た 。 おやおや 、 これ は みごと な 桃 だ こと 。 おじいさん へ の おみやげ に 、 どれどれ 、 うち へ 持っ て 帰り ましょ\n","い ながら 、 おばあさん の 前 へ 流れ て 来 まし た 。 早く おじいさん と 二人 で 分けて 食べ ましょ う 。 と 言っ て 、 桃 を ひ\n"," て お うち へ 帰り まし た 。 夕方 に なっ て やっ と 、 おじいさん は 山 から しば を 背負っ て 帰っ て 来 まし た 。 おばあさ\n","っ て 来 まし た 。 おばあさん 、 今 帰っ た よ 。 おや 、 おじいさん 、 おか いん なさい 。 待っ て い まし た よ 。 さあ 、 早\n","だ ね 、 その いい もの という の は 。 こう いい ながら 、 おじいさん は わらじ を ぬい で 、 上 に 上がり まし た 。 ほら 、 ご\n","赤さん が 元気 よく とび出 し まし た 。 おやおや 、 まあ 。 おじいさん も 、 おばあさん も 、 びっくり し て 、 二人 いっしょ に 声\n"," 神さま が この 子 を さずけ て 下さっ た に ちがい ない 。 おじいさん も 、 おばあさん も 、 うれし がっ て 、 こう 言い まし た \n"," 、 うれし がっ て 、 こう 言い まし た 。 そこで あわて て おじいさん が お湯 を わかす やら 、 おばあさん が むつき を そろえる や\n","いう ので 、 この 子 に 桃太郎 という 名 を つけ まし た 。 おじいさん と おばあさん は 、 それ は それ は だいじ に し て 桃太郎 \n","くらい でし た が 、 その くせ 気だて はごく やさしくっ て 、 おじいさん と おばあさん に よく 孝行 を し まし た 。 桃太郎 は 十五 \n"," それ は いさましい こと だ 。 じゃあ 行っ て おい で 。 と おじいさん は 言い まし た 。 まあ 、 そんな 遠方 へ 行く の で は 、\n","。 じゃあ 、 りっぱ に 鬼 を 退治 し て くる が いい 。 と おじいさん は 言い まし た 。 気 を つけ て 、 けが を し ない よう \n","う 。 と 元気 な 声 を のこし て 、 出 て いき まし た 。 おじいさん と おばあさん は 、 門 の 外 に 立っ て 、 いつまでも 、 い\n"," もと くい らしい 様子 を し て 帰っ て 来 まし た ので 、 おじいさん も おばあさん も 、 目 も 鼻 も なくし て 喜び まし た 。 \n"," た 。 えらい ぞ 、 えらい ぞ 、 それ こそ 日本一 だ 。 と おじいさん は 言い まし た 。 まあ 、 まあ 、 けが が なくっ て 、 何\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"IS_WNMK_JcUz"},"source":["## コロケーション（連語）"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"MvEehnnP-cYH","executionInfo":{"status":"ok","timestamp":1618232994075,"user_tz":-540,"elapsed":612957,"user":{"displayName":"TOMA Naruaki","photoUrl":"","userId":"11747312442870110137"}},"outputId":"df292439-5d57-49f0-c086-ba54e756baeb"},"source":["# collocation\n","\n","print(\"\\n# nltk.Text.collocations\")\n","print(\"## default\")\n","text.collocations()\n","\n","print(\"\\n## collocations(window_size=5)\")\n","text.collocations(window_size=5)"],"execution_count":6,"outputs":[{"output_type":"stream","text":["\n","# nltk.Text.collocations\n","## default\n","ドンブラ コッコ; いかめしい くろがね; さけび ながら\n","\n","## collocations(window_size=5)\n","コッコ スッコッコ; ドンブラ コッコ; ドンブラ スッコッコ; おじいさん おばあさん; どちら おいで; 鬼が島 せいばつ; 日本一\n","きびだんご; ござい 日本一; こっこ こっこ; いつまでも 見送っ; ぎゅうぎゅう 押さえつけ; たずね 鬼が島; きびだんご もらっ;\n","いかめしい くろがね; 下さい ましょ; きびだんご 下さい; 見える 見える; キャッ キャッ; コッコ ドンブラ; スッコッコ コッコ\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"bt7ca76OJj8p"},"source":["## 単語の出現頻度"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":389},"id":"RAlgs0Ge-cYH","executionInfo":{"status":"ok","timestamp":1618232994761,"user_tz":-540,"elapsed":613633,"user":{"displayName":"TOMA Naruaki","photoUrl":"","userId":"11747312442870110137"}},"outputId":"02dfda63-80f2-45cf-8d48-b407639a81ad"},"source":["# 単語の出現頻度順\n","\n","print(\"\\n# FreqDist\")\n","fdist = nltk.FreqDist(tokens)\n","check_num = 30\n","print(fdist.most_common(check_num))\n","\n","%matplotlib inline\n","import japanize_matplotlib\n","fdist.plot(check_num)\n"],"execution_count":7,"outputs":[{"output_type":"stream","text":["\n","# FreqDist\n","[('、', 252), ('。', 178), ('た', 119), ('て', 116), ('まし', 92), ('に', 86), ('を', 82), ('と', 76), ('の', 74), ('は', 73), ('が', 46), ('で', 29), ('桃太郎', 29), ('し', 27), ('も', 27), ('へ', 21), ('から', 20), ('だ', 19), ('おじいさん', 17), ('おばあさん', 16), ('う', 16), ('ます', 16), ('鬼', 16), ('言い', 15), ('来', 13), ('ながら', 13), ('お', 12), ('い', 12), ('な', 10), ('もの', 10)]\n"],"name":"stdout"},{"output_type":"display_data","data":{"image/png":"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\n","text/plain":["<Figure size 432x288 with 1 Axes>"]},"metadata":{"tags":[],"needs_background":"light"}}]},{"cell_type":"markdown","metadata":{"id":"ao8OzoudJnbk"},"source":["## bi-gram"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":379},"id":"M0UV1reW-cYI","executionInfo":{"status":"ok","timestamp":1618232994761,"user_tz":-540,"elapsed":613622,"user":{"displayName":"TOMA Naruaki","photoUrl":"","userId":"11747312442870110137"}},"outputId":"66372079-2739-4a77-9db2-c5fbd8bad99c"},"source":["# bigram\n","print(\"\\n# FreqDist with bigram (2-gram)\")\n","bigrams = nltk.bigrams(tokens)\n","bigrams_fdist = nltk.FreqDist(bigrams)\n","print(bigrams_fdist.most_common(check_num))\n","\n","# conditional FreqDist\n","cfd = nltk.ConditionalFreqDist(bigrams_fdist)\n","cfd.plot(conditions=[\"桃太郎\", \"鬼\"])\n"],"execution_count":8,"outputs":[{"output_type":"stream","text":["\n","# FreqDist with bigram (2-gram)\n","[(('まし', 'た'), 92), (('た', '。'), 91), (('て', '、'), 48), (('。', 'と'), 31), (('は', '、'), 24), (('と', '、'), 17), (('し', 'て'), 14), (('。', '桃太郎'), 14), (('ながら', '、'), 13), (('に', '、'), 12), (('う', '。'), 11), (('言い', 'まし'), 11), (('桃太郎', 'は'), 11), (('て', 'い'), 10), (('ます', '。'), 10), (('て', '来'), 9), (('ましょ', 'う'), 9), (('で', '、'), 9), (('来', 'まし'), 8), (('を', 'し'), 8), (('、', '桃太郎'), 8), (('、', 'おじいさん'), 7), (('と', 'おばあさん'), 7), (('言っ', 'て'), 7), (('も', '、'), 7), (('から', '、'), 7), (('に', 'なり'), 7), (('だ', '。'), 7), (('よし', '、'), 7), (('桃太郎', 'さん'), 7)]\n"],"name":"stdout"},{"output_type":"display_data","data":{"image/png":"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\n","text/plain":["<Figure size 432x288 with 1 Axes>"]},"metadata":{"tags":[],"needs_background":"light"}}]},{"cell_type":"markdown","metadata":{"id":"gQL4_p5WJ1Kv"},"source":["## 係り受け解析＋格解析"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"MAdtXuE_-cYI","executionInfo":{"status":"ok","timestamp":1618232995082,"user_tz":-540,"elapsed":613933,"user":{"displayName":"TOMA Naruaki","photoUrl":"","userId":"11747312442870110137"}},"outputId":"2197dcb8-ff87-4f48-c362-8ef68b7c4499"},"source":["# KNP on terminal command\n","\n","!echo \"お爺さんは山へ芝刈りに、お婆さんは川へ洗濯に行きました。\" | juman | knp"],"execution_count":9,"outputs":[{"output_type":"stream","text":["# S-ID:1 KNP:4.19-CF1.1 DATE:2021/04/12 SCORE:-1054.00784\n","お爺さんは─────┐　　　　　　　　　<体言>\n","      山へ─────┤　　　　　　　　　<体言>\n","        芝刈りに、<P>──┐　　　　　<体言>\n","お婆さんは─────┐　　　 │　　　　　<体言>\n","      川へ─────┤　　　 │　　　　　<体言>\n","            洗濯に<P>─PARA─────┐　<体言><用言:動><格解析結果:ガ/婆さん;ニ/川>\n","                      行きました。<用言:動><格解析結果:ガ/-;ヲ/-;ニ/-;デ/-;カラ/-;マデ/-;ヘ/-;時間/-;ノ/->\n","EOS\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"ttpW-OvU-cYJ","executionInfo":{"status":"ok","timestamp":1618232995549,"user_tz":-540,"elapsed":614391,"user":{"displayName":"TOMA Naruaki","photoUrl":"","userId":"11747312442870110137"}},"outputId":"fc8b3f33-dd32-4e45-ae4b-0c429d5c648c"},"source":["# KNP：文節単位での処理\n","\n","from pyknp import KNP\n","\n","knp = KNP(jumanpp=False)\n","sentence = \"お爺さんは山へ芝刈りに、お婆さんは川へ洗濯に行きました。\"\n","result = knp.parse(sentence)\n","\n","print(\"文節単位での処理\")\n","for bnst in result.bnst_list(): # 各文節へのアクセス\n","    print(\"\\tID:%d, 見出し:%s, 係り受けタイプ:%s, 親文節ID:%d, 素性:%s\" \\\n","            % (bnst.bnst_id, \"\".join(mrph.midasi for mrph in bnst.mrph_list()), bnst.dpndtype, bnst.parent_id, bnst.fstring))\n"],"execution_count":10,"outputs":[{"output_type":"stream","text":["文節単位での処理\n","\tID:0, 見出し:お爺さんは, 係り受けタイプ:D, 親文節ID:2, 素性:<文頭><ハ><助詞><体言><係:未格><提題><区切:3-5><主題表現><格要素><連用要素><正規化代表表記:爺さん/じいさん><主辞代表表記:爺さん/じいさん>\n","\tID:1, 見出し:山へ, 係り受けタイプ:D, 親文節ID:2, 素性:<ヘ><助詞><体言><一文字漢字><係:ヘ格><区切:0-0><格要素><連用要素><正規化代表表記:山/さん?山/やま><主辞代表表記:山/さん?山/やま>\n","\tID:2, 見出し:芝刈りに、, 係り受けタイプ:P, 親文節ID:5, 素性:<サ変><ニ><読点><助詞><体言><係:ニ格><並キ:名:&ST:4.0&&ニ><区切:0-4><読点並キ><並列タイプ:？><格要素><連用要素><正規化代表表記:芝刈り/しばかり><主辞代表表記:芝刈り/しばかり><並列類似度:7.576><並結句数:2><並結文節数:3>\n","\tID:3, 見出し:お婆さんは, 係り受けタイプ:D, 親文節ID:5, 素性:<ハ><助詞><体言><係:未格><提題><区切:3-5><主題表現><格要素><連用要素><正規化代表表記:婆さん/ばあさん><主辞代表表記:婆さん/ばあさん>\n","\tID:4, 見出し:川へ, 係り受けタイプ:D, 親文節ID:5, 素性:<ヘ><助詞><体言><一文字漢字><係:ヘ格><区切:0-0><格要素><連用要素><正規化代表表記:川/かわ><主辞代表表記:川/かわ>\n","\tID:5, 見出し:洗濯に, 係り受けタイプ:D, 親文節ID:6, 素性:<サ変><ニ><助詞><体言><係:連用><レベル:A><区切:0-5><ID:〜に><用言:動><サ変動詞化><連用要素><連用節><動態述語><正規化代表表記:洗濯/せんたく><主辞代表表記:洗濯/せんたく>\n","\tID:6, 見出し:行きました。, 係り受けタイプ:D, 親文節ID:-1, 素性:<文末><時制-過去><句点><用言:動><レベル:C><区切:5-5><ID:（文末）><係:文末><提題受:30><主節><格要素><連用要素><動態述語><敬語:丁寧表現><正規化代表表記:行く/いく><主辞代表表記:行く/いく>\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"-5fkAao1KYKR"},"source":["## 係り受け解析を利用したクエリ検索の例"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"lz1YYx4p-cYJ","executionInfo":{"status":"ok","timestamp":1618232995549,"user_tz":-540,"elapsed":614382,"user":{"displayName":"TOMA Naruaki","photoUrl":"","userId":"11747312442870110137"}},"outputId":"753523e3-bc52-45ca-9cc8-1997396b87af"},"source":["# 係り受けを利用したクエリ検索例\n","\n","def find_children(parse_result, parent_id):\n","    \"\"\"KNPパース結果に対し、parent_id以下の子ノード情報を取得する。\n","\n","    :param parse_result(pyknp.knp.blist.BList): KNP.parse()した結果。\n","    :param parent_id(int): 出発点となるID。\n","    :return:\n","      children_ids(list): parent_idを親とする子ノードのID一覧。\n","      children_surfaces(list): children_idsに対応したsurface一覧。\n","    \"\"\"\n","    children_ids = []\n","    children_surfaces = []\n","    for child_id, bnst in enumerate(parse_result.bnst_list()):\n","        if bnst.parent_id == parent_id:\n","            children_ids.append(child_id)\n","            surface = \"\".join(mrph.midasi for mrph in bnst.mrph_list())\n","            children_surfaces.append(surface)\n","    return children_ids, children_surfaces\n","\n","def search(parse_result, user_query):\n","    \"\"\"KNPパース結果に対し、ユーザクエリに該当するノード情報を取得する。\n","    複数該当ノードがある場合には、最初に見つかったノードのみを返す。\n","\n","    :param parse_result(pyknp.knp.blist.BList): KNP.parse()した結果。\n","    :param user_query(str): 探したい単語。\n","    :return:\n","      children_ids(list): parent_idを親とする子ノードのID一覧。\n","      children_surfaces(list): children_idsに対応したsurface一覧。\n","    \"\"\"\n","    for id, bnst in enumerate(result.bnst_list()):\n","        surface = \"\".join(mrph.midasi for mrph in bnst.mrph_list())\n","        if user_query in surface:\n","            children_ids, children_surfaces = find_children(result, id)\n","            return children_ids, children_surfaces\n","    return None, None\n","\n","user_query = \"芝刈り\"\n","print('\\n# user_query = {}'.format(user_query))\n","\n","children_ids, children_surfaces = search(result, user_query)\n","for i in range(len(children_ids)):\n","    print(\"child: id={}, surface={}\".format(children_ids[i], children_surfaces[i]))\n"],"execution_count":11,"outputs":[{"output_type":"stream","text":["\n","# user_query = 芝刈り\n","child: id=0, surface=お爺さんは\n","child: id=1, surface=山へ\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"uxYvY-li-cYJ","executionInfo":{"status":"ok","timestamp":1618232995550,"user_tz":-540,"elapsed":614372,"user":{"displayName":"TOMA Naruaki","photoUrl":"","userId":"11747312442870110137"}},"outputId":"262fe19b-37ad-406e-89ac-c5957f66d243"},"source":["!date"],"execution_count":12,"outputs":[{"output_type":"stream","text":["Mon Apr 12 13:09:55 UTC 2021\n"],"name":"stdout"}]}]}