マルコフ連鎖ライブラリ作ってみた

## はじめに
**"NeXov Enables eXtensible Observation of Vertices"**
「NeXov」という汎用マルコフ連鎖ライブラリを開発してみました。ぜひこの記事を読んで使ってみてください！

https://github.com/kurimochi/NeXov/

https://pypi.org/project/NeXov/

## NeXovの特徴
- **有向グラフを用いて実装、モデルのインポートエクスポートも容易**  (NetworkX)
- **NLPを用いた高精度なトークン化機能**  (MeCab)
- **自動整形された可視化グラフ**  (Graphviz)

NeXovは、これらを **「オールインワンで」** 提供するライブラリとなっています。

## インストール
いくつか前提ソフトがあるので先にインストールします。
### MeCab
形態素解析を行う`MeCab`はNeXovのデータ前処理に使われています。`MeCab`をインストールするには、以下のサイトからインストーラーをダウンロードし、インストーラーの指示に従います。

https://github.com/ikegami-yukino/mecab/releases

Debian系ディストリは以下のコマンドを実行します。
```shell
$ sudo apt install mecab libmecab-dev mecab-ipadic-utf8
```
### NEologd
`NEologd`は、`MeCab`を固有名詞に強くするためのシステム辞書です。  
Windowsであれば、以下のサイトを参考にインストールしてください。

https://qiita.com/xi_guisheng/items/40ee7da516de05e5894f

また、Debian系ディストリであれば以下のサイトが参考になります。

https://blog.forestberrypi.com/tools-services/linux/mecab-in-ubuntu/#toc7

### Graphviz
`Graphviz`は、グラフの可視化を行うライブラリです。以下のサイトを参考にインストールしてください。

https://graphviz.org/download/

### Install
NeXovをインストールするには、以下のコマンドを実行します。
```shell
$ pip install nexov
```

## 使い方
NeXovには以下のような機能があり、それぞれ対応するコマンドがあります。

| Command | Feature |
|---------|---------|
| `tokenize` | テキストのトークン化 |
| `generate` | モデルの構築・生成...etc |
| `visualize` | モデルの可視化 |

```
usage: nexov [-h] {tokenize,generate,visualize} ...

NeXov Enables eXtensible Observation of Vertices

positional arguments:
  {tokenize,generate,visualize}
    tokenize            テキストをトークンに分割
    generate            モデルまたはテキストを生成
    visualize           モデルを画像として可視化

options:
  -h, --help            show this help message and exit
```

### tokenize
`tokenize`は、自動でテキストをトークン化するコマンドです。
#### オプション
```
usage: nexov tokenize [-h] -i INPUT [-o OUTPUT] [--method {mecab,char}]

options:
  -h, --help            show this help message and exit
  -i INPUT, --input INPUT
                        入力ファイル
  -o OUTPUT, --output OUTPUT
                        出力ファイル
  --method {mecab,char}
                        分割方法
```
#### 例
```shell
$ cat input.txt
ぐっもーにん！
もにもに！
もーにん！！
もにもに！！！！
おはですー！！
おはですー！
おはようです！！！！！！
$ nexov tokenize -i input.txt -o tokens.txt
[+] Wrote tokenized data to tokens.txt
$ cat tokens.txt
ぐっも ー に ん ！
も に も に ！
も ー に ん ！ ！
も に も に ！ ！ ！ ！
お は です ー ！ ！
お は です ー ！
おはよう です ！ ！ ！ ！ ！ ！
```
### generate
`generate`は、モデルの構築と生成、またインポート・エクスポートも行うコマンドです。
#### オプション
```
usage: nexov generate [-h] -i INPUT [-s START] [-l LENGTH] [-e EXPORT] [-v VISUALIZE]

options:
  -h, --help            show this help message and exit
  -i INPUT, --input INPUT
                        モデルまたはトークン済みデータファイル
  -s START, --start START
                        開始トークン
  -l LENGTH, --length LENGTH
                        生成するトークン数
  -e EXPORT, --export EXPORT
                        生成後のモデルをファイルにエクスポート
  -v VISUALIZE, --visualize VISUALIZE
                        生成と同時に可視化を実行(拡張子を除く出力ファイル名を指定)
```
#### 例
```shell
$ cat tokens.txt
ぐっも ー に ん ！
も に も に ！
も ー に ん ！ ！
も に も に ！ ！ ！ ！
お は です ー ！ ！
お は です ー ！
おはよう です ！ ！ ！ ！ ！ ！
$ nexov generate -i tokens.txt -s も -l 100
もにもにもにもーにもにん！おはです！おはですー！！！！もに！もにん！！もにん！おはですー！！！おはですー！！もー！おはようです！！！おはようです！！おはですーにもにもー！もに！！！！もにもーにん！！！おは です！！おはようですー！もにん！！

$ nexov generate -i tokens.txt -e model.json
[+] The model was exported to model.json
$ nexov generate -i model.json -s も -l 100
もーにん！おはですーにもにん！！！！おはですー！！！もにん！もにもにもー！もにん！！！！！もにもにん！！もーにもにん！！！！おはようですー！おはです！！！！！！おはようですーに！おはですーに！！！！おはよ うですー！もにもにもにん！おは
```

### visualize
`visualize`は、モデルを画像で可視化するコマンドです。
#### オプション
```
usage: nexov visualize [-h] -i INPUT -o OUTPUT [--font FONT]

options:
  -h, --help            show this help message and exit
  -i INPUT, --input INPUT
                        モデルファイル
  -o OUTPUT, --output OUTPUT
                        出力ファイル(拡張子を除くファイル名を指定)
  --font FONT           使用するフォント
```
#### 例
```shell
$ nexov visualize -i model.json -o output
[+] The model visualization was saved to output.png
```
![output.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583252/631b2002-58e6-4d96-8b3d-b957d6436620.png)

## 生成例
- **猫語生成器**(データ: [ゆ～さんのポスト](https://x.com/yuusaan0926/status/1909500432290095400))
![result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583252/0e26353f-c45d-4758-840e-4109cf58e816.png)
- **しかのこのこのここしたんたん**
![result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583252/64552b22-90ae-47bf-b842-68190299b048.png)