YoJlのポケット

勉強したことや学んだことを記録しています。

実装を用いた行列の演算と基本変形(階数・逆行列・連立一次方程式)

想定する読者層

Python (numpy)の実装環境がある.
・行列の演算と基本変形をだいたい理解している.

実装環境

Google Colab
 使い方はGoogle Colabの使い方を参照ください.

1. 行列の演算

1.1. 行列の和と差

 手計算ですと, 以下のような定義が成り立ちます.

f:id:YoJl:20201215224205p:plain:w300

f:id:YoJl:20201215224402p:plain:w300

 上のように, 行列の和は要素ごとの足し算となっています.
 また, 同様に行列の差でも要素ごとの引き算となっています.

【行列の和と差の実装】
 まず, 2×2の正方行列を2つ生成します.

# 2×2の正方行列を2つ生成する
import numpy as np
A = np.arange(1,5).reshape((2,2))
B = np.arange(11,15).reshape((2,2))
print(A)
print(B)

出力
[[1 2]
 [3 4]]
[[11 12]
 [13 14]]

# AとBの足し算を行う
C = A + B
print(C)

出力
[[12 14]
 [16 18]]

# AとBの引き算を行う
C = A - B
print(C)

出力
[[-10 -10]
 [-10 -10]]

1.2. 行列のスカラー

 手計算ですと, 以下のような定義が成り立ちます.

f:id:YoJl:20201215224553p:plain:w300

 上のように, 要素一つ一つをスカラー(k)倍します.

【行列のスカラー倍の実装】
 まず, 2×2の正方行列を生成します.

# 2×2の正方行列を生成する
import numpy as np
A = np.arange(1,5).reshape((2,2))
print(A)

出力
[[1 2]
 [3 4]]

# Aをk倍する
k = 2
D = k * A
print(D)

出力
[[2 4]
 [6 8]]

1.3. 行列の積

 手計算ですと, 以下のような定義が成り立ちます.

f:id:YoJl:20201219224549p:plain:w550

 上のように, Aの行ベクトルとBの列ベクトルを用いて計算します.

【行列の積の実装】
 まず, 2×2の正方行列を2つ生成します.

# 2×2の正方行列を2つ生成する
import numpy as np
A = np.arange(1,5).reshape((2,2))
B = np.arange(11,15).reshape((2,2))
print(A)
print(B)

出力
[[1 2]
 [3 4]]
[[11 12]
 [13 14]]

# AとBの積算
E = A @ B
print(E)

出力
[[37 40]
 [85 92]]

ちなみに, 要素ごとの積算をしたい場合は, A * Bとします.

2. 行列の基本変形

 行列の基本変形を行うことで, 行列の階数, 逆行列などを求めることが可能です.
 行列の基本変形の操作の種類は以下の通りです.

① 行(列)を入れ替える
② 行(列)を定数倍する. ただし, 定数は0以外に限る.
③ ある行(列)に他の行(列)の定数倍を加える.

また,
行に対して行う基本変形を特に行の基本変形,
列に対して行う基本変形を特に列の基本変形といいます.
基本変形は, 線形代数の基礎となります.

さらに, 行の基本変形はどのような問題でも利用可能ですが, 列の基本変形は使える問題が限られます.
一般的には, 列の基本変形は行列の階数を求める問題のみで利用可能と覚えると良いと思います.
※厳密には, 他にも列の基本変形を用いることができる問題もありますが, 行の基本変形で代用可能です.

2.1. 行列の階数

 行列の基本変形を用いて, 標準形を作ります.
 このとき, 現れた1の個数が階数です.
階数のイメージとしては, 次元数のことです.

【行列の階数の実装】

# 2×2の正方行列を生成する
import numpy as np
# 0から9の3×3の行列を生成
A = np.random.randint(0, 10, (3, 3))
print(A)

出力
[[4 2 5]
 [3 1 0]]
 [6 7 1]]

# 階数を求める
print(np.linalg.matrix_rank(A))

出力
3

2.2. 逆行列

n次の正方行列Aについて,

AX = E, XA = E

このとき, XA逆行列といいます.
また, 逆行列をもつ行列を正則行列といいます.
逆行列の求め方は,

f:id:YoJl:20201223232719p:plain:w280

とおき, 行の基本変形を行うことで,

f:id:YoJl:20201223232909p:plain:w220

という形にします. したがって、

f:id:YoJl:20201223233051p:plain:w200

【行列の階数の実装】

# ある一次独立の行列を用意
import numpy as np
A = np.array([[1, 2, 3], [2, 3, 1], [2, 4, 5]])
print(A)

出力
[[1 2 3]
 [2 3 1]]
 [2 4 5]]

# 逆数を求める
print(np.linalg.inv(A))

出力
[[11. 2. -7.]
 [-8. -1. 5.]
 [ 2. 0. -1.]]

2.3. 行列の連立一次方程式
f:id:YoJl:20201221210505p:plain:w200

について,

f:id:YoJl:20201221210647p:plain:w450

とすると, A係数行列, b定数ベクトル, (Ab)係数拡大行列
といいます.

この係数拡大行列において,

f:id:YoJl:20201221210945p:plain:w500

となるように行の基本変形を行います. E単位行列です.
また, パラメータの個数が0のとき, 一次独立といい, そうでないときは, 一次従属といいます.
パラメータの個数は以下の方法で求めることができます.

パラメータの個数 = 未知数(x,yなど)の個数ーrank(階数)

【行列の連立一次方程式の実装~解が一つの値に定まる~】

import numpy as np
# ある係数拡大行列を用意
A = np.array([[2, 4], [3, 7]])
b = np.array([[16], [27]])
A_b = np.hstack([A, b])
print(A_b)

出力
[[2 4 16]
 [3 7 27]]

from numpy.linalg import solve
print(solve(A, b))

出力
[[2.]
 [3.]]

となり, x=2, y=3が得られます.
このようなx, yが一つに定まるような連立一次方程式は, numpyのsloveモジュールを用いることで解を得られます.
また、逆行列を用いて

Ax=b ⇔ A-1Ax=A-1b ⇔ x=A-1b

と求めることも可能です.

いずれにしても, 係数拡大行列が一次独立で逆行列が存在していてるもの(または, パラメータ数が0)に限られています.

【行列の連立一次方程式の実装~解が一つの値に定まらない~】
 次に, 解が一つに定まらない場合(一次従属, 逆行列が存在しない, パラメータ数>0)を考えます.
 手計算ですとパラメータ(tなど)を用いて以下のように示します.

f:id:YoJl:20201221211531p:plain:w300

実は, このような場合の便利なPythonモジュールは存在しません.
なぜならば, パラメータに置き換える文字によって答えが変わるためです.
ですので, 自分で関数を作って実装する必要があります.
しかし, 計算手段やその順番が関わってくるため, 機械にやらせるとなるととても長いコードを書く必要があります.
よって, 今回は全自動にせず, 手助け的な立ち位置で, 実装していきたと思います.

import numpy as np
# 一次従属の係数拡大行列を用意
A = np.array([[1, 2, 3], [2, 5, 10], [5, 12, 23]])
b = np.array([[4], [9], [22]])
A_b = np.hstack([A, b])
print(A_b)

出力
[[ 1 2 3 4]
 [ 2 5 10 9]
 [ 5 12 23 22]]

では, 基本変形を行うための関数を宣言します.

# 行の定数倍
def kakeru(row,k):
  return row*k

# ある行を他の行の定数倍加える
def tasu_row(row1, row2, k):
  return row1 + k*row2

以下, 係数拡大行列(Ab)の行ベクトルを順に, ①, ②, ③とします.

# ②-2×①
A_b[1,:] = tasu_row(A_b[1,:],A_b[0,:],-2)
print(A_b)

出力 [[ 1 2 3 4]
 [ 0 1 4 1]
 [ 5 12 23 22]]

# ③-5×①
A_b[2,:] = tasu_row(A_b[2,:],A_b[0,:],-5)
print(A_b)

出力
[[ 1 2 3 4]
 [ 0 1 4 1]
 [0 2 8 2]]

# ①-2×②と③×(1/2)
A_b[0,:] = tasu_row(A_b[0,:],A_b[1,:],-2)
A_b[2,:] = kakeru(A_b[2,:],(1/2))
print(A_b)

出力
[[ 1 0 -5 2]
 [ 0 1 4 1]
 [0 0 0 0]]

単位行列で, 零行列の形になりましたので, 基本変形は以上で終了です.
あとは, z = tとして, x =の形にすると,

f:id:YoJl:20201221211531p:plain:w300

となります.

以上, 実装を用いた行列の演算と基本変形(階数・逆行列・連立一次方程式)でした!

p.s. いつか、パラメータのある連立一次方程式を求められるようなスクリプトを書きたいとは思いますが...うーむ、手計算だと簡単な割に、スクリプトにするとなると、難しいような問題なので、そこまでやりたい!と思えないのが本音なのですよねぇ…うーむ。"(-""-)"

【参考文献】

目次の作り方
Google Colabの使い方
NumPyで階数(ランク)を求めるlinalg.matrix_rank関数の使い方
Python NumPy SciPy サンプルコード: 線形連立方程式, LU 分解
NumPyで逆行列を求めるlinalg.invの使い方

分散仮説について

分散仮説について

自然言語処理を行っていく上で重要な概念があります。
それが、分散仮説というものです。
分散仮説とは、意味が似ている単語は類似した文脈で出現するという仮説のことです。

分散仮説に関連して開発された手法

①Count-basedな手法
様々な文脈の中で登場する単語の頻度を算出し、共起行列を作成する手法のことです。
スパース(疎なデータ)のため、扱いづらいものが多く、何らかの手法で情報集約して次元を減らすのが一般的です。
例:LSI(潜在意味インデックス)

②Predictiveな手法
分散仮説に基づくタスクを通して、単語(もしくは文)のベクトルを学習して取得する手法のことです。
次元数は予測アルゴリズム内で自由に決められます。
例:Word2Vec

①と②の共通した特徴
次元圧縮された潜在変数の空間に単語(もしくは文)がマッピングされているので、One-hot表現のように一つの要素(≒単語)にしているような表現ではなく、複数の要素が一つの概念を構成し、一つの要素が複数の概念を構成しているmany-to-manyな表現です。

p.s. 最近、HIIT(High-Intensity Interval Training)という、短時間で心拍数を「上げる下げる」を繰り返すことで大きなエネルギーを消費してくれるトレーニングをしているのですが、痩せたい方や運動する時間があまりとれない方にすごくオススメです。15分程度で汗が滴りまくります。

意味解析 (意味理解) について

意味解析 (意味理解) について

自然言語処理は大まかに以下のプロセスで行われます。

f:id:YoJl:20201209221133p:plain:w400
自然言語処理の流れ

今回はこの中の意味解析を行いたいと思います。

単語分解については前回の記事を参照してください。

1. 意味解析・意味理解とは?

文字の通り、文章の意味を理解する処理です。
以下で、意味解析に関わる周辺語について書いていきます。

2. 語義曖昧性解消(WSD:Word Sense Disambijunation)

自然言語処理においては、文中にある単語に対して、その単語がどの語義を表現しているのかを判断する過程のことです。
例としては、
「その服良いですね。」→評価の良い
「その服着て良いよ。」→許可の良い

3. 述語項構造解析

文書内の述語と述語以外の項との関係を表現する構造のことです。

例えば、
[太郎]は[手紙]を書く。
上の例では、「書く」が述語であり、「太郎」「手紙」が述語の項になります。
また、上の例では、主語を表すガ格や目的語を表すヲ格が採用されています。

また、これは構文解析の技術と類似しています。

違いとしては、
構文解析単語同士の文法上の主従関係を解析するのに対して、
述語項構造解析では、述語を中心として各単語の文章中での意味的な役割を表します。

したがって、
構文解析では、文章の中で省略されていく主語や目的語を見失ってしまう傾向があるのに対して、
述語項構造解析では、複雑な文や文章の構造を持っていたとしても、主語や目的語を見失わずに済みます。

代表的な解析方法は、PDFダウンロードになりますが、述語項構造解析というものがあります。

また、述語項構造解析ツールは、
SynCha:日本語の述語項構造解析器
ChaPAS:Javaベースの日本語述語項構造解析器
YuCha:日本語述語項構造解析器「夕茶」
というものがあります。

4. テキスト含意認識

ある単語が特定の意味を含むかどうかを表現の違いに左右されずに判定する技術です。
テキスト含意認識器としては、NECのテキスト含意認識システムというものがあります。

5. 格文法

動詞とその深層格(動作主・場所・道具などの意味役割)との組み合わせからなるものとして文を分析する理論です。

6. 意味解析ツール

意味解析ツールとは、シソーラスを用いて、文章中に出現する述語とその格要素を分類するツールです。
シソーラスとは、言葉を意味上の関係に基づき整理した辞書・辞典・語彙集のことです。

以下は、具体的なツールです。
①意味解析システムSAGE
日本語文の語の意味と、語と語の深層関係を、正確に計算する意味解析システムです。

②日本語 意味解析ツール AYA
文章を入力すると形態素解析(JUMAN)、係り受け解析(KNP)、意味解析を高速かつ高精度で行います。

以上、意味解析でした。

p.s. 本日、データサイエンティストのオンラインセミナーに参加しました。
講談者が数名いたのですが、一人だけ経験と知識がずば抜けていて開いた口が塞がりませんでした。( ゚д゚)ポカーン
自分の知識量はまだまだのレベルなんだなと改めて気づかされました! 個人的に、「データサイエンス」とか「AI」とかの具体的な定義が不明なバズワードは苦手です。


【参考文献】
自然言語処理(NLP)ってなんだろう?

単語分解について

単語分解について

自然言語処理は大まかに以下のプロセスで行われます。

f:id:YoJl:20201209221133p:plain:w400
自然言語処理の流れ

今回はこの中の"単語分解"を行いたいと思います。

1. 日本語と英語の違い

言語は一般的に、膠着語(こうちゃくご)屈折語(くっせつご)に分別されます。
膠着語とは、形態素(いわゆる単語)ごとに分割されずにくっついている(膠着)している言語です。
例として、日本語やフィンランド語が挙げられます。
一方、屈折語とは、形態素(いわゆる単語)ごとに分割されている言語です。
例としては、英語やドイツ語が挙げられます。

一般的に、膠着状態のままだとコンピュータがうまく処理できないため、 膠着語から、屈折語のような形に変える処理を行います。

2. MeCab

MeCabとは、文章を形態素ごとに分解(単語分解)してくれます。 どのように分割するかは、日本語形態素解析の裏側を覗く!MeCab はどのように形態素解析しているかをご覧ください。
簡単に言うと、MeCabは、 辞書を用いて考えられるすべての方法で文章を分割します。
そして、コーパスを用いて、どの分割の方法が最も妥当なのかを計算し、解析結果を出力する、というものです。
また、未知語に対しては、カタカナかアルファベットかなどで区切っているそうです。

3. MeCabの実装

開発には、Google Colaboratoryを使用しています。
まず、MeCabを使うために必要なパッケージをインストールします。

!apt install aptitude swig
!aptitude install mecab libmecab-dev mecab-ipadic-utf8 git make curl xz-utils file -y
!pip install mecab-python3

