Skip to content

Commit

Permalink
Merge pull request #12 from Kensuke-Mitsuzawa/0.2
Browse files Browse the repository at this point in the history
0.2
  • Loading branch information
Kensuke-Mitsuzawa authored Jul 3, 2017
2 parents bbc65d1 + d0fc779 commit b232ccf
Show file tree
Hide file tree
Showing 15 changed files with 1,000 additions and 368 deletions.
48 changes: 48 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
language: python
python:
- 2.7
- 3.5
addons:
apt:
packages:
- git
- make
- curl
- xz-utils
- file
- pandoc
- libboost-all-dev
- language-pack-ja-base
- language-pack-ja
- ibus-mozc
- gcc-5
- g++-5
- build-essential
sources:
- ubuntu-toolchain-r-test
before_install:
- sudo apt-get update -qq
- sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 1
- sudo update-locale LANG=ja_JP.UTF-8 LANGUAGE="ja_JP:ja"
- mkdir ./target
- export CC="gcc-5"
- export CXX="g++-5"
- export CFLAGS=-std=c++11
- export CXXFLAGS=-std=c++11
- sudo make install
- sudo juman -S
install:
- python --version
- python setup.py install
- pip install coveralls coverage nose
script:
- coverage run --source=knp_utils setup.py test
- python example.py
after_success:
- coveralls
notifications:
email:
recipients:
- [email protected]
on_success: always
on_failure: always
7 changes: 7 additions & 0 deletions LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
Copyright 2017 Kensuke Mitsuzawa

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
8 changes: 8 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
install:
bash install_tools.sh

install_neologd:
## mecab-neologdのインストールを実行
wget --no-check-certificate https://github.com/neologd/mecab-ipadic-neologd/tarball/master -O mecab-ipadic-neologd.tar
tar -xvf mecab-ipadic-neologd.tar
mv neologd-mecab-ipadic-neologd-* neologd-mecab-ipadic-neologd && cd neologd-mecab-ipadic-neologd && ( echo yes | ./bin/install-mecab-ipadic-neologd )
66 changes: 54 additions & 12 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,29 +1,58 @@
# knp-utils-py


