Commit 3767aa1f authored by Indrek Jentson's avatar Indrek Jentson

Teenuse esmane seadistus

parent 5bd9e8d2
......@@ -23,22 +23,15 @@ RUN apt-get update && \
apt-get -y install curl sudo && \
curl -sL https://deb.nodesource.com/setup | sudo bash - && \
apt-get -y install build-essential nodejs wget && \
apt-get -y install g++ python3-dev python-dev libpython3-dev libpython-dev python3-pip python3-wheel python3-numpy swig && \
apt-get -y install git && echo "Installed 2"
# Tagame värskeima PIPi olemasolu
RUN wget https://bootstrap.pypa.io/get-pip.py && \
python get-pip.py && \
pip install -U pip
RUN npm install -g forever
# Valmistame ette koodi, mida me DOCKERis kasutama hakkame. Siinkohal peaks plaanima, et mis failid kus kataloogis peaks olema
RUN mkdir -p /wrapper && mkdir -p /config && mkdir -p /wrapper/files && mkdir -p /wrapper/tmp && mkdir -p /wrapper/logs && \
cd /wrapper && \
git clone 'git@gitlab.keeleressursid.ee:keeleliin/keeleliin-wrapper.git' && \
git clone 'https://gitlab.keeleressursid.ee/keeleliin/keeleliin-wrapper.git' && \
mv keeleliin-wrapper/* . && \
mv keeleliin-wrapper/.g* . && \
npm install && \
......@@ -47,19 +40,16 @@ echo "NPM is installed"
# SIIA ALLA lisa kõik installeerimise käsud, mis on vajalikud sisulist tööd tegeva tarkvara X paigaldamiseks.
# Tarkvara X paigaldamine algab
RUN cd /wrapper && \
git clone 'https://gitlab.keeleressursid.ee/keeleliin/py_tokenizer.git' && \
cp py_tokenizer/config_dist.js . && \
cp py_tokenizer/tokenizer.py .
# Kuna kasutame linuxi käsurea utiliiti, siis midagi spetsiaalset pole vaja lisada
# tokenizer.py jaoks on vajalik estnltk teek
RUN pip install estnltk
RUN cd /wrapper && \
git clone 'https://gitlab.keeleressursid.ee/keeleliin/kl-wc.git' && \
cp kl-wc/config_dist.js .
# Tarkvara X paigaldamine lõppeb
# Expose port
EXPOSE 3003
EXPOSE 3006
VOLUME ["/config"]
VOLUME ["/wrapper/logs"]
......
# Teenus KL-WC
Käesolev teenus kasutab Linuxi käsurea utiliiti 'wc' ja tagastab etteantava tekstifaili kohta
faili, milles on üks rida kujul
```
<ridade_arv> <sõnade_arv> <tähtede_arv> <maksimaalne_rea_pikkus>
```
## Projekti käivitamise ettevalmistamine dockeriga (Linuxis)
* NB! kl_teenus asemel kasuta alljärgnevalt oma teenuse nimetust!
* Tee käesolevast projektist enda GIT-is koopia.
* Tutvu saadaoleva dokumentatsiooniga ja tee oma uue projekti failidesse vajalikud muudatused. Tavaliselt on vaja muuta faile
* config_dist.js
......@@ -16,32 +23,32 @@
$ docker run --name kl_redis -d redis
```
* Lae alla oma teenuse Dockerfile
* wget https://github.com/username/kl_teenus/raw/master/Dockerfile
* wget https://github.com/username/kl-wc/raw/master/Dockerfile
* Muuda allalaetud faili vastavalt vajadusele. Näiteks muuda #Expose port parameetrit vastavalt sellele, millisel pordil hakkab loodud teenus töötama.
* Loo dockeri Image fail (kl_teenus - Image nimi):
* Loo dockeri Image fail (kl_wc - Image nimi):
```
$ docker build -t kl_teenus .
$ docker build -t kl_wc .
```
* Loo teenuse seadistuste faili ja muude failide jaoks dockerivälised kaustad:
```
$ cd /srv
$ mkdir -p keeleliin-teenus
$ mkdir -p keeleliin-teenus/config
$ mkdir -p keeleliin-teenus/wrapper
$ mkdir -p keeleliin-teenus/wrapper/files
$ mkdir -p keeleliin-teenus/wrapper/logs
$ mkdir -p keeleliin-wc
$ mkdir -p keeleliin-wc/config
$ mkdir -p keeleliin-wc/wrapper
$ mkdir -p keeleliin-wc/wrapper/files
$ mkdir -p keeleliin-wc/wrapper/logs
```
* Käivita loodud kl_teenus:
* Käivita loodud kl_wc:
```
$ docker run --name kl_teenus -d --link kl_redis:redis -p 3000:3000 -v /srv/keeleliin-teenus/config:/config -v /srv/keeleliin-teenus/wrapper/files:/wrapper/files -v /srv/keeleliin-teenus/wrapper/logs:/wrapper/logs kl_teenus
$ docker run --name kl_wc -d --link kl_redis:redis -p 3000:3000 -v /srv/keeleliin-wc/config:/config -v /srv/keeleliin-wc/wrapper/files:/wrapper/files -v /srv/keeleliin-wc/wrapper/logs:/wrapper/logs kl_wc
```
* Muuda vajaduse korral teenuse seadistusi failis /srv/keeleliin-teenus/config/config.js. Jälgi, et config.js-is kirjeldatud teenuse port ja Dockerfile #Expose port oleksid sama väärtusega.
* Muuda vajaduse korral teenuse seadistusi failis /srv/keeleliin-wc/config/config.js. Jälgi, et config.js-is kirjeldatud teenuse port ja Dockerfile #Expose port oleksid sama väärtusega.
* Soovi korral saab konteineris teha toiminguid, aga eeldatavasti ei ole vaja midagi täiendavat teha:
```
$ docker exec -it kl_teenus bash
$ docker exec -it kl_wc bash
```
* Konteinerist saab väljuda käsuga: Ctrl+P Ctrl+Q
* Kui muutsid midagi, siis uuenda teenust:
```
$ docker exec kl_teenus /wrapper/docker_update.sh
$ docker exec kl_wc /wrapper/docker_update.sh
```
......@@ -67,12 +67,12 @@ config.fs = {
*/
config.wrapper = { //teenuse seadistus
id: 'kl_tokenizer', // Unikaalne lühinimi
title: 'Teksti sõnestaja (pipe)', //Avalik nimi
description: 'Koostab etteantud tekstile vastava sõnede faili PipeContent formaadis', //Kirjeldus
port: 3003, //port
class: 'inputOutputLocalCommand', //wrapperi failinimi wrapper kaustast, mida utiliidi käivitamiseks kasutatakse
command: { commandTemplate: 'python tokenizer.py -i [data] -o [output]' }, // utiliidi käsurea käsk
id: 'kl_wc', // Unikaalne lühinimi
title: 'Word Count utiliit', //Avalik nimi
description: 'Koostab etteantud tekstile vastava statistika', //Kirjeldus
port: 3006, //port
class: 'simpleLocalCommand', //wrapperi failinimi wrapper kaustast, mida utiliidi käivitamiseks kasutatakse
command: { commandTemplate: 'cat [data] | wc -m -l -w -L' }, // utiliidi käsurea käsk
requestConf: { //Päringu seadistus
requestBodyParamsMappings: { //Päringu post parameetrid
isAsync: { //parameeter isAsync
......@@ -104,7 +104,7 @@ config.wrapper = { //teenuse seadistus
},
outputTypes: [ //teenuse väljundressursside kirjeldused
{
type: 'tok_a', //ressursi tüüp
type: 'text', //ressursi tüüp
key: 'output' //väljundressursi võti
}
],
......
#!/usr/bin/python
#coding: utf-8
import sys, getopt
from estnltk import Text
import codecs
import pkg_resources
import datetime
import json
def json_repr(obj):
""" Represent instance of a class as JSON.
Arguments:
obj -- any object
Return:
String that represent JSON-encoded object.
"""
def serialize(obj):
# Recursively walk object's hierarchy.
if isinstance(obj, (bool, int, long, float, basestring)):
return obj
elif isinstance(obj, dict):
obj = obj.copy()
for key in obj:
obj[key] = serialize(obj[key])
return obj
elif isinstance(obj, list):
return [serialize(item) for item in obj]
elif isinstance(obj, tuple):
return tuple(serialize([item for item in obj]))
elif hasattr(obj, '__dict__'):
return serialize(obj.__dict__)
else:
return repr(obj) # Don't know how to handle, convert to string
return json.dumps(serialize(obj), ensure_ascii=False)
def write_header(outfile, inputfile):
header = {'content':inputfile, 'coding':'utf-8', 'layer':'words',
'processor':'estnltk',
'version': pkg_resources.get_distribution("estnltk").version,
'time': datetime.datetime.now().isoformat(),
'description':'This file contains list of words with positions extracted from the content.',
'structure':'data:[word*:{word_index,token,start,end}]'
}
outfile.write(json_repr(header) + u'\n')
def write_mapping(outfile):
mapping = {'fields':[
{'name':'word', 'label':'', 'type':'O', 'ctx':'data'},
{'name':'word_index','label':'i', 'type':'N', 'ctx':'word'},
{'name':'token', 'label':'t', 'type':'S', 'ctx':'word'},
{'name':'start', 'label':'s', 'type':'N', 'ctx':'word'},
{'name':'end', 'label':'e', 'type':'N', 'ctx':'word'}
]}
outfile.write(json_repr(mapping) + u'\n')
def main(argv):
inputfile = ''
outputfile = ''
helptext = 'Usage: python tokenizer.py -i <inputfile> -o <outputfile>'
if len(argv) == 0:
print helptext
sys.exit()
try:
opts, args = getopt.getopt(argv,"hi:o:",["ifile=","ofile="])
except getopt.GetoptError:
print helptext
sys.exit(2)
for opt, arg in opts:
if opt == '-h':
print helptext
sys.exit()
elif opt in ("-i", "--ifile"):
inputfile = arg
elif opt in ("-o", "--ofile"):
outputfile = arg
infile = codecs.open(inputfile, "r", "utf-8")
outfile = codecs.open(outputfile, "w", "utf-8")
outfile.write('{\n')
outfile.write('"header":')
write_header(outfile, inputfile)
outfile.write(', "mapping":')
write_mapping(outfile)
offset = 0
idx = 0
sep = ''
outfile.write(', "data":[\n')
for line in infile:
doc = Text(line)
doc.tokenize_words()
tokens = doc['words']
last_end = 0
for t in tokens:
outfile.write(sep+'{"i":'+str(idx)+', "t":"'+t['text']+'", "s":'+str(t['start']+offset)+', "e":'+str(t['end']+offset)+'}\n')
idx += 1
last_end = t['end']
sep = ','
offset += last_end + 1
outfile.write(']\n}\n')
outfile.close()
infile.close()
if __name__ == "__main__":
main(sys.argv[1:])
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment