Pythonでつくる対話システム(その先)

# 類義語フリーの辞書

http://compling.hss.ntu.edu.sg/wnja/

## 参考ページ
https://qiita.com/pocket_kyoto/items/1e5d464b693a8b44eda5

https://qiita.com/asakbiz/items/f82e95c13e5e9599306c

## pysqlite3 インストール
```
pip install pysqlite3 
```

## どんなテーブルがあるか
```py
import sqlite3
conn = sqlite3.connect("wnjpn.db")

cur = conn.execute("select name from sqlite_master where type='table'")
for row in cur:
    print(row)
```

### 結果
```
('link_def',)
('synset_def',)
('synset_ex',)
('synset',)
('synlink',)
('ancestor',)
('sense',)
('word',)
('variant',)
('xlink',)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596059/6a8b53ec-4a75-d63e-39ef-7aa15dc360e2.png)

# 関連テーブルの構造調査
## 調査コード

```python
cur = conn.execute("select * from <table_name> limit 10")
for row in cur:
    print(row)

# Wordnetデータに含まれるカラムの確認
cur = conn.execute("PRAGMA TABLE_INFO(<table_name>)")
for row in cur:
    print(row)
```

## wordテーブルの構造
### 列名
```
(0, 'wordid', 'integer', 0, None, 1)
(1, 'lang', 'text', 0, None, 0)
(2, 'lemma', 'text', 0, None, 0)
(3, 'pron', 'text', 0, None, 0)
(4, 'pos', 'text', 0, None, 0)
```

### データ
```
(1, 'eng', 'expletive', None, 'n')
(2, 'eng', 'measles', None, 'n')
(3, 'eng', 'contras', None, 'n')
(4, 'eng', 'beef_man', None, 'n')
(5, 'eng', 'dwelling', None, 'n')
(6, 'eng', 'acetum', None, 'n')
(7, 'eng', 'mount_carmel', None, 'n')
(8, 'eng', 'class_taxopsida', None, 'n')
(9, 'eng', 'vascular_ray', None, 'n')
(10, 'eng', 'genus_salamandra', None, 'n')
```

## senseテーブルの構造
### 列名
```
(0, 'synset', 'text', 0, None, 0)
(1, 'wordid', 'integer', 0, None, 0)
(2, 'lang', 'text', 0, None, 0)
(3, 'rank', 'text', 0, None, 0)
(4, 'lexid', 'integer', 0, None, 0)
(5, 'freq', 'integer', 0, None, 0)
(6, 'src', 'text', 0, None, 0)
```
### データ
```
('07125096-n', 1, 'eng', '0', 1, 1, 'eng-30')
('07126228-n', 1, 'eng', '0', 2, 0, 'eng-30')
('14123044-n', 2, 'eng', '0', 1, 0, 'eng-30')
('08030185-n', 3, 'eng', '0', 1, 0, 'eng-30')
('09902017-n', 4, 'eng', '0', 1, 1, 'eng-30')
('03259505-n', 5, 'eng', '0', 1, 11, 'eng-30')
('14599641-n', 6, 'eng', '0', 1, 0, 'eng-30')
('07828987-n', 6, 'eng', '0', 2, 0, 'eng-30')
('09361816-n', 7, 'eng', '0', 1, 0, 'eng-30')
('11660537-n', 8, 'eng', '0', 1, 0, 'eng-30')
```

## synsetテーブルの構造
### 列名
```
(0, 'synset', 'text', 0, None, 0)
(1, 'pos', 'text', 0, None, 0)
(2, 'name', 'text', 0, None, 0)
(3, 'src', 'text', 0, None, 0)
```

### データ
```
('07125096-n', 'n', 'expletive', 'eng30')
('07126228-n', 'n', 'expletive', 'eng30')
('14123044-n', 'n', 'measles', 'eng30')
('08030185-n', 'n', 'contras', 'eng30')
('09902017-n', 'n', 'beef_man', 'eng30')
('03259505-n', 'n', 'dwelling', 'eng30')
('14599641-n', 'n', 'acetum', 'eng30')
('07828987-n', 'n', 'acetum', 'eng30')
('09361816-n', 'n', 'mount_carmel', 'eng30')
('11660537-n', 'n', 'class_taxopsida', 'eng30')
```

## 類義語取得手順
1. wordテーブルからword_id取得
ex)『パソコン』のword_id:190168
1. senseテーブルからword_idと一致するもsynsetを取得
ex)['03918480-n']
1. synsetテーブルから上記synsetと一致するをnameを取得
※複数なので配列に保存
ex)pc


## XML解析
- lemmaタグの writtenFormがワード
- LexicalEntryタグの id が word_id('w190168')
- sensetは同じタグ内にあり
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596059/1a8e48ad-eed6-739f-7c97-92b716fccf1c.png)

##ワードの数
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596059/6a0b18c8-a26b-b0c5-6f76-862cf292d8ea.png)