[![Build Status](https://travis-ci.org/Kensuke-Mitsuzawa/knp-utils-py.svg?branch=master)](https://travis-ci.org/Kensuke-Mitsuzawa/knp-utils-py)[![MIT License](http://img.shields.io/badge/license-MIT-blue.svg?style=flat)](LICENSE)

# What's this ?

- Wrapper functions for Japanese parser [KNP](http://nlp.ist.i.kyoto-u.ac.jp/?KNP)
- This package run KNP as multi-threading job using sqlite3 as backend DB
- Wrapper package for Japanese parser [KNP](http://nlp.ist.i.kyoto-u.ac.jp/?KNP)
- This package make KNP as multi-threading job using sqlite3 for backend DB.

Please visit [Github page](https://github.com/Kensuke-Mitsuzawa/knp-utils-py) also.

# Contribution

- Faster processing-time than other ways to call KNP
- Easy interface to call KNP
- Faster processing-time to call KNP
- Json style I/O, thus you can call it as API like
- Commandline interface
- Commandline interface / Flask-based Web application

## Comparison of processing speed

You have 2 processing-modes in this package.

At my environment(MacBook Pro Early2015)
Each way takes following time for processing 100 input-documents.
- `pexpect`: Faster. It keep processes running in each thread.
- `everytime`: Slower. It launches a process when one data comes.

NOTE: Time to process 40 documents at my environment(MacBook Pro Early2015)

### Juman & KNP

```
[knp-utils] elapsed_time:53.66389608383179 [Sec]
[Native KNP subprocess] elapsed_time:91.62633109092712 [Sec]
[Native KNP server] elapsed_time:88.35711193084717 [Sec]
[Pyknp] elapsed_time:150.08908200263977 [Sec]
pexpect mode, finished with :44.13979196548462[sec]
everytime mode, finished with :38.31942701339722[sec]
pyknp, finished with :64.74086809158325[sec]
```

### Juman++ & KNP

Juman++ is improved tokenizer after Juman.
It has neural-network-based(RNN) language model, thus they say it has good accuracy in tokenization task.

`pexpect` is much faster.
This is because `pexpect` mode keeps a process running in one thread. Juman++ takes long time to load data model.
Therefore, `everytime` or `pyknp` takes long time than `pexpect`.

```
pexpect mode, finished with :48.096940994262695[sec]
everytime mode, finished with :64.07872700691223[sec]
pyknp, finished with : 602.032340992232452[sec]
```


# Requirement

- Juman
- Juman (or Juman++)
- KNP
- Sqlite3
- Python
Expand All @@ -41,6 +70,19 @@ Each way takes following time for processing 100 input-documents.
% ./configure && make && make install
```

## Juman++

GCC version must be >= 5

```
wget http://nlp.ist.i.kyoto-u.ac.jp/DLcounter/lime.cgi?down=http://lotus.kuee.kyoto-u.ac.jp/nl-resource/jumanpp/jumanpp-1.02.tar.xz&name=jumanpp-1.02.tar.xz
tar xJvf jumanpp-1.02.tar.xz
cd jumanpp-1.02/
./configure
make
[sudo] make install
```

## KNP

```
Expand All @@ -50,7 +92,7 @@ Each way takes following time for processing 100 input-documents.
% ./configure && make && make install
```

## package
## Package install

```
python setup.py install
Expand Down
165 changes: 124 additions & 41 deletions example.py
Original file line number Diff line number Diff line change
@@ -1,44 +1,127 @@
#! -*- coding: utf-8 -*-
from knp_utils import knp_job, models
from knp_utils import knp_job, models, KnpSubProcess
import six
import logging
logger = logging.getLogger('command')

argument_param = models.Params(
n_jobs=1,
knp_command='/usr/local/bin/knp',
juman_command='/usr/local/bin/juman'
)

if six.PY2:
input_document = [
{u"text-id": u"input-1", u"text": u"東京 3日 ロイター] - 日銀は3日、急激な金利上昇を止めるため、特定の年限の国債買い入れを増やす「指値オペ」を実施した。トランプ米大統領による円安誘導批判を受け、日銀が長期金利を押し下げるようなオペは難しくなるとの思惑が浮上。長期金利は3日、一時、0.15%を超えて上昇した。日銀は、指し値オペの実行によってゼロ%に抑える政策に変化がないことを明確にし、圧力を意識した市場に「強い意思」を示した格好だ。"},
{u"text-id": u"input-2", u"text": u"指値オペの実施は現在の金融政策「長短金利操作(イールドカーブ・コントロール、YCC)」を開始した2016年9月以来、2度目となる。"},
{u"text-id": u"input-3", u"text": u"ドナルド・トランプ米大統領が有権者の心をつかんだ理由の一つは、その率直な物言いだ。ドルに関して言えば、米国の歴代財務長官が昔から繰り返してきた「強いドルは米国の国益にかなう」という妄言と決別するという新政権の意向は歓迎されよう。"},
]
else:
input_document = [
{"text-id": "input-1", "text": "東京 3日 ロイター] - 日銀は3日、急激な金利上昇を止めるため、特定の年限の国債買い入れを増やす「指値オペ」を実施した。トランプ米大統領による円安誘導批判を受け、日銀が長期金利を押し下げるようなオペは難しくなるとの思惑が浮上。長期金利は3日、一時、0.15%を超えて上昇した。日銀は、指し値オペの実行によってゼロ%に抑える政策に変化がないことを明確にし、圧力を意識した市場に「強い意思」を示した格好だ。"},
{"text-id": "input-2", "text": "指値オペの実施は現在の金融政策「長短金利操作(イールドカーブ・コントロール、YCC)」を開始した2016年9月以来、2度目となる。"},
{"text-id": "input-3", "text": "ドナルド・トランプ米大統領が有権者の心をつかんだ理由の一つは、その率直な物言いだ。ドルに関して言えば、米国の歴代財務長官が昔から繰り返してきた「強いドルは米国の国益にかなう」という妄言と決別するという新政権の意向は歓迎されよう。"},
]

result_obj = knp_job.main(seq_input_dict_document=input_document,
argument_params=argument_param,
is_normalize_text=True,
is_get_processed_doc=True)

import json
print(json.dumps(result_obj.to_dict(), ensure_ascii=False))

### With pyknp
try:
import pyknp
except:
import pip
pip.main(['install', 'http://nlp.ist.i.kyoto-u.ac.jp/DLcounter/lime.cgi?down=http://lotus.kuee.kyoto-u.ac.jp/nl-resource/pyknp/pyknp-0.3.tar.gz&name=pyknp-0.3.tar.gz'])
else:
from pyknp import KNP
knp_obj = KNP()
for knp_parsed_obj in result_obj.seq_document_obj:
pyknp_parsed_result = knp_obj.result(input_str=knp_parsed_obj.parsed_result)
bnst_surface = ["".join(mrph.midasi for mrph in bnst_obj.mrph_list()) for bnst_obj in pyknp_parsed_result.bnst_list()]
print(bnst_surface)

#PATH_JUMAN_COMMAND="/usr/local/bin/juman"
#PATH_JUMAN_COMMAND="/usr/local/bin/jumanpp"
#PATH_KNP_COMMAND="/usr/local/bin/knp"
PATH_JUMAN_COMMAND="juman"
PATH_KNP_COMMAND="knp"


def example_interface():
"""This functions shows you how to use interface function"""
if six.PY2:
input_document = [
{u"text-id": u"input-1", u"text": "おじいさんは山に芝刈りへ、おばあさんは川に洗濯へ行きました。"},
{u"text-id": u"input-2", u"text": u"東京 3日 ロイター] - 日銀は3日、急激な金利上昇を止めるため、特定の年限の国債買い入れを増やす「指値オペ」を実施した。トランプ米大統領による円安誘導批判を受け、日銀が長期金利を押し下げるようなオペは難しくなるとの思惑が浮上。長期金利は3日、一時、0.15%を超えて上昇した。日銀は、指し値オペの実行によってゼロ%に抑える政策に変化がないことを明確にし、圧力を意識した市場に「強い意思」を示した格好だ。"},
{u"text-id": u"input-3", u"text": u"指値オペの実施は現在の金融政策「長短金利操作(イールドカーブ・コントロール、YCC)」を開始した2016年9月以来、2度目となる。"},
{u"text-id": u"input-4", u"text": u"ドナルド・トランプ米大統領が有権者の心をつかんだ理由の一つは、その率直な物言いだ。ドルに関して言えば、米国の歴代財務長官が昔から繰り返してきた「強いドルは米国の国益にかなう」という妄言と決別するという新政権の意向は歓迎されよう。"},
]
else:
input_document = [
{"text-id": "input-1","text": "おじいさんは山に芝刈りへ、おばあさんは川に洗濯へ行きました。"},
{"text-id": "input-2", "text": "東京 3日 ロイター] - 日銀は3日、急激な金利上昇を止めるため、特定の年限の国債買い入れを増やす「指値オペ」を実施した。トランプ米大統領による円安誘導批判を受け、日銀が長期金利を押し下げるようなオペは難しくなるとの思惑が浮上。長期金利は3日、一時、0.15%を超えて上昇した。日銀は、指し値オペの実行によってゼロ%に抑える政策に変化がないことを明確にし、圧力を意識した市場に「強い意思」を示した格好だ。"},
{"text-id": "input-3", "text": "指値オペの実施は現在の金融政策「長短金利操作(イールドカーブ・コントロール、YCC)」を開始した2016年9月以来、2度目となる。"},
{"text-id": "input-4", "text": "ドナルド・トランプ米大統領が有権者の心をつかんだ理由の一つは、その率直な物言いだ。ドルに関して言えば、米国の歴代財務長官が昔から繰り返してきた「強いドルは米国の国益にかなう」という妄言と決別するという新政権の意向は歓迎されよう。"},
]

result_obj = knp_job.main(seq_input_dict_document=input_document,
n_jobs=-1,
is_normalize_text=True,
is_get_processed_doc=True,
juman_command=PATH_JUMAN_COMMAND, # Note: You can set jumanpp also (if it's available in your system)
knp_command=PATH_KNP_COMMAND,
process_mode="pexpect")

import json
logger.info(msg="--- example of parsed result ---")
print(json.dumps(result_obj.to_dict()[0], ensure_ascii=False))
logger.info('---')

"""You call get associated with pyknp which is official python wrapper for KNP"""
### With pyknp
try:
import pyknp
except:
import pip
try:
pip.main(['install', 'http://nlp.ist.i.kyoto-u.ac.jp/DLcounter/lime.cgi?down=http://lotus.kuee.kyoto-u.ac.jp/nl-resource/pyknp/pyknp-0.3.tar.gz&name=pyknp-0.3.tar.gz'])
except:
logger.error(msg="Failed to install pyknp. Skip this process.")
else:
from pyknp import KNP
knp_obj = KNP()
for knp_parsed_obj in result_obj.seq_document_obj:
pyknp_parsed_result = knp_obj.result(input_str=knp_parsed_obj.parsed_result)
bnst_surface = ["".join(mrph.midasi for mrph in bnst_obj.mrph_list()) for bnst_obj in pyknp_parsed_result.bnst_list()]
print(bnst_surface)


def performance_comparison():
"""This function shows you comparison of processing speed"""
if six.PY2:
input_document = [
{u"text-id": u"input-1", u"text": "おじいさんは山に芝刈りへ、おばあさんは川に洗濯へ行きました。"},
{u"text-id": u"input-2", u"text": u"東京 3日 ロイター] - 日銀は3日、急激な金利上昇を止めるため、特定の年限の国債買い入れを増やす「指値オペ」を実施した。トランプ米大統領による円安誘導批判を受け、日銀が長期金利を押し下げるようなオペは難しくなるとの思惑が浮上。長期金利は3日、一時、0.15%を超えて上昇した。日銀は、指し値オペの実行によってゼロ%に抑える政策に変化がないことを明確にし、圧力を意識した市場に「強い意思」を示した格好だ。"},
{u"text-id": u"input-3", u"text": u"指値オペの実施は現在の金融政策「長短金利操作(イールドカーブ・コントロール、YCC)」を開始した2016年9月以来、2度目となる。"},
{u"text-id": u"input-4", u"text": u"ドナルド・トランプ米大統領が有権者の心をつかんだ理由の一つは、その率直な物言いだ。ドルに関して言えば、米国の歴代財務長官が昔から繰り返してきた「強いドルは米国の国益にかなう」という妄言と決別するという新政権の意向は歓迎されよう。"},
] * 10
else:
input_document = [
{"text-id": "input-1","text": "おじいさんは山に芝刈りへ、おばあさんは川に洗濯へ行きました。"},
{"text-id": "input-2", "text": "東京 3日 ロイター] - 日銀は3日、急激な金利上昇を止めるため、特定の年限の国債買い入れを増やす「指値オペ」を実施した。トランプ米大統領による円安誘導批判を受け、日銀が長期金利を押し下げるようなオペは難しくなるとの思惑が浮上。長期金利は3日、一時、0.15%を超えて上昇した。日銀は、指し値オペの実行によってゼロ%に抑える政策に変化がないことを明確にし、圧力を意識した市場に「強い意思」を示した格好だ。"},
{"text-id": "input-3", "text": "指値オペの実施は現在の金融政策「長短金利操作(イールドカーブ・コントロール、YCC)」を開始した2016年9月以来、2度目となる。"},
{"text-id": "input-4", "text": "ドナルド・トランプ米大統領が有権者の心をつかんだ理由の一つは、その率直な物言いだ。ドルに関して言えば、米国の歴代財務長官が昔から繰り返してきた「強いドルは米国の国益にかなう」という妄言と決別するという新政権の意向は歓迎されよう。"},
] * 10
import time
## process_mode is pexpect(multi-thread, keep running processes) ##
start = time.time()
knp_job.main(seq_input_dict_document=input_document,
n_jobs=-1,
process_mode='pexpect',
is_normalize_text=True,
is_get_processed_doc=True,
juman_command=PATH_JUMAN_COMMAND,
knp_command=PATH_KNP_COMMAND)
elapsed_time = time.time() - start
print("pexpect mode, finished with :{0}".format(elapsed_time) + "[sec]")

## process_mode is everytime(multi-thread, launch processes everytime you call) ##
start = time.time()
knp_job.main(seq_input_dict_document=input_document,
n_jobs=-1,
process_mode='everytime',
is_normalize_text=True,
is_get_processed_doc=True,
juman_command=PATH_JUMAN_COMMAND,
knp_command=PATH_KNP_COMMAND)
elapsed_time = time.time() - start
print("everytime mode, finished with :{0}".format(elapsed_time) + "[sec]")

## pyknp which is official KNP wrapper ##
### With pyknp
try:
import pyknp
except:
import pip
try:
pip.main(['install', 'http://nlp.ist.i.kyoto-u.ac.jp/DLcounter/lime.cgi?down=http://lotus.kuee.kyoto-u.ac.jp/nl-resource/pyknp/pyknp-0.3.tar.gz&name=pyknp-0.3.tar.gz'])
except:
logger.error(msg="Failed to install pyknp. Skip this process.")
else:
start = time.time()
from pyknp import KNP
knp_obj = KNP(command=PATH_KNP_COMMAND, jumancommand=PATH_JUMAN_COMMAND)
for document_obj in input_document:
knp_obj.knp(sentence=knp_job.func_normalize_text(document_obj['text']))
elapsed_time = time.time() - start
print("pyknp, finished with :{0}".format(elapsed_time) + "[sec]")


if __name__=='__main__':
performance_comparison()
example_interface()
Loading

0 comments on commit b232ccf

Please sign in to comment.