•  niereh-światło

MTR: wiele tłumaczeń

pakowanie usług tłumaczeniowych do użytku wewnętrznego

Publikując stronę internetową możesz chcieć zaoferować różne tłumaczenia. Niektórzy ludzie nie lubią tłumaczy automatycznych, myślę, że tłumaczenie automatyczne jest wystarczająco dobre i lepsze niż nic, a tłumacze zautomatyzowani stają się coraz lepsi wraz z postępem NLP oraz ML.

Popularne usługi tłumaczeniowe to google, bing, yandex. Oferują one bezpłatny poziom, który chcemy zawinąć na własny użytek. Są też inne mniej znane usługi tłumaczące , a niektóre z nich są wyłączone w momencie pisania...

Buforowanie tekstu

Jeśli chcemy buforować tłumaczenia, musieliśmy podzielić żądany tekst na mniejsze ciągi, tak aby były wystarczająco małe, aby zapewnić trafienia dla ewentualnych przyszłych żądań. ten kompromis jest to, że tłumaczenie mniejszych zdań ma mniej kontekstu, co obniża jakość tłumaczenia.

Jak podzielić przychodzący tekst tak, abyśmy mogli zrekonstruować oryginał z przetłumaczonego tekstu, to nie lada sztuczka… albo hack. Chcemy znaleźć ciąg na tyle dziwny, że usługa tłumaczeń go zostawi tak jak jest w swoich wynikach. Znalazłem odmiany znak akapitu pracować przez większość czasu

$this->misc['glue'] = ' ; ¶ ; ';
$this->misc['splitGlue'] = '/\s?;\s?¶\s?;?\s?/';

tenglue ciąg służy do łączenia wszystko ciągi (oddzielone od pierwotnego żądania) na jeden jedno ciało dla żądania tłumaczenia upstream, które wysyłamy m.in. Google. tensplitGlue jest zamiast tego używany do dzielenia odebranego tłumaczenia na ciągi, które będziemy buforować. Widzimy tutaj, że dzielenie ciągów jest przydatne nie tylko do buforowania, ale do zmniejszyć liczbę próśb, ponieważ w przypadku, gdy nasze żądanie podrzędne wykonuje wiele małych zapytań, używamy naszych maszyn do łączenia żądań do maksymalnego rozmiaru ładunku dozwolonego przez usługę nadrzędną.

Interfejs

W celu obsługi wielu usług przejrzyście Napisałem interfejs, który osiadł na tym api

function__construct(
    Mtr &$mtr,
    Client &$gz,
    TextReq &$txtrq,
    LanguageCode &$ld);
functiontranslate($source, $target, $input);
functiongenReq(array$params);
functionpreReq(array &$input);
functiongetLangs();

Tak więc usługa, która ma działać, musi oferować funkcję tłumaczenia, jak tłumaczyć żądania i dostarczać listę obsługiwanych języków. Z listy obsługiwanych języków możemy stworzyć macierz, dzięki której wiemy, ile usług obsługuje określone pary językowe, do parsowania pary językowe konwertujemy reprezentację zwróconą przez serwis na zwykłąiso639-1.

Utworzenie instancji tłumaczenia pozwala również na skonfigurowanie opcji żądań używanych przezGuzzle instancja klienta w taki sposób, że możemy na przykład używać serwerów proxy do wykonywania żądań. Usługi są w pamięci podręcznej po pierwszym wygenerowaniu jest to przydatne, ponieważ niektóre usługi wymagają wygenerowania początkowych tokenów i nie chcemy ich za każdym razem ponownie generować.

Wersja Go

Napisałem też wersja w golangu. Wersja PHP byłaby używana przez zaimportowanie jej do projektu PHP, podczas gdy wersja go działa jako samodzielna (mikro) usługa. Wersja go jest znacznie bardziej szczegółowa, ponieważ wymaga ścisłego sprawdzania typu, a ponieważ obsługujemy odpytywanie wielu ciągów jednocześnie, musimy ujawnić interfejs API, który działa z różnymi kombinacjami danych wejściowych, a brak generycznych go sprawia, że ​​implementacja jest bardzo bolesna, ale oferowała jednoczesne przetwarzanie i ogólnie był znacznie szybszy.

Wejścia czyszczące

W połączeniu z tłumaczeniem zbudowałem również usługę do posprzątaj html . Dodajemy niektóre tagi HTML do białej listy, a resztę odrzucamy. Usuwamy również podobne do spamu zduplikowane znaki interpunkcyjne i nieznane atrybuty HTML oraz umieszczamy linki w odpowiednich znacznikach kotwicy.

Własny host:

Wnioski

Obecnie myślę, że po prostu skorzystałbym z samoobsługowego rozwiązania, dostarczonego przez joshua lub argos, ponieważ nie dążę do najlepszego tłumaczenia, chcę zaoferować czytelne tłumaczenie strony internetowej, aby można było się po niej poruszać bez przeszkód.

Tagi postów: