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]
.
├── 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
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.
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
HTTP-Anfrage
POST /mecab/v1/parse-ipadic
POST /mecab/v1/parse-neologd
Header anfordern
Content-Type: application/json
Text anfordern
{
"sentence":String
}
$ 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
}
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
}
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
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
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.
Recommended Posts