Out [1]Reading package lists... Done Building dependency tree
Reading state information... Done The following additional packages will be installed: aptitude-common libcgi-fast-perl libcgi-pm-perl libclass-accessor-perl libcwidget3v5 libencode-locale-perl libfcgi-perl libhtml-parser-perl libhtml-tagset-perl libhttp-date-perl libhttp-message-perl libio-html-perl libio-string-perl liblwp-mediatypes-perl libparse-debianchangelog-perl libsigc++-2.0-0v5 libsub-name-perl libtimedate-perl liburi-perl libxapian30 swig3.0 Suggested packages: aptitude-doc-en | aptitude-doc apt-xapian-index debtags tasksel libcwidget-dev libdata-dump-perl libhtml-template-perl libxml-simple-perl libwww-perl xapian-tools swig-doc swig-examples swig3.0-examples swig3.0-doc The following NEW packages will be installed: aptitude aptitude-common libcgi-fast-perl libcgi-pm-perl libclass-accessor-perl libcwidget3v5 libencode-locale-perl libfcgi-perl libhtml-parser-perl libhtml-tagset-perl libhttp-date-perl libhttp-message-perl libio-html-perl libio-string-perl liblwp-mediatypes-perl libparse-debianchangelog-perl libsigc++-2.0-0v5 libsub-name-perl libtimedate-perl liburi-perl libxapian30 swig swig3.0 0 upgraded, 23 newly installed, 0 to remove and 14 not upgraded. Need to get 4,978 kB of archives. After this operation, 21.4 MB of additional disk space will be used. Get:1 http://archive.ubuntu.com/ubuntu bionic/main amd64 aptitude-common all 0.8.10-6ubuntu1 [1,014 kB] Get:2 http://archive.ubuntu.com/ubuntu bionic/main amd64 libsigc++-2.0-0v5 amd64 2.10.0-2 [10.9 kB] Get:3 http://archive.ubuntu.com/ubuntu bionic/main amd64 libcwidget3v5 amd64 0.5.17-7 [286 kB] Get:4 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libxapian30 amd64 1.4.5-1ubuntu0.1 [631 kB] Get:5 http://archive.ubuntu.com/ubuntu bionic/main amd64 aptitude amd64 0.8.10-6ubuntu1 [1,269 kB] Get:6 http://archive.ubuntu.com/ubuntu bionic/main amd64 libhtml-tagset-perl all 3.20-3 [12.1 kB] Get:7 http://archive.ubuntu.com/ubuntu bionic/main amd64 liburi-perl all 1.73-1 [77.2 kB] Get:8 http://archive.ubuntu.com/ubuntu bionic/main amd64 libhtml-parser-perl amd64 3.72-3build1 [85.9 kB] Get:9 http://archive.ubuntu.com/ubuntu bionic/main amd64 libcgi-pm-perl all 4.38-1 [185 kB] Get:10 http://archive.ubuntu.com/ubuntu bionic/main amd64 libfcgi-perl amd64 0.78-2build1 [32.8 kB] Get:11 http://archive.ubuntu.com/ubuntu bionic/main amd64 libcgi-fast-perl all 1:2.13-1 [9,940 B] Get:12 http://archive.ubuntu.com/ubuntu bionic/main amd64 libsub-name-perl amd64 0.21-1build1 [11.6 kB] Get:13 http://archive.ubuntu.com/ubuntu bionic/main amd64 libclass-accessor-perl all 0.51-1 [21.2 kB] Get:14 http://archive.ubuntu.com/ubuntu bionic/main amd64 libencode-locale-perl all 1.05-1 [12.3 kB] Get:15 http://archive.ubuntu.com/ubuntu bionic/main amd64 libtimedate-perl all 2.3000-2 [37.5 kB] Get:16 http://archive.ubuntu.com/ubuntu bionic/main amd64 libhttp-date-perl all 6.02-1 [10.4 kB] Get:17 http://archive.ubuntu.com/ubuntu bionic/main amd64 libio-html-perl all 1.001-1 [14.9 kB] Get:18 http://archive.ubuntu.com/ubuntu bionic/main amd64 liblwp-mediatypes-perl all 6.02-1 [21.7 kB] Get:19 http://archive.ubuntu.com/ubuntu bionic/main amd64 libhttp-message-perl all 6.14-1 [72.1 kB] Get:20 http://archive.ubuntu.com/ubuntu bionic/main amd64 libio-string-perl all 1.08-3 [11.1 kB] Get:21 http://archive.ubuntu.com/ubuntu bionic/main amd64 libparse-debianchangelog-perl all 1.2.0-12 [49.5 kB] Get:22 http://archive.ubuntu.com/ubuntu bionic/universe amd64 swig3.0 amd64 3.0.12-1 [1,094 kB] Get:23 http://archive.ubuntu.com/ubuntu bionic/universe amd64 swig amd64 3.0.12-1 [6,460 B] Fetched 4,978 kB in 1s (4,159 kB/s) Selecting previously unselected package aptitude-common. (Reading database ... 144793 files and directories currently installed.) Preparing to unpack .../00-aptitude-common_0.8.10-6ubuntu1_all.deb ... Unpacking aptitude-common (0.8.10-6ubuntu1) ... Selecting previously unselected package libsigc++-2.0-0v5:amd64. Preparing to unpack .../01-libsigc++-2.0-0v5_2.10.0-2_amd64.deb ... Unpacking libsigc++-2.0-0v5:amd64 (2.10.0-2) ... Selecting previously unselected package libcwidget3v5:amd64. Preparing to unpack .../02-libcwidget3v5_0.5.17-7_amd64.deb ... Unpacking libcwidget3v5:amd64 (0.5.17-7) ... Selecting previously unselected package libxapian30:amd64. Preparing to unpack .../03-libxapian30_1.4.5-1ubuntu0.1_amd64.deb ... Unpacking libxapian30:amd64 (1.4.5-1ubuntu0.1) ... Selecting previously unselected package aptitude. Preparing to unpack .../04-aptitude_0.8.10-6ubuntu1_amd64.deb ... Unpacking aptitude (0.8.10-6ubuntu1) ... Selecting previously unselected package libhtml-tagset-perl. Preparing to unpack .../05-libhtml-tagset-perl_3.20-3_all.deb ... Unpacking libhtml-tagset-perl (3.20-3) ... Selecting previously unselected package liburi-perl. Preparing to unpack .../06-liburi-perl_1.73-1_all.deb ... Unpacking liburi-perl (1.73-1) ... Selecting previously unselected package libhtml-parser-perl. Preparing to unpack .../07-libhtml-parser-perl_3.72-3build1_amd64.deb ... Unpacking libhtml-parser-perl (3.72-3build1) ... Selecting previously unselected package libcgi-pm-perl. Preparing to unpack .../08-libcgi-pm-perl_4.38-1_all.deb ... Unpacking libcgi-pm-perl (4.38-1) ... Selecting previously unselected package libfcgi-perl. Preparing to unpack .../09-libfcgi-perl_0.78-2build1_amd64.deb ... Unpacking libfcgi-perl (0.78-2build1) ... Selecting previously unselected package libcgi-fast-perl. Preparing to unpack .../10-libcgi-fast-perl_1%3a2.13-1_all.deb ... Unpacking libcgi-fast-perl (1:2.13-1) ... Selecting previously unselected package libsub-name-perl. Preparing to unpack .../11-libsub-name-perl_0.21-1build1_amd64.deb ... Unpacking libsub-name-perl (0.21-1build1) ... Selecting previously unselected package libclass-accessor-perl. Preparing to unpack .../12-libclass-accessor-perl_0.51-1_all.deb ... Unpacking libclass-accessor-perl (0.51-1) ... Selecting previously unselected package libencode-locale-perl. Preparing to unpack .../13-libencode-locale-perl_1.05-1_all.deb ... Unpacking libencode-locale-perl (1.05-1) ... Selecting previously unselected package libtimedate-perl. Preparing to unpack .../14-libtimedate-perl_2.3000-2_all.deb ... Unpacking libtimedate-perl (2.3000-2) ... Selecting previously unselected package libhttp-date-perl. Preparing to unpack .../15-libhttp-date-perl_6.02-1_all.deb ... Unpacking libhttp-date-perl (6.02-1) ... Selecting previously unselected package libio-html-perl. Preparing to unpack .../16-libio-html-perl_1.001-1_all.deb ... Unpacking libio-html-perl (1.001-1) ... Selecting previously unselected package liblwp-mediatypes-perl. Preparing to unpack .../17-liblwp-mediatypes-perl_6.02-1_all.deb ... Unpacking liblwp-mediatypes-perl (6.02-1) ... Selecting previously unselected package libhttp-message-perl. Preparing to unpack .../18-libhttp-message-perl_6.14-1_all.deb ... Unpacking libhttp-message-perl (6.14-1) ... Selecting previously unselected package libio-string-perl. Preparing to unpack .../19-libio-string-perl_1.08-3_all.deb ... Unpacking libio-string-perl (1.08-3) ... Selecting previously unselected package libparse-debianchangelog-perl. Preparing to unpack .../20-libparse-debianchangelog-perl_1.2.0-12_all.deb ... Unpacking libparse-debianchangelog-perl (1.2.0-12) ... Selecting previously unselected package swig3.0. Preparing to unpack .../21-swig3.0_3.0.12-1_amd64.deb ... Unpacking swig3.0 (3.0.12-1) ... Selecting previously unselected package swig. Preparing to unpack .../22-swig_3.0.12-1_amd64.deb ... Unpacking swig (3.0.12-1) ... Setting up libhtml-tagset-perl (3.20-3) ... Setting up libxapian30:amd64 (1.4.5-1ubuntu0.1) ... Setting up swig3.0 (3.0.12-1) ... Setting up libencode-locale-perl (1.05-1) ... Setting up libtimedate-perl (2.3000-2) ... Setting up libio-html-perl (1.001-1) ... Setting up aptitude-common (0.8.10-6ubuntu1) ... Setting up liblwp-mediatypes-perl (6.02-1) ... Setting up liburi-perl (1.73-1) ... Setting up libhtml-parser-perl (3.72-3build1) ... Setting up libcgi-pm-perl (4.38-1) ... Setting up libio-string-perl (1.08-3) ... Setting up libsub-name-perl (0.21-1build1) ... Setting up libfcgi-perl (0.78-2build1) ... Setting up libsigc++-2.0-0v5:amd64 (2.10.0-2) ... Setting up libclass-accessor-perl (0.51-1) ... Setting up swig (3.0.12-1) ... Setting up libhttp-date-perl (6.02-1) ... Setting up libcgi-fast-perl (1:2.13-1) ... Setting up libparse-debianchangelog-perl (1.2.0-12) ... Setting up libhttp-message-perl (6.14-1) ... Setting up libcwidget3v5:amd64 (0.5.17-7) ... Setting up aptitude (0.8.10-6ubuntu1) ... update-alternatives: using /usr/bin/aptitude-curses to provide /usr/bin/aptitude (aptitude) in auto mode Processing triggers for man-db (2.8.3-2ubuntu0.1) ... Processing triggers for libc-bin (2.27-3ubuntu1.2) ... /sbin/ldconfig.real: /usr/local/lib/python3.6/dist-packages/ideep4py/lib/libmkldnn.so.0 is not a symbolic link

git is already installed at the requested version (1:2.17.1-1ubuntu0.7) make is already installed at the requested version (4.1-9.1ubuntu1) curl is already installed at the requested version (7.58.0-2ubuntu3.10) xz-utils is already installed at the requested version (5.2.2-1.3) git is already installed at the requested version (1:2.17.1-1ubuntu0.7) make is already installed at the requested version (4.1-9.1ubuntu1) curl is already installed at the requested version (7.58.0-2ubuntu3.10) xz-utils is already installed at the requested version (5.2.2-1.3) The following NEW packages will be installed: file libmagic-mgc{a} libmagic1{a} libmecab-dev libmecab2{a} mecab mecab-ipadic{a} mecab-ipadic-utf8 mecab-jumandic{a} mecab-jumandic-utf8{a} mecab-utils{a} 0 packages upgraded, 11 newly installed, 0 to remove and 14 not upgraded. Need to get 29.3 MB of archives. After unpacking 282 MB will be used. Get: 1 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libmagic-mgc amd64 1:5.32-2ubuntu0.4 [184 kB] Get: 2 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libmagic1 amd64 1:5.32-2ubuntu0.4 [68.6 kB] Get: 3 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 file amd64 1:5.32-2ubuntu0.4 [22.1 kB] Get: 4 http://archive.ubuntu.com/ubuntu bionic/universe amd64 libmecab2 amd64 0.996-5 [257 kB] Get: 5 http://archive.ubuntu.com/ubuntu bionic/universe amd64 libmecab-dev amd64 0.996-5 [308 kB] Get: 6 http://archive.ubuntu.com/ubuntu bionic/universe amd64 mecab-utils amd64 0.996-5 [4,856 B] Get: 7 http://archive.ubuntu.com/ubuntu bionic/universe amd64 mecab-jumandic-utf8 all 7.0-20130310-4 [16.2 MB] Get: 8 http://archive.ubuntu.com/ubuntu bionic/universe amd64 mecab-jumandic all 7.0-20130310-4 [2,212 B] Get: 9 http://archive.ubuntu.com/ubuntu bionic/universe amd64 mecab-ipadic all 2.7.0-20070801+main-1 [12.1 MB] Get: 10 http://archive.ubuntu.com/ubuntu bionic/universe amd64 mecab amd64 0.996-5 [132 kB] Get: 11 http://archive.ubuntu.com/ubuntu bionic/universe amd64 mecab-ipadic-utf8 all 2.7.0-20070801+main-1 [3,522 B] Fetched 29.3 MB in 2s (16.8 MB/s) Selecting previously unselected package libmagic-mgc. (Reading database ... 146043 files and directories currently installed.) Preparing to unpack .../00-libmagic-mgc_1%3a5.32-2ubuntu0.4_amd64.deb ... Unpacking libmagic-mgc (1:5.32-2ubuntu0.4) ... Selecting previously unselected package libmagic1:amd64. Preparing to unpack .../01-libmagic1_1%3a5.32-2ubuntu0.4_amd64.deb ... Unpacking libmagic1:amd64 (1:5.32-2ubuntu0.4) ... Selecting previously unselected package file. Preparing to unpack .../02-file_1%3a5.32-2ubuntu0.4_amd64.deb ... Unpacking file (1:5.32-2ubuntu0.4) ... Selecting previously unselected package libmecab2:amd64. Preparing to unpack .../03-libmecab2_0.996-5_amd64.deb ... Unpacking libmecab2:amd64 (0.996-5) ... Selecting previously unselected package libmecab-dev. Preparing to unpack .../04-libmecab-dev_0.996-5_amd64.deb ... Unpacking libmecab-dev (0.996-5) ... Selecting previously unselected package mecab-utils. Preparing to unpack .../05-mecab-utils_0.996-5_amd64.deb ... Unpacking mecab-utils (0.996-5) ... Selecting previously unselected package mecab-jumandic-utf8. Preparing to unpack .../06-mecab-jumandic-utf8_7.0-20130310-4_all.deb ... Unpacking mecab-jumandic-utf8 (7.0-20130310-4) ... Selecting previously unselected package mecab-jumandic. Preparing to unpack .../07-mecab-jumandic_7.0-20130310-4_all.deb ... Unpacking mecab-jumandic (7.0-20130310-4) ... Selecting previously unselected package mecab-ipadic. Preparing to unpack .../08-mecab-ipadic_2.7.0-20070801+main-1_all.deb ... Unpacking mecab-ipadic (2.7.0-20070801+main-1) ... Selecting previously unselected package mecab. Preparing to unpack .../09-mecab_0.996-5_amd64.deb ... Unpacking mecab (0.996-5) ... Selecting previously unselected package mecab-ipadic-utf8. Preparing to unpack .../10-mecab-ipadic-utf8_2.7.0-20070801+main-1_all.deb ... Unpacking mecab-ipadic-utf8 (2.7.0-20070801+main-1) ... Setting up libmecab2:amd64 (0.996-5) ... Setting up libmagic-mgc (1:5.32-2ubuntu0.4) ... Setting up libmagic1:amd64 (1:5.32-2ubuntu0.4) ... Setting up mecab-utils (0.996-5) ... Setting up mecab-ipadic (2.7.0-20070801+main-1) ... Compiling IPA dictionary for Mecab. This takes long time... reading /usr/share/mecab/dic/ipadic/unk.def ... 40 emitting double-array: 100% |###########################################| /usr/share/mecab/dic/ipadic/model.def is not found. skipped. reading /usr/share/mecab/dic/ipadic/Prefix.csv ... 221 reading /usr/share/mecab/dic/ipadic/Noun.adverbal.csv ... 795 reading /usr/share/mecab/dic/ipadic/Noun.number.csv ... 42 reading /usr/share/mecab/dic/ipadic/Noun.verbal.csv ... 12146 reading /usr/share/mecab/dic/ipadic/Noun.csv ... 60477 reading /usr/share/mecab/dic/ipadic/Postp-col.csv ... 91 reading /usr/share/mecab/dic/ipadic/Noun.nai.csv ... 42 reading /usr/share/mecab/dic/ipadic/Verb.csv ... 130750 reading /usr/share/mecab/dic/ipadic/Postp.csv ... 146 reading /usr/share/mecab/dic/ipadic/Suffix.csv ... 1393 reading /usr/share/mecab/dic/ipadic/Adverb.csv ... 3032 reading /usr/share/mecab/dic/ipadic/Noun.org.csv ... 16668 reading /usr/share/mecab/dic/ipadic/Others.csv ... 2 reading /usr/share/mecab/dic/ipadic/Noun.adjv.csv ... 3328 reading /usr/share/mecab/dic/ipadic/Noun.others.csv ... 151 reading /usr/share/mecab/dic/ipadic/Auxil.csv ... 199 reading /usr/share/mecab/dic/ipadic/Noun.proper.csv ... 27327 reading /usr/share/mecab/dic/ipadic/Conjunction.csv ... 171 reading /usr/share/mecab/dic/ipadic/Adj.csv ... 27210 reading /usr/share/mecab/dic/ipadic/Noun.demonst.csv ... 120 reading /usr/share/mecab/dic/ipadic/Adnominal.csv ... 135 reading /usr/share/mecab/dic/ipadic/Noun.name.csv ... 34202 reading /usr/share/mecab/dic/ipadic/Interjection.csv ... 252 reading /usr/share/mecab/dic/ipadic/Filler.csv ... 19 reading /usr/share/mecab/dic/ipadic/Noun.place.csv ... 72999 reading /usr/share/mecab/dic/ipadic/Symbol.csv ... 208 emitting double-array: 100% |###########################################| reading /usr/share/mecab/dic/ipadic/matrix.def ... 1316x1316 emitting matrix : 100% |###########################################|

done! update-alternatives: using /var/lib/mecab/dic/ipadic to provide /var/lib/mecab/dic/debian (mecab-dictionary) in auto mode Setting up libmecab-dev (0.996-5) ... Setting up file (1:5.32-2ubuntu0.4) ... Setting up mecab-jumandic-utf8 (7.0-20130310-4) ... Compiling Juman dictionary for Mecab. reading /usr/share/mecab/dic/juman/unk.def ... 37 emitting double-array: 100% |###########################################| reading /usr/share/mecab/dic/juman/Noun.keishiki.csv ... 8 reading /usr/share/mecab/dic/juman/Prefix.csv ... 90 reading /usr/share/mecab/dic/juman/Special.csv ... 158 reading /usr/share/mecab/dic/juman/Wikipedia.csv ... 167709 reading /usr/share/mecab/dic/juman/Assert.csv ... 34 reading /usr/share/mecab/dic/juman/Noun.hukusi.csv ... 81 reading /usr/share/mecab/dic/juman/Postp.csv ... 108 reading /usr/share/mecab/dic/juman/Suffix.csv ... 2128 reading /usr/share/mecab/dic/juman/Noun.suusi.csv ... 49 reading /usr/share/mecab/dic/juman/Noun.koyuu.csv ... 7964 reading /usr/share/mecab/dic/juman/AuxV.csv ... 593 reading /usr/share/mecab/dic/juman/Rengo.csv ... 1118 reading /usr/share/mecab/dic/juman/Demonstrative.csv ... 97 reading /usr/share/mecab/dic/juman/ContentW.csv ... 551145 reading /usr/share/mecab/dic/juman/Auto.csv ... 18931 reading /usr/share/mecab/dic/juman/Emoticon.csv ... 972 emitting double-array: 100% |###########################################| reading /usr/share/mecab/dic/juman/matrix.def ... 1876x1876 emitting matrix : 100% |###########################################|

done! Setting up mecab-ipadic-utf8 (2.7.0-20070801+main-1) ... Compiling IPA dictionary for Mecab. This takes long time... reading /usr/share/mecab/dic/ipadic/unk.def ... 40 emitting double-array: 100% |###########################################| /usr/share/mecab/dic/ipadic/model.def is not found. skipped. reading /usr/share/mecab/dic/ipadic/Prefix.csv ... 221 reading /usr/share/mecab/dic/ipadic/Noun.adverbal.csv ... 795 reading /usr/share/mecab/dic/ipadic/Noun.number.csv ... 42 reading /usr/share/mecab/dic/ipadic/Noun.verbal.csv ... 12146 reading /usr/share/mecab/dic/ipadic/Noun.csv ... 60477 reading /usr/share/mecab/dic/ipadic/Postp-col.csv ... 91 reading /usr/share/mecab/dic/ipadic/Noun.nai.csv ... 42 reading /usr/share/mecab/dic/ipadic/Verb.csv ... 130750 reading /usr/share/mecab/dic/ipadic/Postp.csv ... 146 reading /usr/share/mecab/dic/ipadic/Suffix.csv ... 1393 reading /usr/share/mecab/dic/ipadic/Adverb.csv ... 3032 reading /usr/share/mecab/dic/ipadic/Noun.org.csv ... 16668 reading /usr/share/mecab/dic/ipadic/Others.csv ... 2 reading /usr/share/mecab/dic/ipadic/Noun.adjv.csv ... 3328 reading /usr/share/mecab/dic/ipadic/Noun.others.csv ... 151 reading /usr/share/mecab/dic/ipadic/Auxil.csv ... 199 reading /usr/share/mecab/dic/ipadic/Noun.proper.csv ... 27327 reading /usr/share/mecab/dic/ipadic/Conjunction.csv ... 171 reading /usr/share/mecab/dic/ipadic/Adj.csv ... 27210 reading /usr/share/mecab/dic/ipadic/Noun.demonst.csv ... 120 reading /usr/share/mecab/dic/ipadic/Adnominal.csv ... 135 reading /usr/share/mecab/dic/ipadic/Noun.name.csv ... 34202 reading /usr/share/mecab/dic/ipadic/Interjection.csv ... 252 reading /usr/share/mecab/dic/ipadic/Filler.csv ... 19 reading /usr/share/mecab/dic/ipadic/Noun.place.csv ... 72999 reading /usr/share/mecab/dic/ipadic/Symbol.csv ... 208 emitting double-array: 100% |###########################################| reading /usr/share/mecab/dic/ipadic/matrix.def ... 1316x1316 emitting matrix : 100% |###########################################|

done! update-alternatives: using /var/lib/mecab/dic/ipadic-utf8 to provide /var/lib/mecab/dic/debian (mecab-dictionary) in auto mode Setting up mecab (0.996-5) ... Compiling IPA dictionary for Mecab. This takes long time... reading /usr/share/mecab/dic/ipadic/unk.def ... 40 emitting double-array: 100% |###########################################| /usr/share/mecab/dic/ipadic/model.def is not found. skipped. reading /usr/share/mecab/dic/ipadic/Prefix.csv ... 221 reading /usr/share/mecab/dic/ipadic/Noun.adverbal.csv ... 795 reading /usr/share/mecab/dic/ipadic/Noun.number.csv ... 42 reading /usr/share/mecab/dic/ipadic/Noun.verbal.csv ... 12146 reading /usr/share/mecab/dic/ipadic/Noun.csv ... 60477 reading /usr/share/mecab/dic/ipadic/Postp-col.csv ... 91 reading /usr/share/mecab/dic/ipadic/Noun.nai.csv ... 42 reading /usr/share/mecab/dic/ipadic/Verb.csv ... 130750 reading /usr/share/mecab/dic/ipadic/Postp.csv ... 146 reading /usr/share/mecab/dic/ipadic/Suffix.csv ... 1393 reading /usr/share/mecab/dic/ipadic/Adverb.csv ... 3032 reading /usr/share/mecab/dic/ipadic/Noun.org.csv ... 16668 reading /usr/share/mecab/dic/ipadic/Others.csv ... 2 reading /usr/share/mecab/dic/ipadic/Noun.adjv.csv ... 3328 reading /usr/share/mecab/dic/ipadic/Noun.others.csv ... 151 reading /usr/share/mecab/dic/ipadic/Auxil.csv ... 199 reading /usr/share/mecab/dic/ipadic/Noun.proper.csv ... 27327 reading /usr/share/mecab/dic/ipadic/Conjunction.csv ... 171 reading /usr/share/mecab/dic/ipadic/Adj.csv ... 27210 reading /usr/share/mecab/dic/ipadic/Noun.demonst.csv ... 120 reading /usr/share/mecab/dic/ipadic/Adnominal.csv ... 135 reading /usr/share/mecab/dic/ipadic/Noun.name.csv ... 34202 reading /usr/share/mecab/dic/ipadic/Interjection.csv ... 252 reading /usr/share/mecab/dic/ipadic/Filler.csv ... 19 reading /usr/share/mecab/dic/ipadic/Noun.place.csv ... 72999 reading /usr/share/mecab/dic/ipadic/Symbol.csv ... 208 emitting double-array: 100% |###########################################| reading /usr/share/mecab/dic/ipadic/matrix.def ... 1316x1316 emitting matrix : 100% |###########################################|

