[PYTHON] Dockerfile für RESTful MeCab Server mit mecab-ipadic-neologd

Bisher war es schwierig, Mecab-Python einzuführen. Fügen wir es also in einer Docker-Datei zusammen.

Der REST-API-Teil wurde in Flask unter Bezugnahme auf hier implementiert. Die Quelle finden Sie unter github. Dies ist praktisch, wenn Sie auch Docker-Compose verwenden. Mit nur einem Behälter wie diesem schmeckt es nicht sehr gut.

: memo: [2016-10-07 hinzugefügt] Hinzugefügt zum Aktualisieren der Wörterbuchdatei. : memo: [2018-03-11 postscript] Frontend hinzugefügt.

Dockerfile Dies ist das Ergebnis.

FROM ubuntu:16.04

RUN apt-get update \
  && apt-get install python3 python3-pip curl git sudo cron -y \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/*

WORKDIR /opt
RUN git clone https://github.com/taku910/mecab.git
WORKDIR /opt/mecab/mecab
RUN ./configure  --enable-utf8-only \
  && make \
  && make check \
  && make install \
  && ldconfig

WORKDIR /opt/mecab/mecab-ipadic
RUN ./configure --with-charset=utf8 \
  && make \
  &&make install

WORKDIR /opt
RUN git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
WORKDIR /opt/mecab-ipadic-neologd
RUN ./bin/install-mecab-ipadic-neologd -n -y

COPY . /opt/api
WORKDIR /opt/api
RUN pip3 install -r requirements.txt

CMD ["python3", "server.py"]

: memo: [2016-10-07 postscript]

Andere

Verzeichnisaufbau

.
├── README.md
├── docker-compose.yml
└── flask-mecab
    ├── Dockerfile
    ├── requirements.txt
    └── server.py

docker-compose.yml

api:
  build: ./flask-mecab
  volumes:
    - "./flask-mecab:/opt/api"
  ports:
    - "5000:5000"
  restart: always

Konvertieren Sie die MeCab-Ausgabe in das JSON-Format

Sie können das Ausgabeformat von MeCab anpassen, jedoch standardmäßig

Oberflächentyp\t Teil Texte,Teiltexte Unterklassifizierung 1,Teil Teil Unterklassifizierung 2,Teiltexte Unterklassifizierung 3,Nutzungsart,Nutzungsart,Prototyp,lesen,Aussprache

Da dies der Fall ist, wird jede Zeile der Ausgabezeichenfolge durch '\ t'und' geteilt, und zip () wird verwendet, um jedem Element zu entsprechen.

server.py


def mecab_parse(sentence, dic='ipadic'):
    dic_dir = "/usr/local/lib/mecab/dic/"
    if dic == 'neologd':
        dic_name = 'mecab-ipadic-neologd'
    else:
        dic_name = dic

    m = MeCab.Tagger('-d ' + dic_dir + dic_name)

    #Ausgabeformat (Standard)
    format = ['Oberflächentyp', 'Teil','Teil細分類1', 'Teil細分類2', 'Teil細分類3', 'Nutzungsart', 'Nutzungsart','Prototyp','lesen','Aussprache']

    return [dict(zip(format, (lambda x: [x[0]]+x[1].split(','))(p.split('\t')))) for p in m.parse(sentence).split('\n')[:-2]]

Siehe auch das Ausführungsbeispiel unten.

Startmethode

Dies ist der einzige Start, da Sie Portweiterleitungseinstellungen usw. in docker-compose.yml schreiben können.

$ git clone https://github.com/matsulib/mecab-service.git
$ cd mecab-service/
$ sudo docker-compose up -d   

Ausführungsmethode

HTTP-Anfrage

POST /mecab/v1/parse-ipadic
POST /mecab/v1/parse-neologd

Header anfordern

Content-Type: application/json

Text anfordern

{
  "sentence":String
}

Ausführungsbeispiel ipadic

$ curl -X POST http://localhost:5000/mecab/v1/parse-ipadic \
       -H "Content-type: application/json" \
       -d '{"sentence": "Funktionsprogrammierung"}'  | jq .
{
  "dict": "ipadic",
  "message": "Success",
  "results": [
    {
      "Prototyp": "Funktion",
      "Teil": "Substantiv",
      "Teiltexte Unterklassifizierung 1": "Allgemeines",
      "Teil Teil Unterklassifizierung 2": "*",
      "Teiltexte Unterklassifizierung 3": "*",
      "Nutzungsart": "*",
      "Nutzungsart": "*",
      "Aussprache": "Kansu",
      "Oberflächentyp": "Funktion",
      "lesen": "Kansu"
    },
    {
      "Prototyp": "Schimmel",
      "Teil": "Substantiv",
      "Teiltexte Unterklassifizierung 1": "Suffix",
      "Teil Teil Unterklassifizierung 2": "Allgemeines",
      "Teiltexte Unterklassifizierung 3": "*",
      "Nutzungsart": "*",
      "Nutzungsart": "*",
      "Aussprache": "abspielen",
      "Oberflächentyp": "Schimmel",
      "lesen": "abspielen"
    },
    {
      "Prototyp": "Programmierung",
      "Teil": "Substantiv",
      "Teiltexte Unterklassifizierung 1": "Verbindung ändern",
      "Teil Teil Unterklassifizierung 2": "*",
      "Teiltexte Unterklassifizierung 3": "*",
      "Nutzungsart": "*",
      "Nutzungsart": "*",
      "Aussprache": "Programmierung",
      "Oberflächentyp": "Programmierung",
      "lesen": "Programmierung"
    }
  ],
  "status": 200
}
 

Ausführungsbeispiel mecab-ipadic-neologd

mecab-ipadic-neologd ist ein Wörterbuch, das stark gegen die richtige Nomenklatur ist.

$ curl -X POST http://localhost:5000/mecab/v1/parse-neologd \
       -H "Content-type: application/json" \
       -d '{"sentence": "Funktionsprogrammierung"}'  | jq .
{
  "dict": "neologd",
  "message": "Success",
  "results": [
    {
      "Prototyp": "Funktionsprogrammierung",
      "Teil": "Substantiv",
      "Teiltexte Unterklassifizierung 1": "Proprietäre Nomenklatur",
      "Teil Teil Unterklassifizierung 2": "Allgemeines",
      "Teiltexte Unterklassifizierung 3": "*",
      "Nutzungsart": "*",
      "Nutzungsart": "*",
      "Aussprache": "Kansugata-Programmierung",
      "Oberflächentyp": "Funktionsprogrammierung",
      "lesen": "Kansugata-Programmierung"
    }
  ],
  "status": 200
}

Informationen zur Bildgröße

Das aus dieser Docker-Datei erstellte Bild ist das nächste mecabservice_api, das im Vergleich zum ursprünglichen Ubuntu riesig ist.

$ sudo docker images
REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
mecabservice_api          latest              785bc1295e46        About an hour ago   3.375 GB
ubuntu                    16.04               c73a085dc378        4 days ago          127.1 MB

Mal sehen, wo es mit dem Unterbefehl history aufgebläht wurde. Immerhin scheint die Wörterbuchdatei sehr groß zu sein, aber kann man ihr nicht helfen?

$ sudo docker history mecabservice_api
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
785bc1295e46        About an hour ago   /bin/sh -c #(nop) CMD ["python3" "server.py"]   0 B
00339a58f77e        About an hour ago   /bin/sh -c pip3 install -r requirements.txt     5.852 MB
a397235a8e30        About an hour ago   /bin/sh -c #(nop) WORKDIR /opt/api              0 B
436ef40f928d        About an hour ago   /bin/sh -c #(nop) COPY dir:a4cb3a57cc1f117b07   2.445 kB
12456a11160d        3 hours ago         /bin/sh -c ./bin/install-mecab-ipadic-neologd   2.307 GB
18478e2f8d71        3 hours ago         /bin/sh -c #(nop) WORKDIR /opt/mecab/mecab-ip   0 B
74e6a0bffa98        3 hours ago         /bin/sh -c git clone --depth 1 https://github   114.2 MB
db6a7c716f21        3 hours ago         /bin/sh -c #(nop) WORKDIR /opt/mecab            0 B
6980af0a5afd        3 hours ago         /bin/sh -c ./configure --with-charset=utf8      106 MB
db32f32c58e6        3 hours ago         /bin/sh -c #(nop) WORKDIR /opt/mecab/mecab-ip   0 B
5745385f2342        3 hours ago         /bin/sh -c ./configure  --enable-utf8-only      11.16 MB
8c601b1fac00        3 hours ago         /bin/sh -c #(nop) WORKDIR /opt/mecab/mecab      0 B
d730397e47eb        3 hours ago         /bin/sh -c git clone https://github.com/taku9   378.8 MB
2abd825af064        3 hours ago         /bin/sh -c apt-get update   && apt-get instal   325 MB
d5abec2370fb        3 hours ago         /bin/sh -c #(nop) WORKDIR /opt                  0 B
c73a085dc378        4 days ago          /bin/sh -c #(nop)  CMD ["/bin/bash"]            0 B

: memo: [2016/10/07 postscript] Aktualisiere das Wörterbuch von mecab-ipadic-neologd automatisch

Ich habe festgestellt, dass das Wörterbuch von mecab-ipadic-neologd regelmäßig auf dem Server aktualisiert wird. Ich tat.

-Dieses Wörterbuch wird auf dem Entwicklungsserver automatisch aktualisiert

  • Wird mindestens zweimal pro Woche aktualisiert
  • Montag und Donnerstag

Darüber hinaus finden Sie unter Offiziell Anweisungen zum Abrufen von Updates für das Wörterbuch nach der Installation.

Es gibt bereits nützliche Optionen, wenn Sie automatisch aktualisieren möchten, z. B. mit cron (nicht erklärt). Wenn Sie beispielsweise die folgenden zwei Zeilen in crontab usw. schreiben, können Sie am Dienstag und Freitag um 3:00 Uhr mit (-y) Benutzerberechtigung (-u) angeben, ohne das Analyseergebnis> im Verzeichnis (-) zu überprüfen. p [/ path / to / user / directory]) Eine Wörterbuchdatei wird aktualisiert.

    00 03 * * 2 ./bin/install-mecab-ipadic-neologd -n -y -u -p /path/to/user/directory > /path/to/log/file
    00 03 * * 5 ./bin/install-mecab-ipadic-neologd -n -y -u -p /path/to/user/directory > /path/to/log/file

Wenn Sie den laufenden Container auf mecabservice_api_1 setzen und das Aktualisierungsprotokoll an / opt / log / mecab ausgeben möchten, Sie können es einstellen, indem Sie wie unten gezeigt mit bash eine Verbindung zum Container herstellen.

$ sudo docker exec -it mecabservice_api_1 /bin/bash
# mkdir -p /opt/log/mecab
# (crontab -l 2>/dev/null; echo "PATH=$PATH") | crontab -
# (crontab -l 2>/dev/null; echo '00 18 * * 1 /opt/mecab-ipadic-neologd/bin/install-mecab-ipadic-neologd -n -y >/opt/log/mecab/neologd_`date -I`.log 2>/opt/log/mecab/neologd_`date -I`.err') | crontab -
# (crontab -l 2>/dev/null; echo '00 18 * * 4 /opt/mecab-ipadic-neologd/bin/install-mecab-ipadic-neologd -n -y >/opt/log/mecab/neologd_`date -I`.log 2>/opt/log/mecab/neologd_`date -I`.err') | crontab -
# /etc/init.d/cron restart
# exit

Hier wird die UTC-Zeit so eingestellt, dass sie am Dienstag und Freitag der JST-Zeit um 3:00 Uhr morgens aktualisiert wird. Standardmäßig blieb es für einen Moment hängen, in dem Mecab nicht im crontab-Pfad enthalten war. Außerdem funktionierte ein kleiner Fehler in der Shell zunächst nicht mit den oben genannten Einstellungen, aber ich warf Issue and Pull Request. Sobald ich es zusammengeführt hatte, fing es an zu funktionieren (* ^^) v

: memo: [2018/03/11 postscript] Frontend hinzufügen

Obwohl ich Docker-Compose verwende, bin ich mit nur einem Dienst einsam. Daher habe ich eine Webanwendung hinzugefügt, die die obige REST-API vom Front-End aus auf Docker-Compose aufruft. Siehe github für die Frontquelle. Die Kommunikation zwischen Containern und CORS-Einstellungen war verstopft.

docker-compose.yml

api:
  build: ./flask-mecab
  volumes:
    - "./flask-mecab:/opt/api"
  ports:
    - "5000:5000"
  restart: always
front:
  build: ./flask-mecab-front
  volumes:
    - "./flask-mecab-front:/opt/front"
  ports:
    - "5001:5001"
  restart: always
  links:
    - api
  environment:
    FLASK_MECAB_URI: "http://api:5000/mecab/v1"

Greifen Sie nach dem Booten mit Ihrem Browser auf "http: // localhost: 5001 /" zu.

Bildschirmfoto

mecab.PNG

Recommended Posts

Dockerfile für RESTful MeCab Server mit mecab-ipadic-neologd
Webserver zum Testen des Browsers mit Mocha
TFTP-Server mit Docker
Verwenden Sie mecab-ipadic-neologd mit igo-python
Verwenden Sie Mecab mit Python 3
Proxyserver mit Docker
Lokaler Server mit Python
Bibliothek zur Angabe eines Nameservers in Python und Dig
Reduzieren wir den Arbeitsaufwand für die Servereinrichtung mit Ansible