done! Setting up mecab-jumandic (7.0-20130310-4) ... Processing triggers for man-db (2.8.3-2ubuntu0.1) ... Processing triggers for libc-bin (2.27-3ubuntu1.2) ... /sbin/ldconfig.real: /usr/local/lib/python3.6/dist-packages/ideep4py/lib/libmkldnn.so.0 is not a symbolic link

Collecting mecab-python3 Downloading https://files.pythonhosted.org/packages/b4/f0/b57bfb29abd6b898d7137f4a276a338d2565f28a2098d60714388d119f3e/mecab_python3-1.0.3-cp36-cp36m-manylinux1_x86_64.whl (487kB) |████████████████████████████████| 491kB 4.2MB/s Installing collected packages: mecab-python3 Successfully installed mecab-python3-1.0.3

※見なくて良いと思います。

ダウンロードが完了したら、以下を実行します。

import MeCab
sample_txt = "新型コロナウイルスの感染拡大によって、リモートワークが推奨されている。"
m = MeCab.Tagger()
print("Mecab:\n", m.parse(sample_txt))

Out [2]

Mecab:
新型 名詞,一般,*,*,*,*,新型,シンガタ,シンガタ
コロナ 名詞,一般,*,*,*,*,コロナ,コロナ,コロナ
ウイルス 名詞,一般,*,*,*,*,ウイルス,ウイルス,ウイルス
の 助詞,連体化,*,*,*,*,の,ノ,ノ
感染 名詞,サ変接続,*,*,*,*,感染,カンセン,カンセン
拡大 名詞,サ変接続,*,*,*,*,拡大,カクダイ,カクダイ
によって 助詞,格助詞,連語,*,*,*,によって,ニヨッテ,ニヨッテ
、 記号,読点,*,*,*,*,、,、,、
リモート 名詞,一般,*,*,*,*,リモート,リモート,リモート
ワーク 名詞,一般,*,*,*,*,ワーク,ワーク,ワーク
が 助詞,格助詞,一般,*,*,*,が,ガ,ガ
推奨 名詞,サ変接続,*,*,*,*,推奨,スイショウ,スイショー
さ 動詞,自立,*,*,サ変・スル,未然レル接続,する,サ,サ
れ 動詞,接尾,*,*,一段,連用形,れる,レ,レ
て 助詞,接続助詞,*,*,*,*,て,テ,テ
いる 動詞,非自立,*,*,一段,基本形,いる,イル,イル
。 記号,句点,*,*,*,*,。,。,。
EOS

4. NEologdの導入

上の結果から、
新型コロナウイルス」や「リモートワーク」などの新語には対応していないことが分かります。
そこで、新語にも対応させるために、「NEologd」というシステム辞書を導入します。
詳細は、githubに掲載されています。

まず、NEologdのパッケージをインストールします。

!git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
!echo yes | mecab-ipadic-neologd/bin/install-mecab-ipadic-neologd -n -a
!ln -s /etc/mecabrc /usr/local/etc/mecabrc

Out [3]Cloning into 'mecab-ipadic-neologd'... remote: Enumerating objects: 75, done. remote: Counting objects: 100% (75/75), done. remote: Compressing objects: 100% (74/74), done. remote: Total 75 (delta 5), reused 54 (delta 0), pack-reused 0 Unpacking objects: 100% (75/75), done. [install-mecab-ipadic-NEologd] : Start.. [install-mecab-ipadic-NEologd] : Check the existance of libraries [install-mecab-ipadic-NEologd] : find => ok [install-mecab-ipadic-NEologd] : sort => ok [install-mecab-ipadic-NEologd] : head => ok [install-mecab-ipadic-NEologd] : cut => ok [install-mecab-ipadic-NEologd] : egrep => ok [install-mecab-ipadic-NEologd] : mecab => ok [install-mecab-ipadic-NEologd] : mecab-config => ok [install-mecab-ipadic-NEologd] : make => ok [install-mecab-ipadic-NEologd] : curl => ok [install-mecab-ipadic-NEologd] : sed => ok [install-mecab-ipadic-NEologd] : cat => ok [install-mecab-ipadic-NEologd] : diff => ok [install-mecab-ipadic-NEologd] : tar => ok [install-mecab-ipadic-NEologd] : unxz => ok [install-mecab-ipadic-NEologd] : xargs => ok [install-mecab-ipadic-NEologd] : grep => ok [install-mecab-ipadic-NEologd] : iconv => ok [install-mecab-ipadic-NEologd] : patch => ok [install-mecab-ipadic-NEologd] : which => ok [install-mecab-ipadic-NEologd] : file => ok [install-mecab-ipadic-NEologd] : openssl => ok [install-mecab-ipadic-NEologd] : awk => ok

[install-mecab-ipadic-NEologd] : mecab-ipadic-NEologd is already up-to-date

[install-mecab-ipadic-NEologd] : mecab-ipadic-NEologd will be install to /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd

[install-mecab-ipadic-NEologd] : Make mecab-ipadic-NEologd [make-mecab-ipadic-NEologd] : Start.. [make-mecab-ipadic-NEologd] : Check local seed directory [make-mecab-ipadic-NEologd] : Check local seed file [make-mecab-ipadic-NEologd] : Check local build directory [make-mecab-ipadic-NEologd] : create /content/mecab-ipadic-neologd/libexec/../build [make-mecab-ipadic-NEologd] : Download original mecab-ipadic file [make-mecab-ipadic-NEologd] : Try to access to https://ja.osdn.net [make-mecab-ipadic-NEologd] : Try to download from https://ja.osdn.net/frs/g_redir.php?m=kent&f=mecab%2Fmecab-ipadic%2F2.7.0-20070801%2Fmecab-ipadic-2.7.0-20070801.tar.gz % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 388 100 388 0 0 245 0 0:00:01 0:00:01 --:--:-- 1013 100 11.6M 100 11.6M 0 0 3490k 0 0:00:03 0:00:03 --:--:-- 8990k Hash value of /content/mecab-ipadic-neologd/libexec/../build/mecab-ipadic-2.7.0-20070801.tar.gz matched [make-mecab-ipadic-NEologd] : Decompress original mecab-ipadic file mecab-ipadic-2.7.0-20070801/ mecab-ipadic-2.7.0-20070801/README mecab-ipadic-2.7.0-20070801/AUTHORS mecab-ipadic-2.7.0-20070801/COPYING mecab-ipadic-2.7.0-20070801/ChangeLog mecab-ipadic-2.7.0-20070801/INSTALL mecab-ipadic-2.7.0-20070801/Makefile.am mecab-ipadic-2.7.0-20070801/Makefile.in mecab-ipadic-2.7.0-20070801/NEWS mecab-ipadic-2.7.0-20070801/aclocal.m4 mecab-ipadic-2.7.0-20070801/config.guess mecab-ipadic-2.7.0-20070801/config.sub mecab-ipadic-2.7.0-20070801/configure mecab-ipadic-2.7.0-20070801/configure.in mecab-ipadic-2.7.0-20070801/install-sh mecab-ipadic-2.7.0-20070801/missing mecab-ipadic-2.7.0-20070801/mkinstalldirs mecab-ipadic-2.7.0-20070801/Adj.csv mecab-ipadic-2.7.0-20070801/Adnominal.csv mecab-ipadic-2.7.0-20070801/Adverb.csv mecab-ipadic-2.7.0-20070801/Auxil.csv mecab-ipadic-2.7.0-20070801/Conjunction.csv mecab-ipadic-2.7.0-20070801/Filler.csv mecab-ipadic-2.7.0-20070801/Interjection.csv mecab-ipadic-2.7.0-20070801/Noun.adjv.csv mecab-ipadic-2.7.0-20070801/Noun.adverbal.csv mecab-ipadic-2.7.0-20070801/Noun.csv mecab-ipadic-2.7.0-20070801/Noun.demonst.csv mecab-ipadic-2.7.0-20070801/Noun.nai.csv mecab-ipadic-2.7.0-20070801/Noun.name.csv mecab-ipadic-2.7.0-20070801/Noun.number.csv mecab-ipadic-2.7.0-20070801/Noun.org.csv mecab-ipadic-2.7.0-20070801/Noun.others.csv mecab-ipadic-2.7.0-20070801/Noun.place.csv mecab-ipadic-2.7.0-20070801/Noun.proper.csv mecab-ipadic-2.7.0-20070801/Noun.verbal.csv mecab-ipadic-2.7.0-20070801/Others.csv mecab-ipadic-2.7.0-20070801/Postp-col.csv mecab-ipadic-2.7.0-20070801/Postp.csv mecab-ipadic-2.7.0-20070801/Prefix.csv mecab-ipadic-2.7.0-20070801/Suffix.csv mecab-ipadic-2.7.0-20070801/Symbol.csv mecab-ipadic-2.7.0-20070801/Verb.csv mecab-ipadic-2.7.0-20070801/char.def mecab-ipadic-2.7.0-20070801/feature.def mecab-ipadic-2.7.0-20070801/left-id.def mecab-ipadic-2.7.0-20070801/matrix.def mecab-ipadic-2.7.0-20070801/pos-id.def mecab-ipadic-2.7.0-20070801/rewrite.def mecab-ipadic-2.7.0-20070801/right-id.def mecab-ipadic-2.7.0-20070801/unk.def mecab-ipadic-2.7.0-20070801/dicrc mecab-ipadic-2.7.0-20070801/RESULT [make-mecab-ipadic-NEologd] : Configure custom system dictionary on /content/mecab-ipadic-neologd/libexec/../build/mecab-ipadic-2.7.0-20070801-neologd-20200910 checking for a BSD-compatible install... /usr/bin/install -c checking whether build environment is sane... yes checking whether make sets $(MAKE)... yes checking for working aclocal-1.4... missing checking for working autoconf... missing checking for working automake-1.4... missing checking for working autoheader... missing checking for working makeinfo... missing checking for a BSD-compatible install... /usr/bin/install -c checking for mecab-config... /usr/bin/mecab-config configure: creating ./config.status config.status: creating Makefile [make-mecab-ipadic-NEologd] : Encode the character encoding of system dictionary resources from EUC_JP to UTF-8 ./../../libexec/iconv_euc_to_utf8.sh ./Noun.adverbal.csv ./../../libexec/iconv_euc_to_utf8.sh ./Noun.proper.csv ./../../libexec/iconv_euc_to_utf8.sh ./Others.csv ./../../libexec/iconv_euc_to_utf8.sh ./Noun.verbal.csv ./../../libexec/iconv_euc_to_utf8.sh ./Noun.org.csv ./../../libexec/iconv_euc_to_utf8.sh ./Noun.nai.csv ./../../libexec/iconv_euc_to_utf8.sh ./Interjection.csv ./../../libexec/iconv_euc_to_utf8.sh ./Noun.place.csv ./../../libexec/iconv_euc_to_utf8.sh ./Verb.csv ./../../libexec/iconv_euc_to_utf8.sh ./Filler.csv ./../../libexec/iconv_euc_to_utf8.sh ./Adverb.csv ./../../libexec/iconv_euc_to_utf8.sh ./Noun.number.csv ./../../libexec/iconv_euc_to_utf8.sh ./Postp.csv ./../../libexec/iconv_euc_to_utf8.sh ./Postp-col.csv ./../../libexec/iconv_euc_to_utf8.sh ./Noun.adjv.csv ./../../libexec/iconv_euc_to_utf8.sh ./Noun.others.csv ./../../libexec/iconv_euc_to_utf8.sh ./Noun.demonst.csv ./../../libexec/iconv_euc_to_utf8.sh ./Adj.csv ./../../libexec/iconv_euc_to_utf8.sh ./Prefix.csv ./../../libexec/iconv_euc_to_utf8.sh ./Adnominal.csv ./../../libexec/iconv_euc_to_utf8.sh ./Noun.csv ./../../libexec/iconv_euc_to_utf8.sh ./Auxil.csv ./../../libexec/iconv_euc_to_utf8.sh ./Suffix.csv ./../../libexec/iconv_euc_to_utf8.sh ./Symbol.csv ./../../libexec/iconv_euc_to_utf8.sh ./Noun.name.csv ./../../libexec/iconv_euc_to_utf8.sh ./Conjunction.csv rm ./Noun.adverbal.csv rm ./Noun.proper.csv rm ./Others.csv rm ./Noun.verbal.csv rm ./Noun.org.csv rm ./Noun.nai.csv rm ./Interjection.csv rm ./Noun.place.csv rm ./Verb.csv rm ./Filler.csv rm ./Adverb.csv rm ./Noun.number.csv rm ./Postp.csv rm ./Postp-col.csv rm ./Noun.adjv.csv rm ./Noun.others.csv rm ./Noun.demonst.csv rm ./Adj.csv rm ./Prefix.csv rm ./Adnominal.csv rm ./Noun.csv rm ./Auxil.csv rm ./Suffix.csv rm ./Symbol.csv rm ./Noun.name.csv rm ./Conjunction.csv ./../../libexec/iconv_euc_to_utf8.sh ./right-id.def ./../../libexec/iconv_euc_to_utf8.sh ./feature.def ./../../libexec/iconv_euc_to_utf8.sh ./unk.def ./../../libexec/iconv_euc_to_utf8.sh ./pos-id.def ./../../libexec/iconv_euc_to_utf8.sh ./rewrite.def ./../../libexec/iconv_euc_to_utf8.sh ./char.def ./../../libexec/iconv_euc_to_utf8.sh ./matrix.def ./../../libexec/iconv_euc_to_utf8.sh ./left-id.def rm ./right-id.def rm ./feature.def rm ./unk.def rm ./pos-id.def rm ./rewrite.def rm ./char.def rm ./matrix.def rm ./left-id.def mv ./rewrite.def.utf8 ./rewrite.def mv ./right-id.def.utf8 ./right-id.def mv ./Noun.verbal.csv.utf8 ./Noun.verbal.csv mv ./Noun.adjv.csv.utf8 ./Noun.adjv.csv mv ./Noun.others.csv.utf8 ./Noun.others.csv mv ./Noun.place.csv.utf8 ./Noun.place.csv mv ./matrix.def.utf8 ./matrix.def mv ./Postp-col.csv.utf8 ./Postp-col.csv mv ./Noun.demonst.csv.utf8 ./Noun.demonst.csv mv ./Noun.name.csv.utf8 ./Noun.name.csv mv ./Interjection.csv.utf8 ./Interjection.csv mv ./left-id.def.utf8 ./left-id.def mv ./char.def.utf8 ./char.def mv ./Others.csv.utf8 ./Others.csv mv ./Adverb.csv.utf8 ./Adverb.csv mv ./Noun.org.csv.utf8 ./Noun.org.csv mv ./Adj.csv.utf8 ./Adj.csv mv ./Postp.csv.utf8 ./Postp.csv mv ./Verb.csv.utf8 ./Verb.csv mv ./Noun.proper.csv.utf8 ./Noun.proper.csv mv ./Suffix.csv.utf8 ./Suffix.csv mv ./Noun.number.csv.utf8 ./Noun.number.csv mv ./Auxil.csv.utf8 ./Auxil.csv mv ./Filler.csv.utf8 ./Filler.csv mv ./Noun.nai.csv.utf8 ./Noun.nai.csv mv ./Adnominal.csv.utf8 ./Adnominal.csv mv ./pos-id.def.utf8 ./pos-id.def mv ./feature.def.utf8 ./feature.def mv ./Prefix.csv.utf8 ./Prefix.csv mv ./Symbol.csv.utf8 ./Symbol.csv mv ./Noun.csv.utf8 ./Noun.csv mv ./unk.def.utf8 ./unk.def mv ./Conjunction.csv.utf8 ./Conjunction.csv mv ./Noun.adverbal.csv.utf8 ./Noun.adverbal.csv [make-mecab-ipadic-NEologd] : Fix yomigana field of IPA dictionary patching file Noun.csv patching file Noun.place.csv patching file Verb.csv patching file Noun.verbal.csv patching file Noun.name.csv patching file Noun.adverbal.csv patching file Noun.csv patching file Noun.name.csv patching file Noun.org.csv patching file Noun.others.csv patching file Noun.place.csv patching file Noun.proper.csv patching file Noun.verbal.csv patching file Prefix.csv patching file Suffix.csv patching file Noun.proper.csv patching file Noun.csv patching file Noun.name.csv patching file Noun.org.csv patching file Noun.place.csv patching file Noun.proper.csv patching file Noun.verbal.csv patching file Noun.name.csv patching file Noun.org.csv patching file Noun.place.csv patching file Noun.proper.csv patching file Suffix.csv patching file Noun.demonst.csv patching file Noun.csv patching file Noun.name.csv [make-mecab-ipadic-NEologd] : Copy user dictionary resource [make-mecab-ipadic-NEologd] : Install adverb entries using /content/mecab-ipadic-neologd/libexec/../seed/neologd-adverb-dict-seed.20150623.csv.xz [make-mecab-ipadic-NEologd] : Install interjection entries using /content/mecab-ipadic-neologd/libexec/../seed/neologd-interjection-dict-seed.20170216.csv.xz [make-mecab-ipadic-NEologd] : Install noun orthographic variant entries using /content/mecab-ipadic-neologd/libexec/../seed/neologd-common-noun-ortho-variant-dict-seed.20170228.csv.xz [make-mecab-ipadic-NEologd] : Install noun orthographic variant entries using /content/mecab-ipadic-neologd/libexec/../seed/neologd-proper-noun-ortho-variant-dict-seed.20161110.csv.xz [make-mecab-ipadic-NEologd] : Install entries of orthographic variant of a noun used as verb form using /content/mecab-ipadic-neologd/libexec/../seed/neologd-noun-sahen-conn-ortho-variant-dict-seed.20160323.csv.xz [make-mecab-ipadic-NEologd] : Install frequent adjective orthographic variant entries using /content/mecab-ipadic-neologd/libexec/../seed/neologd-adjective-std-dict-seed.20151126.csv.xz [make-mecab-ipadic-NEologd] : Install infrequent adjective orthographic variant entries using /content/mecab-ipadic-neologd/libexec/../seed/neologd-adjective-exp-dict-seed.20151126.csv.xz [make-mecab-ipadic-NEologd] : Install adjective verb orthographic variant entries using /content/mecab-ipadic-neologd/libexec/../seed/neologd-adjective-verb-dict-seed.20160324.csv.xz [make-mecab-ipadic-NEologd] : Install infrequent datetime representation entries using /content/mecab-ipadic-neologd/libexec/../seed/neologd-date-time-infreq-dict-seed.20190415.csv.xz [make-mecab-ipadic-NEologd] : Install infrequent quantity representation entries using /content/mecab-ipadic-neologd/libexec/../seed/neologd-quantity-infreq-dict-seed.20190415.csv.xz [make-mecab-ipadic-NEologd] : Install entries of ill formed words using /content/mecab-ipadic-neologd/libexec/../seed/neologd-ill-formed-words-dict-seed.20170127.csv.xz [make-mecab-ipadic-NEologd] : Re-Index system dictionary reading ./unk.def ... 40 emitting double-array: 100% |###########################################| ./model.def is not found. skipped. reading ./neologd-adjective-exp-dict-seed.20151126.csv ... 1051146 reading ./neologd-common-noun-ortho-variant-dict-seed.20170228.csv ... 152869 reading ./Noun.adverbal.csv ... 808 reading ./Noun.proper.csv ... 27493 reading ./Others.csv ... 2 reading ./Noun.verbal.csv ... 12150 reading ./neologd-proper-noun-ortho-variant-dict-seed.20161110.csv ... 138379 reading ./neologd-ill-formed-words-dict-seed.20170127.csv ... 60616 reading ./Noun.org.csv ... 17149 reading ./Noun.nai.csv ... 42 reading ./Interjection.csv ... 252 reading ./Noun.place.csv ... 73194 reading ./Verb.csv ... 130750 reading ./neologd-quantity-infreq-dict-seed.20190415.csv ... 229216 reading ./Filler.csv ... 19 reading ./Adverb.csv ... 3032 reading ./Noun.number.csv ... 42 reading ./Postp.csv ... 146 reading ./Postp-col.csv ... 91 reading ./neologd-adverb-dict-seed.20150623.csv ... 139792 reading ./Noun.adjv.csv ... 3328 reading ./neologd-date-time-infreq-dict-seed.20190415.csv ... 16866 reading ./Noun.others.csv ... 153 reading ./Noun.demonst.csv ... 120 reading ./neologd-adjective-std-dict-seed.20151126.csv ... 507812 reading ./Adj.csv ... 27210 reading ./Prefix.csv ... 224 reading ./Adnominal.csv ... 135 reading ./Noun.csv ... 60734 reading ./Auxil.csv ... 199 reading ./neologd-adjective-verb-dict-seed.20160324.csv ... 20268 reading ./Suffix.csv ... 1448 reading ./Symbol.csv ... 208 reading ./mecab-user-dict-seed.20200910.csv ... 3224584 reading ./Noun.name.csv ... 34215 reading ./neologd-interjection-dict-seed.20170216.csv ... 4701 reading ./neologd-noun-sahen-conn-ortho-variant-dict-seed.20160323.csv ... 26058 reading ./Conjunction.csv ... 171 emitting double-array: 100% |###########################################| reading ./matrix.def ... 1316x1316 emitting matrix : 100% |###########################################|

done! [make-mecab-ipadic-NEologd] : Make custom system dictionary on /content/mecab-ipadic-neologd/libexec/../build/mecab-ipadic-2.7.0-20070801-neologd-20200910 make: Nothing to be done for 'all'. [make-mecab-ipadic-NEologd] : Finish.. [install-mecab-ipadic-NEologd] : Get results of tokenize test [test-mecab-ipadic-NEologd] : Start.. [test-mecab-ipadic-NEologd] : Replace timestamp from 'git clone' date to 'git commit' date [test-mecab-ipadic-NEologd] : Get buzz phrases % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 31914 0 31914 0 0 24473 0 --:--:-- 0:00:01 --:--:-- 24473 [test-mecab-ipadic-NEologd] : Get difference between default system dictionary and mecab-ipadic-NEologd [test-mecab-ipadic-NEologd] : Something wrong. You shouldn't install mecab-ipadic-NEologd yet. [test-mecab-ipadic-NEologd] : Finish..

[install-mecab-ipadic-NEologd] : Please check the list of differences in the upper part.

[install-mecab-ipadic-NEologd] : Do you want to install mecab-ipadic-NEologd? Type yes or no. [install-mecab-ipadic-NEologd] : OK. Let's install mecab-ipadic-NEologd. [install-mecab-ipadic-NEologd] : Start.. [install-mecab-ipadic-NEologd] : /usr/lib/x86_64-linux-gnu/mecab/dic isn't current user's directory [install-mecab-ipadic-NEologd] : Sudo make install to /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd make[1]: Entering directory '/content/mecab-ipadic-neologd/build/mecab-ipadic-2.7.0-20070801-neologd-20200910' make[1]: Nothing to be done for 'install-exec-am'. /bin/bash ./mkinstalldirs /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd mkdir /usr/lib/x86_64-linux-gnu/mecab mkdir /usr/lib/x86_64-linux-gnu/mecab/dic mkdir /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd /usr/bin/install -c -m 644 ./matrix.bin /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd/matrix.bin /usr/bin/install -c -m 644 ./char.bin /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd/char.bin /usr/bin/install -c -m 644 ./sys.dic /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd/sys.dic /usr/bin/install -c -m 644 ./unk.dic /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd/unk.dic /usr/bin/install -c -m 644 ./left-id.def /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd/left-id.def /usr/bin/install -c -m 644 ./right-id.def /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd/right-id.def /usr/bin/install -c -m 644 ./rewrite.def /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd/rewrite.def /usr/bin/install -c -m 644 ./pos-id.def /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd/pos-id.def /usr/bin/install -c -m 644 ./dicrc /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd/dicrc make[1]: Leaving directory '/content/mecab-ipadic-neologd/build/mecab-ipadic-2.7.0-20070801-neologd-20200910'

[install-mecab-ipadic-NEologd] : Install completed. [install-mecab-ipadic-NEologd] : When you use MeCab, you can set '/usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd' as a value of '-d' option of MeCab. [install-mecab-ipadic-NEologd] : Usage of mecab-ipadic-NEologd is here. Usage: $ mecab -d /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd ...

[install-mecab-ipadic-NEologd] : Finish.. [install-mecab-ipadic-NEologd] : Finish..

※見なくて良いと思います。

import MeCab
import subprocess

cmd='echo `mecab-config --dicdir`"/mecab-ipadic-neologd"'
path = (subprocess.Popen(cmd, stdout=subprocess.PIPE,
                           shell=True).communicate()[0]).decode('utf-8')
                          
sample_txt = "新型コロナウイルスの感染拡大によって、リモートワークが推奨されている。"
m = MeCab.Tagger()
print("Mecab:\n", m.parse(sample_txt))

m = MeCab.Tagger("-d {0}".format(path))
print("Mecab ipadic NEologd:\n",m.parse(sample_txt))

Out[4]

Mecab ipadic NEologd:
新型コロナウイルス 名詞,固有名詞,一般,*,*,*,新型コロナウイルス,シンガタコロナウイルス,シンガタコロナウイルス
の 助詞,連体化,*,*,*,*,の,ノ,ノ
感染拡大 名詞,固有名詞,一般,*,*,*,感染拡大,カンセンカクダイ,カンセンカクダイ
によって 助詞,格助詞,連語,*,*,*,によって,ニヨッテ,ニヨッテ
、 記号,読点,*,*,*,*,、,、,、
リモートワーク 名詞,固有名詞,一般,*,*,*,リモートワーク,リモートワーク,リモートワーク
が 助詞,格助詞,一般,*,*,*,が,ガ,ガ
推奨 名詞,サ変接続,*,*,*,*,推奨,スイショウ,スイショー
さ 動詞,自立,*,*,サ変・スル,未然レル接続,する,サ,サ
れ 動詞,接尾,*,*,一段,連用形,れる,レ,レ
て 助詞,接続助詞,*,*,*,*,て,テ,テ
いる 動詞,非自立,*,*,一段,基本形,いる,イル,イル
。 記号,句点,*,*,*,*,。,。,。
EOS

新型コロナウイルス」と「リモートワーク」が分割されずに、一つの単語として認識されました。

5. Sentencepiece

形態素解析器には、Sentencepieceというものがあります。
Sentencepieceの詳細は、SentencePieceについて書いてみる。をご覧ください。
簡単に言うと、単語の辞書を基に、コーパスを単語に分割し、各単語の頻度を求めます。
次に、高頻度で出現する単語は1語として扱い、低頻度で出現する単語は、より短い単語に分割します。
そして、語の数が事前に指定した数になるまで分割します。 これにより、未知語をなくすことを可能にしています。

Sentencepieceの実装については、多くのコーパスが必要なので、また、いつか行います、、、
今すぐ実装したい方は、上述のSentencePieceについて書いてみる。の著者と同じ方が実行したSentencePieceを使ってみた。というのがおすすめです。

6. JUMAN++

形態素解析器には、JUMAN++というものがあります。
JUMAN++の詳細は、日本語形態素解析システム JUMAN++に掲載されています。
MeCabより高性能だそうです。 実装方法はColabでJUMAN++を使うを参考にしています。

7. Juman++の実装

まず、必要なパッケージをインストールします。

!wget https://github.com/ku-nlp/jumanpp/releases/download/v2.0.0-rc2/jumanpp-2.0.0-rc2.tar.xz
!tar xfv jumanpp-2.0.0-rc2.tar.xz  
%cd jumanpp-2.0.0-rc2
!mkdir bld
%cd bld
!cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local
!make install -j2

Out[1] さすがに長いので省略します。

MeCabと比較すると、インストールが終わるまで随分と長いです。

# 動作確認(コマンド)
!echo "新型コロナウイルスの感染拡大によって、リモートワークが推奨されている。" | jumanpp

Out[2]

新型 しんがた 新型 名詞 6 普通名詞 1 * 0 * 0 "代表表記:新型/しんがた カテゴリ:抽象物"
コロナ ころな コロナ 名詞 6 普通名詞 1 * 0 * 0 "代表表記:コロナ/ころな ドメイン:科学・技術 カテゴリ:自然物"
ウイルス ういるす ウイルス 名詞 6 普通名詞 1 * 0 * 0 "代表表記:ウイルス/ういるす ドメイン:健康・医学 カテゴリ:動物"
の の の 助詞 9 接続助詞 3 * 0 * 0 NIL
感染 かんせん 感染 名詞 6 サ変名詞 2 * 0 * 0 "代表表記:感染/かんせん ドメイン:健康・医学 カテゴリ:抽象物"
拡大 かくだい 拡大 名詞 6 サ変名詞 2 * 0 * 0 "代表表記:拡大/かくだい カテゴリ:抽象物 反義:名詞-サ変名詞:縮小/しゅくしょう"
に に に 助詞 9 格助詞 1 * 0 * 0 NIL
よって よって よる 動詞 2 * 0 子音動詞ラ行 10 タ系連用テ形 14 "代表表記:因る/よる"
@ よって よって よる 動詞 2 * 0 子音動詞ラ行 10 タ系連用テ形 14 "代表表記:寄る/よる 自他動詞:他:寄せる/よせる"
@ よって よって よる 動詞 2 * 0 子音動詞ラ行 10 タ系連用テ形 14 "代表表記:縒る/よる 自他動詞:自:縒れる/よれる"
@ よって よって よる 動詞 2 * 0 子音動詞ラ行 10 タ系連用テ形 14 "代表表記:選る/よる"
、 、 、 特殊 1 読点 2 * 0 * 0 NIL
リモート リモート リモート 名詞 6 普通名詞 1 * 0 * 0 "自動獲得:Wikipedia Wikipedia多義"
ワーク ワーク ワーク 名詞 6 普通名詞 1 * 0 * 0 "自動獲得:Wikipedia Wikipedia多義"
が が が 助詞 9 格助詞 1 * 0 * 0 NIL
推奨 すいしょう 推奨 名詞 6 サ変名詞 2 * 0 * 0 "代表表記:推奨/すいしょう カテゴリ:抽象物"
さ さ する 動詞 2 * 0 サ変動詞 16 未然形 3 "代表表記:する/する 自他動詞:自:成る/なる 付属動詞候補(基本)"
れて れて れる 接尾辞 14 動詞性接尾辞 7 母音動詞 1 タ系連用テ形 14 "代表表記:れる/れる" いる いる いる 接尾辞 14 動詞性接尾辞 7 母音動詞 1 基本形 2 "代表表記:いる/いる" 。 。 。 特殊 1 句点 1 * 0 * 0 NIL EOS

8.Juman++とpyknp

JUMANとKNPが対応付けされているパッケージです。
詳細は、pyknpを参照してください。
簡単に説明すると、形態素ごとに分割するのがJUMAN++で、文節および基本句間の係り受け関係・格関係・照応関係を出力するのがpyknpです。

pipでインストール可能です。

!pip install pyknp

Out [3]Collecting pyknp Downloading https://files.pythonhosted.org/packages/1d/0e/93221dc85bd214b87b37bdd56af384b252e882fdb91e39c842a2614a8822/pyknp-0.4.5.zip (43kB) |████████████████████████████████| 51kB 4.4MB/s Requirement already satisfied: six in /usr/local/lib/python3.6/dist-packages (from pyknp) (1.15.0) Building wheels for collected packages: pyknp Building wheel for pyknp (setup.py) ... done Created wheel for pyknp: filename=pyknp-0.4.5-cp36-none-any.whl size=40420 sha256=0f8ecd7e9bb598257f7a1c30cd379ec9642df746cf8fc5e31cf9116457658edb Stored in directory: /root/.cache/pip/wheels/7d/0c/46/495789d5ca85293c2478f5bd81e1204f77f949645cb35bf382 Successfully built pyknp Installing collected packages: pyknp Successfully installed pyknp-0.4.5

実行します。

from pyknp import Juman
jumanpp = Juman()
result = jumanpp.analysis("新型コロナウイルスの感染拡大によって、リモートワークが推奨されている。")
for mrph in result.mrph_list():
    print(mrph.midasi, mrph.yomi, mrph.genkei, mrph.hinsi)

Out[4]

新型 しんがた 新型 名詞
コロナ ころな コロナ 名詞
ウイルス ういるす ウイルス 名詞
の の の 助詞
感染 かんせん 感染 名詞
拡大 かくだい 拡大 名詞
に に に 助詞
よって よって よる 動詞
、 、 、 特殊
リモート リモート リモート 名詞
ワーク ワーク ワーク 名詞
が が が 助詞
推奨 すいしょう 推奨 名詞
さ さ する 動詞
れて れて れる 接尾辞
いる いる いる 接尾辞
。 。 。 特殊

個人的には、*などなく簡潔なため、実装にやりやすそうだなという印象です。
ただ、NEologdなどの適応はできそうですが、参考文献がないのでやりづらそうです。
個人的にはここまでやってみたいところ、、、

以上、単語分解についてでした!
p.s. 最近、乾燥で肘が象さんのかかとかな?って言うくらいかさかさしてて黒ずんでいます。
象さんのかかと見たことありませんが、、、


【参考文献】
膠着語 (wiki)
屈折語 (wiki)
日本語形態素解析の裏側を覗く!MeCab はどのように形態素解析しているか
github
SentencePieceについて書いてみる。
SentencePieceを使ってみた。
日本語形態素解析システム JUMAN++
ColabでJUMAN++を使う

構文解析とは?

構文解析とは?

自然言語処理の根っことなる技術として構文解析というものがあります。

1. 構文解析の定義

文章を自然言語であれば、形態素(意味を持つ最小単位、平たく言うと「単語」)ごとに切り分け、
さらに、形態素の間の関連(修飾-被修飾など)を図式化などすることによって、
文章を明確にする(解析する)手続きのことです。

2. 形態素解析と字句解析(Tokenize)

構文解析を細かく分けると、形態素解析字句解析(Tokenize)に分けられます。
ちなみに、字句解析は一般的にTokenize(トークン化)と呼ばれています。
形態素解析字句解析(Tokenize)の違いは、簡単に言うと、対象言語解析方法です。
以下で、理論的な違いと代表的な手法を挙げて説明します。
一方で、実際では、形態素解析と字句解析は同じように扱われている傾向も見られます。

3. 形態素解析

形態素解析とは、自然言語を、辞書やコーパス(corpus)などを用いて、形態素の間の関係や活用などを学習して、文章を解析します。

また、形態素解析をしてくれる代表的なものとして、 MeCabChasen、JUMAN、KAKASHIがあります。
ちなみに、最も高速で精度が良いのは「MeCab」なので、
インターネット上には「MeCab」の実装方法がたくさんあります。

MeCab形態素解析の方法については、
日本語形態素解析の裏側を覗く!MeCabはどのように形態素解析しているのか
というものがとても分かりやすいです。
簡単に言うと、MeCabは、 辞書を用いて考えられるすべての方法で文章を分割します。
そして、コーパスを用いて、どの分割の方法が最も妥当なのかを計算し、解析結果を出力する、というものです。
また、未知語に対しては、カタカナかアルファベットかなどで区切っているそうです。

4. 字句解析(Tokenizer)

字句解析(Tokenize)とは、厳密にはプログラミング言語などの形式言語を、形態素解析よりも機械的に解析します。
「厳密には」と言った理由は、自然言語処理でもTokenizeという言葉が用いられているためです。
日本語の字句解析と英語のTokenizeの意味の差なのでしょうか、、、
無理に定義するとするなら以下のようになります。
字句解析(Tokenize)とは、形態素解析のような複雑なことはせず機械的に解析する手法のこと。ただし、文脈によって対象言語は異なる。

また、代表的な手法にSentencepieceというものがあります。 Sentencepieceとは、 単語の辞書を基に、コーパスを単語に分割し、各単語の頻度を求めます。
次に、高頻度で出現する単語は1語として扱い、低頻度で出現する単語は、より短い単語に分割します。
そして、語の数が事前に指定した数になるまで分割します。 これにより、未知語をなくすことを可能にしています。
しかし、品詞等は無視しているため、 「足利義満」が「足利義 満」となってしまうこともあります。

実はこの未知語自然言語処理では厄介だったりします、、、なので、それを補ったSentencepieceは素晴らしいと言えば、素晴らしい、、、

以上が構文解析(形態素解析と字句解析)とMeCabとSentencepieceでした!

p.s. デュラム小麦で作ったチャバタという未知語が2つもある謎のパンを食べました。 香ばしくて永遠に食べていられる...


参考文献
構文解析 (wiki)
日本語形態素解析の裏側を覗く!MeCab はどのように形態素解析しているか
SentencePieceについて書いてみる。

自然言語処理(NLP)とは?

自然言語処理(Natural Language Processing)とは?

1. 自然言語とは

私たちが普段話している言葉のことです。
なぜ、わざわざ「自然」を付けるかというと、
ただ単純に、プログラミング言語などの形式言語と区別するためです。

2. 自然言語処理とは

私たちが普段話している言葉をコンピュータに処理させることです。

3. 自然言語処理の技術について

理論的には、言葉があるところには必ず自然言語処理を活用することができます。
なぜ、「理論的には」と言うというと、
機械に言語を理解させるにはデータが必要なためです。
要するに、データ化されていない言葉は自然言語処理できません。
当然と言えば、当然ですが...

また、これだけPCのスペックが向上したとはいえ、
何億のデータを処理させ、様々なタスクに適用させるには、
相当な学習時間(1ヵ月以上)がかかります。
それを当たり前のようにやっている人間の脳みそって...

要するに、
人間は、経験的に自然言語を理解できます。
しかし、コンピュータにはそれができません。
そのため、自然言語をコンピュータに処理させるための様々な技術が必要です。
以下でその技術概要を見ていきましょう。

4. 主な自然言語処理の流れ

文書分類にしろ、文書要約にしろ、機械翻訳にしろ、質問応答にしろ、以下のプロセスを踏みます。

f:id:YoJl:20201209221133p:plain:w400
自然言語処理の流れ

  • 文書入力
    まず、文書入力を行います。

    ここで入力される文書を、一般的にはcorpus(コーパス)と呼びますが、
    そのままsentenceやtextなどと呼ぶこともあります。

  • 単語分解
    その次に、文書を単語分解(もしくは、n-gram分解)を行い、分かち書きにします。

    分かち書きとは、文を単語ごと(もしくは、n個ずつ)スペースを空けて表示することです。

    例えば、
    corpus:「私は犬が好きです。」→ 「私 は 犬 が 好き です。」
    となります。

  • 意味解析
    このように分かち書きされた文書を意味解析していきます。

    代表的な手法はベクトル空間を用いた意味解析です。単語(文書)をベクトル空間(n次元)に持っていき、
    単語(文書)間の距離で単語(文書)の意味をコンピュータに理解させます。

余談ですが、、、 ここの意味解析のアルゴリズムは、その後の応用技術(文書分類・文書要約・機械翻訳・質問応答)の精度に大きく関わっていきます。

そのため、もし、あなたが意味解析のアルゴリズムを開発し、しかも精度向上に繋がるとなったら、 自然言語処理会であなたの名前を知らない人はいなくなる、と言っても過言ではないでしょう。

  • 応用技術 (文書分類・文書要約・機械翻訳・質問応答)
    意味解析されたものを機械に入力し、
    世の中にある様々なタスクに落とし込んでいきます。

このように、様々な要素技術を用いて、自然言語処理は成り立っています。

また、今回は、概要のみなので、
実際は、単語分解一つ取ってもすごく深い世界が待っています。
例えば、
「ツイートする」というワードがあったとして、
「ツイート する」と「ツイートする」のどちらだと思いますか?
もしくは、
「巣立つ」というワードは、
「巣 立つ」、「巣立つ」のどちらだと思いますか?

このように、
自然言語処理はあやふやなところが多い分、
画像処理や音声認識とは異なり、課題や限界がある分野です。

だからこそ面白いのですが、、、

以上で、自然言語処理の概要は終わりです。

もし、これから自然言語処理を行う方がいらしたら、
今後、BERT-Finetuningぐらいまで記録に残していく予定ですのでよろしくお願いします。

p.s. 一昨日、論文を無事書き終えました。
約一年間よく自分頑張った...!!これで卒業できるぞ!!
ちなみに、研究内容はBERT-Finetuningによるツイート分類です。
SCDVもやったよ!


参考文献

自然言語処理(wiki)