From 764ad87192b5964e2862c79289a075c640dc2a52 Mon Sep 17 00:00:00 2001 From: Damien Daspit Date: Tue, 15 Oct 2024 17:40:05 -0500 Subject: [PATCH] Add MT tutorial --- .vscode/settings.json | 17 +- README.md | 1 + .../hugging_face_nmt_model_factory.py | 14 +- machine/jobs/settings.yaml | 2 +- .../huggingface/hugging_face_nmt_engine.py | 2 +- .../hugging_face_nmt_model_trainer.py | 47 +- machine/translation/translation_suggester.py | 19 +- machine/translation/truecaser.py | 21 +- samples/data/smt.cfg | 29 + samples/data/sp.txt | 1000 +++++++++++++++++ samples/machine_translation.ipynb | 455 ++++++++ .../test_hugging_face_nmt_model_trainer.py | 64 +- 12 files changed, 1591 insertions(+), 80 deletions(-) create mode 100644 samples/data/smt.cfg create mode 100644 samples/data/sp.txt create mode 100644 samples/machine_translation.ipynb diff --git a/.vscode/settings.json b/.vscode/settings.json index 4498368c..02faa85c 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,24 +1,15 @@ { "editor.formatOnSave": true, "editor.codeActionsOnSave": { - "source.organizeImports": "explicit", + "source.organizeImports": "explicit" }, "python.testing.unittestEnabled": false, "python.testing.pytestEnabled": true, - "python.analysis.extraPaths": [ - "tests" - ], + "python.analysis.extraPaths": ["tests"], "python.analysis.importFormat": "relative", "[python]": { "editor.defaultFormatter": "ms-python.black-formatter", "editor.formatOnSave": true }, - "black-formatter.path": [ - "poetry", - "run", - "black" - ], - "python.analysis.extraPaths": [ - "./tests" - ] -} \ No newline at end of file + "black-formatter.path": ["poetry", "run", "black"] +} diff --git a/README.md b/README.md index 0b4714e1..d74b4c62 100644 --- a/README.md +++ b/README.md @@ -17,3 +17,4 @@ If you would like to find out more about how to use Machine, check out the tutor - [Tokenization](https://githubtocolab.com/sillsdev/machine.py/blob/main/samples/tokenization.ipynb) - [Text Corpora](https://githubtocolab.com/sillsdev/machine.py/blob/main/samples/corpora.ipynb) - [Word Alignment](https://githubtocolab.com/sillsdev/machine.py/blob/main/samples/word_alignment.ipynb) +- [Machine Translation](https://githubtocolab.com/sillsdev/machine.py/blob/main/samples/machine_translation.ipynb) diff --git a/machine/jobs/huggingface/hugging_face_nmt_model_factory.py b/machine/jobs/huggingface/hugging_face_nmt_model_factory.py index ea4b8115..fb142f8a 100644 --- a/machine/jobs/huggingface/hugging_face_nmt_model_factory.py +++ b/machine/jobs/huggingface/hugging_face_nmt_model_factory.py @@ -3,6 +3,8 @@ from pathlib import Path from typing import Any, cast +import datasets.utils.logging as datasets_logging +import transformers.utils.logging as transformers_logging from transformers import AutoConfig, AutoModelForSeq2SeqLM, HfArgumentParser, PreTrainedModel, Seq2SeqTrainingArguments from transformers.integrations import ClearMLCallback from transformers.tokenization_utils import TruncationStrategy @@ -39,6 +41,16 @@ def __init__(self, config: Any) -> None: ): self._training_args.report_to.remove("clearml") + # The default of training_args.log_level is passive, so we set log level at info here to have that default. + transformers_logging.set_verbosity_info() + + log_level = self._training_args.get_process_log_level() + logger.setLevel(log_level) + datasets_logging.set_verbosity(log_level) + transformers_logging.set_verbosity(log_level) + transformers_logging.enable_default_handler() + transformers_logging.enable_explicit_format() + @property def train_tokenizer(self) -> bool: return False @@ -67,7 +79,7 @@ def create_model_trainer(self, corpus: ParallelTextCorpus) -> Trainer: src_lang=self._config.src_lang, tgt_lang=self._config.trg_lang, add_unk_src_tokens=self._config.huggingface.tokenizer.add_unk_src_tokens, - add_unk_trg_tokens=self._config.huggingface.tokenizer.add_unk_trg_tokens, + add_unk_tgt_tokens=self._config.huggingface.tokenizer.add_unk_tgt_tokens, ) def create_engine(self) -> TranslationEngine: diff --git a/machine/jobs/settings.yaml b/machine/jobs/settings.yaml index bcbe7c73..f64dad8b 100644 --- a/machine/jobs/settings.yaml +++ b/machine/jobs/settings.yaml @@ -24,7 +24,7 @@ default: oom_batch_size_backoff_mult: 0.5 tokenizer: add_unk_src_tokens: true - add_unk_trg_tokens: true + add_unk_tgt_tokens: true thot_mt: word_alignment_model_type: hmm tokenizer: latin diff --git a/machine/translation/huggingface/hugging_face_nmt_engine.py b/machine/translation/huggingface/hugging_face_nmt_engine.py index 61618f02..2906fed7 100644 --- a/machine/translation/huggingface/hugging_face_nmt_engine.py +++ b/machine/translation/huggingface/hugging_face_nmt_engine.py @@ -52,7 +52,7 @@ def __init__( self._tokenizer = AutoTokenizer.from_pretrained(self._model.name_or_path, use_fast=True) if isinstance(self._tokenizer, (NllbTokenizer, NllbTokenizerFast)): self._mpn = MosesPunctNormalizer() - self._mpn.substitutions = [(re.compile(r), sub) for r, sub in self._mpn.substitutions] + self._mpn.substitutions = [(re.compile(r), sub) for r, sub in self._mpn.substitutions] # type: ignore else: self._mpn = None diff --git a/machine/translation/huggingface/hugging_face_nmt_model_trainer.py b/machine/translation/huggingface/hugging_face_nmt_model_trainer.py index dcd5895d..4560d307 100644 --- a/machine/translation/huggingface/hugging_face_nmt_model_trainer.py +++ b/machine/translation/huggingface/hugging_face_nmt_model_trainer.py @@ -6,9 +6,7 @@ from pathlib import Path from typing import Any, Callable, List, Optional, Union, cast -import datasets.utils.logging as datasets_logging import torch # pyright: ignore[reportMissingImports] -import transformers.utils.logging as transformers_logging from datasets.arrow_dataset import Dataset from sacremoses import MosesPunctNormalizer from torch import Tensor # pyright: ignore[reportMissingImports] @@ -84,10 +82,10 @@ def __init__( corpus: Union[ParallelTextCorpus, Dataset], src_lang: Optional[str] = None, tgt_lang: Optional[str] = None, - max_source_length: Optional[int] = None, - max_target_length: Optional[int] = None, + max_src_length: Optional[int] = None, + max_tgt_length: Optional[int] = None, add_unk_src_tokens: bool = False, - add_unk_trg_tokens: bool = True, + add_unk_tgt_tokens: bool = True, ) -> None: self._model = model self._training_args = training_args @@ -96,12 +94,12 @@ def __init__( self._tgt_lang = tgt_lang self._trainer: Optional[Seq2SeqTrainer] = None self._metrics = {} - self.max_source_length = max_source_length - self.max_target_length = max_target_length + self.max_src_length = max_src_length + self.max_tgt_length = max_tgt_length self._add_unk_src_tokens = add_unk_src_tokens - self._add_unk_trg_tokens = add_unk_trg_tokens + self._add_unk_tgt_tokens = add_unk_tgt_tokens self._mpn = MosesPunctNormalizer() - self._mpn.substitutions = [(re.compile(r), sub) for r, sub in self._mpn.substitutions] + self._mpn.substitutions = [(re.compile(r), sub) for r, sub in self._mpn.substitutions] # type: ignore self._stats = TrainStats() @property @@ -113,17 +111,6 @@ def train( progress: Optional[Callable[[ProgressStatus], None]] = None, check_canceled: Optional[Callable[[], None]] = None, ) -> None: - if self._training_args.should_log: - # The default of training_args.log_level is passive, so we set log level at info here to have that default. - transformers_logging.set_verbosity_info() - - log_level = self._training_args.get_process_log_level() - logger.setLevel(log_level) - datasets_logging.set_verbosity(log_level) - transformers_logging.set_verbosity(log_level) - transformers_logging.enable_default_handler() - transformers_logging.enable_explicit_format() - last_checkpoint = None if os.path.isdir(self._training_args.output_dir) and not self._training_args.overwrite_output_dir: last_checkpoint = get_last_checkpoint(self._training_args.output_dir) @@ -203,7 +190,7 @@ def add_tokens(tokenizer: Any, missing_tokens: List[str]) -> Any: logger.info(f"Added {len(missing_tokens)} tokens to the tokenizer: {missing_tokens}") return AutoTokenizer.from_pretrained(str(tokenizer_dir), use_fast=True) - if self._add_unk_src_tokens or self._add_unk_trg_tokens: + if self._add_unk_src_tokens or self._add_unk_tgt_tokens: logger.info("Checking for missing tokens") if not isinstance(tokenizer, PreTrainedTokenizerFast): logger.warning( @@ -217,7 +204,7 @@ def add_tokens(tokenizer: Any, missing_tokens: List[str]) -> Any: ) # using unofficially supported behavior to set the normalizer tokenizer.backend_tokenizer.normalizer = norm_tok.backend_tokenizer.normalizer # type: ignore - if self._add_unk_src_tokens and self._add_unk_trg_tokens: + if self._add_unk_src_tokens and self._add_unk_tgt_tokens: lang_codes = [src_lang, tgt_lang] elif self._add_unk_src_tokens: lang_codes = [src_lang] @@ -293,12 +280,12 @@ def add_lang_code_to_tokenizer(tokenizer: Any, lang_code: str): if model.name_or_path.startswith("t5-") or model.name_or_path.startswith("google/mt5-"): prefix = f"translate {self._src_lang} to {self._tgt_lang}: " - max_source_length = self.max_source_length - if max_source_length is None: - max_source_length = model.config.max_length - max_target_length = self.max_target_length - if max_target_length is None: - max_target_length = model.config.max_length + max_src_length = self.max_src_length + if max_src_length is None: + max_src_length = model.config.max_length + max_tgt_length = self.max_tgt_length + if max_tgt_length is None: + max_tgt_length = model.config.max_length if self._training_args.label_smoothing_factor > 0 and not hasattr( model, "prepare_decoder_input_ids_from_labels" @@ -317,9 +304,9 @@ def preprocess_function(examples): inputs = [prefix + ex[src_lang] for ex in examples["translation"]] targets = [ex[tgt_lang] for ex in examples["translation"]] - model_inputs = tokenizer(inputs, max_length=max_source_length, truncation=True) + model_inputs = tokenizer(inputs, max_length=max_src_length, truncation=True) # Tokenize targets with the `text_target` keyword argument - labels = tokenizer(text_target=targets, max_length=max_target_length, truncation=True) + labels = tokenizer(text_target=targets, max_length=max_tgt_length, truncation=True) model_inputs["labels"] = labels["input_ids"] return model_inputs diff --git a/machine/translation/translation_suggester.py b/machine/translation/translation_suggester.py index a31df695..0a6f87b7 100644 --- a/machine/translation/translation_suggester.py +++ b/machine/translation/translation_suggester.py @@ -1,8 +1,10 @@ from abc import ABC, abstractmethod -from typing import Iterable, Sequence +from typing import Iterable, Optional, Sequence +from .interactive_translator import InteractiveTranslator from .translation_result import TranslationResult from .translation_suggestion import TranslationSuggestion +from .truecaser import Truecaser class TranslationSuggester(ABC): @@ -14,3 +16,18 @@ def __init__(self, confidence_threshold: float = 0, break_on_punctuation: bool = def get_suggestions( self, n: int, prefix_count: int, is_last_word_complete: bool, results: Iterable[TranslationResult] ) -> Sequence[TranslationSuggestion]: ... + + def get_suggestions_from_translator( + self, n: int, translator: InteractiveTranslator, truecaser: Optional[Truecaser] = None + ) -> Sequence[TranslationSuggestion]: + results = translator.get_current_results() + if truecaser is not None: + results = ( + truecaser.truecase_translation_result(result, translator.target_detokenizer) for result in results + ) + return self.get_suggestions( + n, + len(translator.prefix_word_ranges), + translator.is_last_word_complete, + results + ) diff --git a/machine/translation/truecaser.py b/machine/translation/truecaser.py index c46006df..c43f0c27 100644 --- a/machine/translation/truecaser.py +++ b/machine/translation/truecaser.py @@ -1,8 +1,11 @@ from abc import ABC, abstractmethod -from typing import Sequence +from typing import Optional, Sequence from ..corpora.text_corpus import TextCorpus +from ..tokenization.detokenizer import Detokenizer +from ..tokenization.whitespace_detokenizer import WHITESPACE_DETOKENIZER from .trainer import Trainer +from .translation_result import TranslationResult class Truecaser(ABC): @@ -15,5 +18,21 @@ def train_segment(self, segment: Sequence[str], sentence_start: bool = True) -> @abstractmethod def truecase(self, segment: Sequence[str]) -> Sequence[str]: ... + def truecase_translation_result( + self, result: TranslationResult, detokenizer: Optional[Detokenizer] = None + ) -> TranslationResult: + if detokenizer is None: + detokenizer = WHITESPACE_DETOKENIZER + target_tokens = self.truecase(result.target_tokens) + return TranslationResult( + detokenizer.detokenize(target_tokens), + result.source_tokens, + target_tokens, + result.confidences, + result.sources, + result.alignment, + result.phrases, + ) + @abstractmethod def save(self) -> None: ... diff --git a/samples/data/smt.cfg b/samples/data/smt.cfg new file mode 100644 index 00000000..b438a898 --- /dev/null +++ b/samples/data/smt.cfg @@ -0,0 +1,29 @@ +# Translation model prefix +-tm tm/src_trg + +# Language model +-lm lm/trg.lm + +# W parameter (maximum number of translation options to be considered per each source phrase) +-W 10 + +# S parameter (maximum number of hypotheses that can be stored in each stack) +-S 10 + +# A parameter (Maximum length in words of the source phrases to be translated) +-A 7 + +# Degree of non-monotonicity +-nomon 0 + +# Heuristic function used +-h 6 + +# Best-first search flag +-be + +# Translation model weights +-tmw 0 0.5 1 1 1 1 0 1 + +# Set online learning parameters (ol_alg, lr_policy, l_stepsize, em_iters, e_par, r_par) +-olp 0 0 1 5 1 0 diff --git a/samples/data/sp.txt b/samples/data/sp.txt new file mode 100644 index 00000000..f50ee441 --- /dev/null +++ b/samples/data/sp.txt @@ -0,0 +1,1000 @@ +¿Le importaría darnos las llaves de la habitación, por favor? +He hecho la reserva de una habitación tranquila doble con teléfono y televisión a nombre de Rosario Cabedo. +¿Le importaría cambiarme a otra habitación más tranquila? +Por favor, tengo reservada una habitación. +Me parece que existe un problema. +¿Tiene habitaciones libres con televisión, aire acondicionado y caja fuerte? +¿Le importaría mostrarnos una habitación con televisión? +¿Tiene teléfono? +Voy a marcharme el dos a las ocho de la noche. +¿Cuánto cuesta una habitación individual por semana? +¿Acepta dinero en efectivo? +Mi nombre es Victoria Piquer. +¿Les importaría subirme los bultos a la habitación tres diez? +¿Aceptan dinero en efectivo? +Hay una equivocación en mi cuenta. +Por favor, me detalla la cuenta. +Deseo reservar una habitación doble para una noche. +¿Tiene teléfono? +¿Nos podrían despertar a las cinco en punto, por favor? +Me tengo que ir el martes siete de marzo por la mañana. +Hemos hecho una reserva, por favor. +Por favor, ¿nos podrían despertar a las doce? +¿Nos pueden llevar nuestro equipaje al taxi? +Tengo una reserva a nombre de Julia Calatayud. +Por favor, tengo reservada una habitación. +Por favor, una habitación con teléfono y vistas a nombre de la señora Ramírez. +Por favor, ¿pueden subirnos ustedes las bolsas a la habitación? +He reservado una habitación a nombre del señor Roda. +¿Cuánto cuesta una habitación doble por día con media pensión? +¿Están apuntados en la cuenta todos los gastos? +Pienso que existe una equivocación. +Deseamos que suba nuestra maleta a la habitación, por favor. +Desearía una habitación. +Prepare la cuenta. +Quisiera una habitación doble y tranquila, por favor. +Por favor, haga la cuenta. +Queremos que nos lleven nuestro equipaje a nuestra habitación, por favor. +¿Nos podrían despertar a las siete, por favor? +¿Podríamos ver alguna habitación? +¿Podría despertarnos mañana a las nueve menos cuarto, por favor? +Súbame las maletas al autobús. +Quisiera una habitación hasta el día veinte, por favor. +¿Podríamos reservar dos habitaciones? +¿Hay alguna habitación tranquila libre? +Tengo reservada una habitación tranquila con televisión y una buena vista de la montaña a nombre de Rosario Cantero. +¿Tiene libre una habitación doble? +Hice una reserva, por favor. +¿Está apuntado el recibo del teléfono? +¿Puede darnos usted la llave de la habitación número dos nueve cuatro, por favor? +¿Podría llamar a un taxi? +La habitación es muy fría. +He hecho una reserva. +¿Le importaría mostrarnos otra habitación? +Quisiéramos que subiese nuestras maletas a nuestra habitación. +¿Podría cambiarnos de habitación? +¿Me quieren llamar a un taxi? +La habitación es demasiado calurosa. +¿Le importaría subirme las bolsas de viaje a la habitación? +Desearía reservar una habitación con aire acondicionado para veinte días, por favor. +Por favor, ¿podría ver alguna habitación tranquila? +Despiérteme a las dos y cuarto. +¿Podríamos ver una habitación, por favor? +Tengo reservada una habitación hasta el próximo viernes, por favor. +Voy a marcharme el viernes. +Déme la llave de la habitación número uno cuatro nueve, por favor. +Me voy a ir hoy mismo a las ocho de la mañana. +Tengo hecha la reserva de una habitación con buena vista de la montaña y cuarto de baño a nombre de Pilar Jiménez. +Por favor, repase la factura. +¿Tiene alguna habitación libre con televisión, aire acondicionado y servicio de bar? +¿Me podrían despertar mañana a las dos en punto? +Hemos reservado una habitación doble hasta pasado mañana. +Por favor, ¿me podría llamar a un taxi? +Por favor, quisiera que me despertara mañana a las cuatro. +Quiero una habitación para una noche, por favor. +¿Podría pedirnos un taxi?, por favor. +Deseo reservar una habitación individual para veinticinco noches. +Tengo una reserva. +¿A qué día estamos? +Por favor, haga la cuenta. +Tengo reservada una habitación individual. +Por favor, reservé una habitación a nombre del señor y la señora Tena. +Hemos hecho una reserva, por favor. +¿Está todo? +Por favor, nos llama a un taxi. +Lleve nuestro equipaje. +¿Les importaría darnos la llave de la habitación? +Hice la reserva de una habitación doble a nombre de Miguel Ramírez. +Por favor, hemos reservado una habitación tranquila. +Por favor, ¿me puede dar la llave de la habitación? +¿Está apuntado el recibo del teléfono? +Por favor, hice una reserva. +Quiero una habitación con aire acondicionado para hoy. +¿Le importaría cambiarme de habitación? +Tenemos reservadas dos habitaciones con teléfono, por favor. +Por favor, reservé una habitación doble con teléfono para hoy. +¿Hay aire acondicionado en mi habitación, por favor? +He reservado una habitación. +¿Le importaría llevarnos las bolsas de viaje a la estación? +He reservado una habitación doble tranquila a nombre de Enrique Velasco. +¿Podría bajar mis bolsas? +Por favor, ¿le importaría darnos la llave de nuestra habitación? +Por favor, quisiéramos una habitación doble para una noche. +Por favor, quisiera cambiarme a otra habitación con televisión. +¿Tienen libre alguna habitación tranquila? +He reservado una habitación con teléfono. +Por favor, lléveme los bultos a mi habitación. +¿Está apuntado el recibo del teléfono? +Lleve mi equipaje a la estación. +Por favor, ¿querrían llamarnos a nuestro taxi? +¿Cuánto cuesta una habitación individual con media pensión? +La habitación es demasiado fría. +¿Me podrían llevar el equipaje al autobús? +Hicimos una reserva, por favor. +¿Podrían hacer nuestra cuenta?, por favor. +He reservado una habitación tranquila doble a nombre de Silvia Quereda. +Me llamo Jesús Rivera. +Tengo hecha una reserva a nombre de Sergio Moliner. +¿Tiene una habitación libre? +Por favor, pídame un taxi. +Prepárenos nuestra cuenta de la habitación seiscientos nueve. +¿Les importaría bajar nuestro equipaje a la habitación? +¿Me podría pedir un taxi? +Me gustaría reservar una habitación hasta el veinticinco. +Por favor, quiero reservar una habitación doble con teléfono. +¿Podrían despertarme a las dos? +Por favor, ¿pueden ustedes despertarnos a las once? +¿Tiene alguna habitación libre? +La habitación es demasiado fría. +¿Podría llamarme a un taxi?, por favor. +¿Cuánto vale una habitación individual para un día con pensión completa? +Por favor, ¿podría despertarme a la una en punto? +Tengo la reserva de una habitación tranquila doble con televisión y vistas. +¿Podrían llevarnos nuestras maletas a la número ocho diecinueve, por favor? +Perdone. +Por favor, tengo reservada una habitación doble tranquila con tele y teléfono. +¿Podrían ustedes despertarme a las once menos cuarto? +Me he de ir esta tarde. +Se ha producido una equivocación en la cuenta. +Nos gustaría cambiarnos de habitación, por favor. +Me parece que se produjo una equivocación en la cuenta de la habitación ocho siete cuatro. +¿Cuánto vale una habitación individual incluyendo desayuno, por favor? +Por favor, ¿me podría usted despertar a las tres y media? +La habitación es muy fría. +¿Le importaría darme la llave de la habitación? +He reservado una habitación. +Me gustaría cambiar mi habitación. +Mi nombre es Sergio Iborra. +Por favor, tengo hecha una reserva a nombre del señor Miralles. +Tengo una reserva a nombre del señor Ortiz. +Tenemos que marcharnos el sábado siete de marzo. +Por favor, ¿nos puede despertar a las diez y media? +Querría que nos bajasen el equipaje a nuestra habitación, por favor. +¿Cuánto vale una habitación individual para una noche? +Por favor, ¿cuánto vale por día una habitación doble? +Quisiera una habitación doble. +Quiero que me dé la llave de la número trescientos treinta y tres. +Por favor, reservé una habitación. +¿Está incluido el desayuno? +La habitación es muy cara. +Nos vamos a ir el día trece de septiembre a las ocho menos cuarto de la mañana. +Por favor, ¿me puede despertar a las once y media? +¿Le importaría llevarme mis bolsas al autobús? +Vamos a marcharnos mañana a las cuatro. +Pienso que se ha producido un error en la cuenta. +¿Le importaría que echara un vistazo a alguna habitación? +Por favor, quiero que nos bajen los bultos a la habitación. +¿Me podrían dar las llaves de la habitación seiscientos trece, por favor? +Por favor, ¿cuánto cuesta una habitación doble incluyendo servicio de habitaciones? +Por favor, ¿me pueden detallar la cuenta de la habitación cero catorce? +La habitación está bien. +Hice una reserva. +He hecho la reserva de una habitación doble tranquila con teléfono y ducha. +Hemos de marcharnos mañana por la noche. +¿Hay televisión y aire acondicionado en la habitación? +Despiérteme mañana a las diez y media, por favor. +Por favor, denme la llave de la habitación número nueve uno cero. +Hemos reservado una habitación doble con baño para hoy. +¿Tiene aire acondicionado, teléfono y televisión? +Se han equivocado en nuestra cuenta. +¿Podría ver alguna habitación individual con aire acondicionado? +¿Cuánto vale una habitación doble? +¿Podría ver alguna habitación doble, por favor? +¿Hay alguna habitación tranquila libre? +Hice la reserva de una habitación con tele y teléfono a nombre de Roberto Arnau. +He reservado una habitación con televisión y baño a nombre de Gerardo Ródenas. +Por favor, desearía una habitación. +Tenemos reservada una habitación. +Nos vamos a ir el jueves treinta de septiembre a las cuatro y media. +¿Podría ver una habitación doble con televisión? +¿Está todo? +¿Podrían ustedes darnos la llave de la habitación, por favor? +¿Pueden darme la llave de la habitación número setecientos setenta y tres? +¿Querrían hacernos la factura?, por favor. +Tenemos que irnos el jueves nueve de abril por la tarde. +Me voy a marchar hoy a las seis de la mañana. +Reservé una habitación doble y tranquila, por favor. +Por favor, reservé una habitación tranquila a nombre de Amelia Peinado. +Por favor, ¿me querría pedir un taxi para la habitación nueve ocho uno? +¿Cuánto cuesta una habitación doble, por favor? +Por favor, ¿querría pedirnos un taxi? +¿Podría detallar nuestra cuenta de la habitación nueve cuatro uno? +¿Está todo? +Por favor, ¿me pueden preparar mi cuenta? +He hecho la reserva de una habitación tranquila doble con vistas, ducha y teléfono a nombre de Carmelo Peris. +Por favor, ¿me podría dar usted la llave de la habitación? +Por favor, ¿podríamos ver otra habitación? +¿Nos pueden llevar las bolsas de viaje? +Por favor, desearía cambiarme a otra habitación con menos ruido. +¿Podrían despertarnos mañana a las nueve y cuarto? +Por favor, quisiera reservar una habitación. +¿Podríamos reservar dos habitaciones dobles para quince días? +¡No importa! +¿Podríamos reservar dos habitaciones? +¿Tienen alguna habitación doble libre? +Por favor, prepare la factura. +Por favor, desearía una habitación. +¿Está incluido el servicio de habitaciones? +Nos iremos esta noche. +Suban nuestro equipaje a nuestra habitación. +Me llamo Federico Viciano. +He reservado una habitación tranquila. +Por favor, tengo una reserva a nombre de la señora Guijarro. +¿Les importaría despertarnos a la una y media? +¿Tiene habitaciones individuales y tranquilas libres? +Nos tenemos que ir mañana. +Tengo reservada una habitación. +Por favor, hágame la cuenta. +¿Podría ver una habitación doble y tranquila, por favor? +Se ha equivocado en la factura. +Por favor, he hecho la reserva de una habitación con televisión, teléfono y vistas al mar a nombre de Asunción Espinosa. +¿Tiene aire acondicionado y agua caliente la habitación? +Quiero reservar una habitación hasta el próximo sábado. +¿Nos podrían llamar a un taxi para la habitación tres trece? +Quiero una habitación. +¿Pueden despertarme a la una menos cuarto? +Por favor, una habitación. +Me parece que se produjo un error en la cuenta. +Desearía una habitación para cinco noches. +Hemos reservado una habitación individual con teléfono a nombre del señor y la señora Santos, por favor. +¿Están incluidos todos los impuestos? +¿Está incluida la cuenta del teléfono? +Por favor, lleven nuestra bolsa de viaje a la habitación quinientos veintisiete. +He reservado una habitación tranquila. +Pida un taxi. +¿Nos pueden dar ustedes la llave de la habitación? +¿Nos podría llevar las bolsas al coche? +Tengo hecha una reserva a nombre de Susana Padilla. +Por favor, ¿pueden bajarnos los bultos a la habitación? +¿Le importaría bajar nuestro equipaje a la habitación, por favor? +Por favor, ¿cuánto cuesta una habitación doble por semana? +Despiértenme a la una y media, por favor. +Nos hemos de marchar mañana a las seis. +Por favor, tengo hecha una reserva. +La habitación es demasiado ruidosa. +Deseo que nos dé las llaves de la habitación siete dieciséis, por favor. +¿Está todo apuntado? +Tengo reservada una habitación doble, por favor. +Por favor, me gustaría reservar una habitación individual hasta el veintiuno. +Por favor, ¿me puede usted despertar mañana a las tres menos cuarto? +Despiértenos a la una, por favor. +Me tengo que ir el lunes dos de julio por la tarde. +Por favor, ¿tengo que rellenar alguna hoja de registro? +¿Podría ver alguna habitación? +Pienso que se produjo un error en la cuenta. +La habitación es muy cara. +Por favor, desearíamos que nos diera las llaves de la habitación cuatro tres. +¿Nos podría explicar la cuenta?, por favor. +Por favor, ¿nos podrían dar ustedes las llaves de la doscientos veintiséis? +¿Cuánto cuesta una habitación individual, por favor? +¿Podríamos reservar dos habitaciones para esta noche? +¿Nos podría despertar a la una, por favor? +Me parece que existe un problema en mi cuenta de la habitación nueve treinta y tres. +¡No! +Mi nombre es Marina Varela. +Por favor, deseo cambiarme de habitación. +Por favor, las llaves de la habitación número ocho veinte. +¿Están apuntados en el recibo los gastos? +Me voy hoy. +¿Les importaría darnos las llaves de la habitación? +Por favor, ¿tienen aire acondicionado las habitaciones? +¿Pueden subir el equipaje al coche? +¿Les importaría darnos la llave de la habitación? +¿Podría bajar mis maletas a mi habitación? +Deseo una habitación que tenga teléfono, vistas, televisión y baño a nombre de Marina Sáez. +Por favor, tengo la reserva de una habitación tranquila doble con vistas a la ciudad y baño a nombre de Ricardo Salsas. +Por favor, ¿tenemos que firmar la hoja de registro? +¿Nos podrían despertar mañana a las seis y media? +He de marcharme el viernes diecinueve de abril a las nueve de la noche. +Pienso que se ha equivocado en la cuenta. +Por favor, me gustaría cambiarme de habitación. +¿Está apuntado el teléfono? +Por favor, ¿me puede usted despertar a las dos menos cuarto? +Vamos a marcharnos el día siete a las once y media de la noche. +Desearía que nos despertasen a las tres y media, por favor. +Hemos de irnos mañana a las nueve. +¿Hay servicio de bar en la habitación? +Reservamos una habitación hasta el próximo jueves, por favor. +Por favor, ¿le importaría mostrarme una habitación doble con televisión? +Creo que hay un error en la factura de la habitación ocho tres ocho. +Por favor, háganos la cuenta de la habitación novecientos uno. +Quisiera reservar una habitación individual y tranquila hasta el uno de noviembre, por favor. +Por favor, he reservado una habitación tranquila individual con vistas a la montaña y televisión a nombre de la señora Gómez. +Por favor, he hecho una reserva. +¿Podría reservar una habitación? +Vamos a marcharnos el lunes diecinueve de abril por la mañana. +Tengo reservada una habitación tranquila. +Por favor, me hace mi cuenta. +Tengo que irme hoy a las once y media de la mañana. +¿Podrían preparar la cuenta?, por favor. +¿Tienen libre alguna habitación? +Creo que se ha equivocado en nuestra cuenta de la habitación quinientos quince. +Por favor, quisiera reservar una habitación. +¿Tienen una habitación libre? +¿Están anotados en el recibo los extras? +Tengo reservada una habitación. +Hemos hecho una reserva. +Por favor, ¿pueden pedirme mi taxi para la habitación setecientos dieciséis? +¿Puede despertarme a las cuatro y cuarto? +¿Están incluidos en la factura todos los impuestos? +¿Está incluido el desayuno? +Reservé una habitación a nombre del señor Gerardo Paches. +He reservado una habitación individual a nombre del señor Fernández. +Me iré el dieciocho a las siete menos cuarto de la mañana. +Por favor, ¿nos podría dar la llave de la seis cuatro siete? +¿Podríamos ver una habitación, por favor? +¿Pueden llevarnos nuestro equipaje al autobús? +Me marcharé el viernes uno a las tres. +¿Pueden ustedes bajarme mis bultos a la habitación? +¿Cuánto vale una habitación doble por día, por favor? +En la habitación hay mucho ruido. +¿Está incluida la cuenta del teléfono? +La habitación está bien. +Por favor, ¿hay agua caliente en las habitaciones? +¿Le importaría cambiarme de habitación? +¿Me sube mis bolsas de viaje al taxi? +Por favor, querríamos que nos despertaran a las ocho menos cuarto. +En la habitación hace mucho calor. +Queremos cambiar la habitación. +Súbame mis bolsas al autobús. +¿Tiene aire acondicionado mi habitación? +Despiérteme a las seis. +Voy a irme mañana a las tres menos cuarto de la tarde. +¿Hay habitaciones libres? +¿Podría cambiarnos a otra habitación con teléfono y televisión? +No importa. +¿Hay teléfono y televisión en la habitación? +He de marcharme hoy. +Vamos a marcharnos esta mañana. +Por favor, ¿le importaría mostrarnos una habitación con teléfono y televisión? +Lleve el equipaje. +¿Hay aire acondicionado en las habitaciones? +¿Podría subir mis bultos a mi habitación? +No estoy de acuerdo. +He reservado una habitación individual, por favor. +Quisiera reservar una habitación para un día, por favor. +¿Nos podría dar usted la llave de mi habitación? +¿Me puede dar la llave de la habitación, por favor? +Por favor, he hecho una reserva. +Me tengo que marchar mañana por la mañana. +¿Tengo que rellenar la hoja de registro, por favor? +¿Haría el favor de cambiarme de habitación? +Por favor, ¿puede darme las llaves de la cero tres cero? +¿Nos puede bajar nuestras bolsas de viaje a la habitación número cuatro veintitrés, por favor? +Deseo reservar una habitación individual y tranquila para una semana, por favor. +Por favor, explique la cuenta. +Por favor, ¿podrían pedirnos un taxi para la habitación siete veintinueve? +Por favor, tengo reservada una habitación para esta noche a nombre de Manuela Valls. +Por favor, querría que nos diera la llave de la habitación uno uno. +Por favor, ¿pueden bajar nuestros bultos a la habitación número cuatrocientos catorce? +Me gustaría cambiarme de habitación, por favor. +Por favor, hemos reservado una habitación individual y tranquila. +Por favor, suban mi bolsa de viaje a la habitación seiscientos treinta y uno. +¿Puede pedir un taxi? +Por favor, ¿puede pedir un taxi? +Por favor, ¿podrían hacer la cuenta de la habitación seiscientos veintiséis? +Dénos la llave de la número ocho catorce. +Quiero que me suba los bultos a la habitación, por favor. +Déme la llave de la habitación seis dieciocho, por favor. +¿Nos podrían dar la llave de la habitación número seis cuatro cero? +¿Podríamos ver una habitación tranquila, por favor? +¡Sí! +Llévenos nuestros bultos a la número ochocientos veintiséis, por favor. +¿Nos podría bajar el equipaje a la habitación número tres seis dos? +Por favor, he reservado una habitación tranquila hasta mañana a nombre de Gregorio Cabedo. +Nos marchamos hoy a las seis y media de la tarde. +Por favor, ¿le importaría llevar nuestras bolsas de viaje a la habitación número dos tres cinco? +Hicimos una reserva. +Por favor, ¿me podrían detallar la cuenta? +Me gustaría cambiarme a otra habitación con servicio de bar y aire acondicionado, por favor. +Quisiéramos que nos despertara a las once y cuarto. +Quisiéramos que nos despertase a las nueve en punto. +Reservé una habitación, por favor. +¿Podría cambiarnos a otra habitación con televisión? +Tengo que irme mañana a las diez en punto de la mañana. +¿Pueden explicar la cuenta? +Por favor, suba mi equipaje a mi habitación. +¿Nos pueden llevar nuestro equipaje al autobús? +¿Tenemos que firmar la hoja de registro? +Desearía que me despertara mañana a las diez, por favor. +Reservamos una habitación doble, por favor. +Vamos a marcharnos mañana a las cinco en punto de la tarde. +¿Hay aire acondicionado en la habitación? +Por favor, ¿le importaría darme la llave de la habitación trescientos treinta y tres? +Me voy a ir mañana a las cuatro y media de la tarde. +Nos tenemos que ir el lunes cuatro de abril a las doce y media de la mañana. +Por favor, ¿qué precio tiene una habitación doble por día con media pensión? +En la habitación hace demasiado calor. +¿Cuánto cuesta una habitación doble? +Por favor, ¿le importaría mostrarnos una habitación con teléfono? +¿Cuánto cuesta una habitación individual por día? +He de marcharme. +¿Me lleva mis bolsas? +Por favor, ¿cuánto cuesta una habitación doble para dieciocho días? +¿Nos puede despertar mañana a las cinco en punto? +¿Están incluidos en el recibo todos los gastos? +Tengo hecha la reserva de una habitación doble con baño y teléfono a nombre de Paloma Betoret. +Querría que me diera las llaves de la habitación dos treinta y nueve. +¿Podrían repasarme la cuenta? +Quiero que suba mi equipaje a mi habitación, por favor. +¿Nos pueden dar la llave de la habitación número uno cuatro cero, por favor? +¿Les importaría darme las llaves de la habitación, por favor? +¿Nos podría usted despertar a las seis menos cuarto? +Por favor, ¿cuánto vale una habitación individual? +¿Podríamos reservar dos habitaciones tranquilas para esta noche? +Por favor, tengo reservada una habitación individual y tranquila. +La habitación es muy cara. +Me parece que se produjo un problema en la cuenta. +Quiero una habitación doble para hoy. +Quiero una habitación individual. +Reservé una habitación a nombre de Alicia Morales, por favor. +Conforme. +Por favor, déme la llave de nuestra habitación. +Por favor, quisiéramos una habitación. +Me gustaría reservar dos habitaciones dobles, por favor. +Me voy a ir mañana a las diez menos cuarto de la noche. +Quisiera cambiarme de habitación. +La habitación es muy calurosa. +Hice la reserva de una habitación tranquila individual con buena vista del mar, teléfono y televisión. +¿Le importaría cambiarnos de habitación? +Tenemos reservada una habitación individual hasta el diecisiete. +Por favor, tengo una reserva. +¿Aceptan cheques de viaje? +Tenemos reservada una habitación, por favor. +¿Cuánto? +Por favor, ¿cuánto vale por día una habitación individual? +¿Tienen libre una habitación doble y tranquila? +Por favor, ¿nos quiere preparar la factura? +Por favor, ¿nos puede despertar a las cuatro? +Por favor, hemos reservado una habitación doble. +La habitación está bien. +Por favor, ¿podría repasar la cuenta? +Por favor, llame a mi taxi. +Quisiera que nos diesen la llave de mi habitación. +Quiero que nos despierte a las nueve y media. +Por favor, desearía una habitación tranquila doble que tenga teléfono, buena vista de la montaña, baño y televisión a nombre de la señora Berrueco. +Pídame mi taxi, por favor. +Por favor, pídame un taxi. +Me parece que se ha producido un error en la cuenta. +La habitación es demasiado fría. +Por favor, llámeme a mi taxi. +¿Cuánto cuesta por semana una habitación individual? +¿Le importaría que echara un vistazo a alguna habitación doble? +La habitación está bien. +Llévennos el equipaje a nuestra habitación. +¿Podría llevarme mis maletas? +Deseo una habitación para veintinueve días. +¿Tengo que rellenar la hoja de registro? +Deseo una habitación. +Quisiéramos una habitación individual hasta el próximo viernes. +Dennos la llave de la habitación número siete cero cinco. +¿Podría pedir un taxi? +Hemos de marcharnos el sábado catorce de mayo. +Prepare nuestra cuenta. +Me tengo que marchar mañana a las cinco menos cuarto de la tarde. +Quiero una habitación. +Existe una equivocación en la cuenta. +¿Tienen libre una habitación individual? +¿Hay una habitación libre? +Tenemos reservada una habitación individual a nombre de Luis Llopis. +Deseamos una habitación doble con ducha y aire acondicionado. +Por favor, tenenos hecha una reserva. +¿Está incluido el recibo del teléfono? +Por favor, déme la llave de la habitación. +Creo que se ha equivocado en nuestra cuenta. +Tengo la reserva de una habitación tranquila doble con televisión, cuarto de baño y una buena vista del mar. +¿Les importaría despertarme a las diez y media, por favor? +Por favor, haga la cuenta. +Tengo reservada una habitación a nombre de Jesús Barberá. +Quisiera una habitación para un día, por favor. +Por favor, ¿podría llamarme a un taxi? +Por favor, deseo que lleve mis bultos a mi habitación. +¿Hay televisión en mi habitación? +Por favor, reservé una habitación tranquila para veintiséis noches a nombre de Celestino Puig. +Me voy el dieciséis de septiembre a las doce menos cuarto de la mañana. +¿Cuánto cuesta por semana una habitación individual incluyendo desayuno? +Por favor, suban nuestra bolsa de viaje a la habitación número uno setenta y cuatro. +Por favor, prepare la cuenta. +Me he de ir el tres a las diez y cuarto de la mañana. +¿Tienen libre alguna habitación? +Por favor, tengo reservada una habitación tranquila con cuarto de baño, teléfono y televisión. +Despiértennos a las seis y cuarto. +¿Podríamos ver alguna habitación doble? +¿Podrían ustedes despertarnos a las seis y media? +Me parece que se han equivocado en la cuenta. +Quisiera que me diese la llave de la habitación, por favor. +Por favor, pida un taxi. +¿Tiene habitaciones libres? +Hemos reservado una habitación para diez semanas a nombre de Rosario Cornelles. +Por favor, reservamos una habitación tranquila. +¿Están incluidos en el recibo todos los extras? +Por favor, nos gustaría cambiarnos de habitación. +¿Podríamos ver una habitación? +¿Cuánto cuesta por semana una habitación doble incluyendo servicio de habitaciones, por favor? +Desearía una habitación con teléfono, por favor. +Por favor, reservamos dos habitaciones dobles con televisión. +¿Me pueden dar la llave de la habitación cero uno nueve? +Déme la llave de la habitación, por favor. +Existe un problema en la factura. +¿Está apuntada la cuenta del teléfono? +Voy a marcharme. +¿Me podría dar la llave de la quinientos uno? +Hemos de irnos hoy por la tarde. +¿Querrían pedirme un taxi?, por favor. +¿Podría bajar nuestro equipaje a recepción? +Por favor, ¿pueden ustedes subir mis bultos a la siete veintiocho? +¿Nos podría dar la llave de la habitación? +Hemos de irnos el día catorce por la noche. +Queremos una habitación para nueve noches, por favor. +Dénos las llaves de la habitación. +Deseo una habitación que tenga teléfono, televisión y ducha, por favor. +Reservé una habitación doble. +Por favor, me prepara la cuenta. +Lleven nuestras maletas a la habitación nueve veintiséis, por favor. +¿Cuánto vale una habitación individual por semana? +Por favor, quisiera una habitación para una semana. +Quisiera reservar una habitación, por favor. +Hice una reserva. +¿Podría hacer la factura? +Suba mi equipaje a la habitación número cero tres cinco. +La habitación es demasiado fría. +Nos prepara nuestra cuenta de la habitación tres cuatro uno, por favor. +Creo que hay un problema. +Por favor, deseo que nos dé las llaves de la habitación cero uno cero. +He hecho la reserva de una habitación individual a nombre de Dulce Gumbau. +Reservamos una habitación. +Por favor, ¿nos podrían dar la llave de la habitación número seis? +Por favor, ¿nos podrían hacer la cuenta? +¿Cuánto vale por día una habitación individual? +Por favor, hice una reserva a nombre de Roberto Vázquez. +¿Tienen libre alguna habitación con teléfono y televisión? +Súbanos nuestros bultos a la tres cuatro cero, por favor. +¿Me lleva el equipaje al coche? +Por favor, ¿qué precio tiene una habitación doble con pensión completa? +Quiero una habitación doble para hoy. +Tenemos que marcharnos hoy a las doce de la mañana. +Por favor, lleve mi bolsa de viaje a mi habitación. +Pida un taxi. +¿Cuánto vale una habitación individual? +¿Nos puede usted dar las llaves de mi habitación? +Por favor, deseo que me despierten mañana a las dos y media. +¿Les importaría subir mi equipaje a la habitación cuatro noventa, por favor? +¿Nos quieren hacer la factura? +¿Me querrían preparar la cuenta? +Por favor, he hecho una reserva. +Quiero una habitación individual y tranquila hasta mañana. +¿Podría usted llevarme mi maleta a mi habitación? +¿Les importaría despertarme a las tres y cuarto, por favor? +¿Puede darnos las llaves de la habitación número nueve dos siete? +He reservado una habitación individual con televisión, por favor. +Desearía que me llevasen mi bolsa a la habitación número ocho cero tres. +¿Cuánto cuesta una habitación individual? +¿Hay televisión en las habitaciones? +Por favor, quiero que lleve mi equipaje a la número siete tres tres. +Tengo una reserva. +¿Podría cambiarme de habitación? +¿Le importaría llevarnos nuestras maletas al taxi? +Por favor, ¿nos pueden despertar a las nueve? +Por favor, he reservado dos habitaciones. +¿Me pueden dar ustedes la llave de la habitación? +¡Adiós! +¿Puede darnos la llave de la habitación? +¿Pueden despertarme a la una? +¿Les importaría darnos la llave de la habitación, por favor? +Tenemos reservada una habitación individual y tranquila. +Deseo que nos dé la llave de la habitación novecientos once, por favor. +Por favor, ¿nos pueden ustedes dar la llave de mi habitación? +Voy a marcharme. +Tenemos que irnos esta tarde. +¿Le importaría subir mis bolsas de viaje al autobús? +¿Nos podrían dar la llave de la número cuatro siete uno, por favor? +Quiero una habitación individual y tranquila hasta mañana, por favor. +¿Podríamos reservar dos habitaciones? +Tengo hecha la reserva de una habitación con teléfono y ducha a nombre del señor Borillo. +Por favor, nos pide nuestro taxi. +Tenenos hecha una reserva. +Por favor, ¿me pueden preparar la cuenta de la habitación uno uno uno? +¿Le importaría llevar nuestro equipaje a nuestra habitación, por favor? +Por favor, quiero que lleve mi equipaje a la habitación seis catorce. +¿Le importaría mostrarnos alguna habitación tranquila, por favor? +Por favor, he hecho la reserva de una habitación con televisión, una buena vista y ducha a nombre de Virginia Pérez. +Pienso que hay una equivocación en la factura. +Me voy a ir el jueves por la mañana. +Reservamos una habitación individual y tranquila para treinta días a nombre de Lidia Llorens, por favor. +En la habitación hay mucho ruido. +Tenemos reservadas dos habitaciones tranquilas. +¿Le importaría mostrarnos una habitación? +Deseo una habitación con cuarto de baño, televisión y buena vista a nombre de Jorge Balaguer, por favor. +¿Tiene televisión? +¿Podríamos ver alguna habitación individual y tranquila? +Me parece que se produjo una equivocación en la cuenta. +En la habitación hace mucho calor. +Tengo que irme mañana a las dos y cuarto de la tarde. +¿Hay aire acondicionado en las habitaciones? +¿Nos pueden despertar a la una menos cuarto? +Reservamos una habitación doble para veintinueve días. +¿Podríamos reservar dos habitaciones individuales y tranquilas hasta el veintiocho? +¿Pueden llamarme a un taxi? +Deseo que me despierten a las siete y media. +Por favor, ¿me podría repasar la cuenta? +¿Tienen habitaciones tranquilas libres? +Me parece que se produjo un problema en la cuenta de la habitación nueve seis cuatro. +Denme las llaves de la habitación, por favor. +Llámenos a nuestro taxi para la habitación dos seis ocho. +¿Pueden darnos la llave de la habitación? +Déme la llave de la habitación cuatro uno tres. +¿Podrían llevarnos nuestro equipaje a recepción? +Por favor, desearíamos una habitación. +¿Cuánto vale por semana una habitación doble, por favor? +Por favor, ¿nos podrían despertar mañana a las nueve y media? +Reservamos una habitación individual para una noche a nombre de Micaela Carpio. +Por favor, pida nuestro taxi para la habitación ciento veintiocho. +¿Cuánto cuesta por día una habitación doble con pensión completa? +Despiértenme a la una y cuarto. +Por favor, tengo reservada una habitación con buena vista y teléfono. +¿Le importaría darnos las llaves de la habitación, por favor? +He de irme hoy a las ocho y cuarto de la mañana. +¿Nos puede pedir un taxi para la habitación cero diecinueve? +Creo que existe un error. +Queremos una habitación. +Tengo que irme el jueves veintiocho de octubre a las ocho en punto de la mañana. +¿Podría despertarme a las diez y media, por favor? +Quisiera que me despertara a la una, por favor. +Nos iremos el once. +¿Cuántas? +Tengo una reserva a nombre del señor Borrás. +¿Pueden llevarme las maletas al autobús? +Se produjo una equivocación en mi cuenta. +¿Podría ver una habitación, por favor? +Por favor, haga la factura de la habitación nueve catorce. +¿Podrían subir nuestros bultos a la cuatrocientos setenta y cuatro? +¿Tienen habitaciones tranquilas libres? +He reservado una habitación hasta el día uno de noviembre a nombre del señor Víctor Lobo, por favor. +¿Están apuntados los extras? +Tenemos reservada una habitación hasta el próximo domingo a nombre del señor Ángel Viciano. +¿Nos podría dar la llave de mi habitación, por favor? +Por favor, ¿pueden hacerme la factura de la habitación doscientos doce? +Por favor, ¿me podría bajar el equipaje a la habitación? +¿Podríamos reservar dos habitaciones individuales para hoy? +¿Tiene libre alguna habitación individual y tranquila? +Déme la llave de la habitación número tres diez. +Hemos reservado una habitación para hoy. +En la habitación hay demasiado ruido. +Nos hemos de ir el día uno por la mañana. +Desearía una habitación individual y tranquila, por favor. +Quisiéramos una habitación doble y tranquila. +Quiero que me despierten mañana a las doce menos cuarto. +Por favor, ¿podría usted despertarnos a la una y cuarto? +Vamos a irnos el día quince a las nueve menos cuarto de la mañana. +¿Están apuntados los impuestos? +Por favor, me llama a un taxi. +¿Me baja las bolsas de viaje a recepción? +Por favor, nos hace la cuenta de la habitación siete treinta y dos. +Tengo reservada una habitación para dieciocho días a nombre del señor y la señora Cabo. +¿Hay habitaciones libres con baño? +Por favor, ¿pueden hacernos la cuenta? +Reservé una habitación doble y tranquila con televisión para esta noche a nombre de la señorita Marina Miralles, por favor. +Creo que se produjo un problema en la cuenta de la habitación siete ocho seis. +¿Tienen habitaciones libres con teléfono? +Voy a marcharme hoy mismo por la tarde. +Hemos de marcharnos hoy mismo a las doce de la mañana. +Hemos de marcharnos el lunes por la noche. +Deseo una habitación con tele, ducha y teléfono. +Reservé una habitación para hoy a nombre del señor Rafael Soler. +¿Podría reservar una habitación doble? +Por favor, deseamos una habitación hasta el día veintiocho. +¿Tiene libre una habitación individual y tranquila? +Por favor, desearíamos cambiarnos a otra habitación con televisión y cuarto de baño. +¿Tiene habitaciones individuales y tranquilas libres? +¿Podría cambiarnos de habitación? +¿Están anotados todos los impuestos? +Pídame un taxi. +Tengo reservada una habitación a nombre del señor Ortiz. +Vamos a marcharnos el domingo a las nueve en punto de la mañana. +¿Nos querrían llamar a un taxi? +¡Muchas gracias! +¿Podría bajar nuestra maleta a nuestra habitación? +Tengo una reserva. +¿Pueden despertarme ustedes mañana a la una y cuarto? +Por favor, nos hace la cuenta de la habitación cuatrocientos diecinueve. +Existe una equivocación. +Por favor, hemos hecho una reserva. +Por favor, lleve mis bolsas de viaje a la habitación. +¿Tiene libre una habitación tranquila? +Tenemos reservadas dos habitaciones para una noche. +¿Me podrían repasar mi factura? +Por favor, tengo la reserva de una habitación tranquila. +¿Nos podría dar las llaves de la habitación número cinco quince, por favor? +Por favor, queremos reservar una habitación con aire acondicionado. +Tengo hecha la reserva de una habitación a nombre de Teresa Martínez. +Por favor, ¿me podría llamar a mi taxi? +He reservado una habitación con ducha, tele y teléfono a nombre de Emilio Paches. +Por favor, ¿nos podría dar la llave de la habitación cinco nueve? +¿Está todo incluido? +He hecho la reserva de una habitación a nombre del señor Ramos. +Me parece que existe una equivocación en mi cuenta de la habitación tres treinta y nueve. +¿Hay aire acondicionado en la habitación? +Nos hemos de marchar el catorce a la una y cuarto de la tarde. +Pienso que existe una equivocación en la cuenta de la habitación setecientos diecinueve. +Despiértenos a la una menos cuarto, por favor. +Pienso que existe una equivocación en la cuenta. +¿Podría subirnos el equipaje al taxi? +Deseamos reservar una habitación doble para esta noche. +¿Aceptan dinero en efectivo? +¿Me podrían subir el equipaje al coche? +Tengo reservada una habitación a nombre de Sergio Orenga. +Por favor, ¿podrían llamarme a un taxi para la habitación ciento noventa? +Por favor, querríamos que nos diera la llave de la habitación. +¿Hay teléfono en nuestra habitación? +¿Puede detallarnos la cuenta? +Por favor, ¿nos pueden ustedes dar la llave de mi habitación? +¿Hay una habitación individual libre? +Tenemos que irnos. +Por favor, ¿me pueden dar la llave de la número doscientos catorce? +¿Haría el favor de cambiarme de habitación? +¿Puede subirnos nuestro equipaje al coche? +Deseo una habitación tranquila. +Despiértenos mañana a las seis menos cuarto, por favor. +Quiero una habitación con televisión, teléfono y agua caliente hasta el día veintisiete. +Por favor, despiértenos a la una en punto. +Por favor, he reservado una habitación tranquila a nombre de Tomás Fernández. +¿Puede darnos la llave de la habitación número dos cinco nueve, por favor? +Por favor, despiértennos a la una y cuarto. +Por favor, he reservado una habitación. +Por favor, dennos las llaves de la habitación número seis cuatro uno. +Por favor, tengo hecha la reserva de una habitación con televisión y teléfono a nombre de la señorita Calleja. +Por favor, reservé una habitación con tele, una buena vista y teléfono. +Querría que nos despertaran mañana a las seis menos cuarto, por favor. +Quisiera cambiarme de habitación. +Por favor, queremos cambiar la habitación. +¿Tienen habitaciones dobles libres? +Desearía una habitación. +Quisiéramos una habitación. +Por favor, desearía que me dieran la llave de nuestra habitación. +Tengo que marcharme el día treinta de septiembre. +¿Hay una habitación libre? +Por favor, ¿me querrían preparar la factura? +Querría una habitación con televisión y teléfono, por favor. +Por favor, he reservado una habitación con teléfono. +Despiértenos mañana a las seis en punto, por favor. +Hemos reservado una habitación tranquila, por favor. +Tengo una reserva, por favor. +¿Podría ver alguna habitación individual y tranquila, por favor? +Por favor, ¿cuánto vale una habitación individual? +Lléveme las bolsas al taxi. +Deseamos cambiar nuestra habitación. +¿Nos puede llevar las bolsas a la estación? +¿Le importaría mostrarme otra habitación? +Por favor, deseo reservar una habitación. +He hecho una reserva. +¿Qué precio tiene una habitación individual para nueve días, por favor? +Tenemos que irnos mañana a la una. +Por favor, lleven mis bolsas a la habitación cero veintinueve. +¿Me podrían llevar mis bolsas al autobús? +Tenemos reservada una habitación para una noche a nombre del señor Federico Cornelles. +Hice una reserva. +Me parece que se ha producido un problema. +¿Puede preparar la factura de la habitación cinco uno uno?, por favor. +La habitación es muy calurosa. +¿Podría ver alguna habitación individual y tranquila? +Me llama a un taxi. +Despiértenme mañana a las cinco. +¿Está incluido el servicio de habitaciones? +Por favor, ¿nos podría dar las llaves de la habitación? +Me voy a marchar el viernes veintinueve de mayo a las nueve en punto de la noche. +Quiero reservar una habitación individual y tranquila para esta semana, por favor. +¿Cuánto cuesta una habitación doble con pensión completa? +¿Nos podría despertar a las siete y media? +Reservamos una habitación individual. +Baje nuestras bolsas de viaje a recepción. +Hemos reservado una habitación hasta el dos de febrero. +Me gustaría reservar una habitación para esta noche, por favor. +¿Les importaría darme la llave de mi habitación? +Por favor, ¿le importaría despertarme a las ocho y cuarto? +¿Nos podrían despertar a las seis y media? +Queremos que nos den la llave de la habitación. +Por favor, tengo la reserva de una habitación tranquila individual a nombre de Enrique Díaz. +¿Tienen una habitación libre con agua caliente y aire acondicionado? +¿Tiene teléfono y aire acondicionado la habitación? +Nos tenemos que ir el día veintisiete a las nueve en punto. +Por favor, ¿me querrían llamar a un taxi? +¿Les importaría despertarnos mañana a las nueve menos cuarto? +Reservamos una habitación con aire acondicionado hasta pasado mañana, por favor. +¿Nos puede pedir un taxi?, por favor. +Tenemos reservada una habitación doble. +Desearía que llevase mis bolsas a mi habitación, por favor. +Deseo una habitación doble. +Me marcho mañana a las doce en punto de la mañana. +¿Hay aire acondicionado y servicio de bar en las habitaciones? +Por favor, reservamos dos habitaciones. +¿Hay caja fuerte en las habitaciones? +¿Tienen habitaciones tranquilas libres? +Por favor, ¿me puede dar usted las llaves de la habitación uno uno tres? +Por favor, suba mi maleta a mi habitación. +Por favor, tengo reservada una habitación doble con aire acondicionado, teléfono y televisión. +Quisiera reservar una habitación. +¿Podría ver otra habitación? +¿Tiene habitaciones dobles libres? +¿Están incluidos todos los impuestos? +Por favor, despiértenos mañana a las dos. +¿Nos podría dar la llave de la habitación, por favor? +Súbanos las maletas al coche. +¿Cuánto cuesta una habitación individual? +Me voy a ir el viernes once de abril a las ocho y cuarto de la noche. +Por favor, quiero que nos dé la llave de mi habitación. +¿Cuánto cuesta una habitación doble por semana? +Por favor, hice la reserva de una habitación doble tranquila con cuarto de baño y vistas a la ciudad a nombre de Arturo Mira. +Por favor, he reservado una habitación. +¿Hay televisión en la habitación, por favor? +Pienso que se ha producido un problema en mi cuenta de la habitación seis cinco. +¿Cuánto cuesta una habitación individual, por favor? +Me hace la cuenta de la habitación uno cuatro siete. +Por favor, ¿hay agua caliente en la habitación? +¿Tienen alguna habitación individual libre? +¿Cuánto cuesta una habitación individual para un día? +¿Nos puede llamar a un taxi para la habitación tres seis? +¿Cuánto vale por día una habitación doble? +Por favor, tenenos hecha una reserva. +He reservado una habitación tranquila doble a nombre de Paloma Montero. +Deseamos cambiarnos a otra habitación con cuarto de baño, por favor. +¿Me podría despertar a las once en punto, por favor? +¿Podrían llamarnos a un taxi para la habitación nueve tres seis? +Vamos a marcharnos el día veintiséis de septiembre a las siete y cuarto. +Por favor, deseo que me den la llave de la habitación. +Por favor, ¿me podría pedir un taxi? +¿Aceptaría dinero en efectivo? +Tengo la reserva de una habitación a nombre de Francisco Botella. +Prepáreme la factura. +Me gustaría reservar una habitación individual y tranquila con teléfono hasta pasado mañana, por favor. +¿Podría pedirnos un taxi? +¿Hay televisión en las habitaciones? +¿Cuánta? +¡Conforme! +Por favor, ¿podría prepararnos la cuenta de la habitación dos seis tres? +¿Hay teléfono en las habitaciones? +¿Qué hora es? +Mi nombre es Jesús González. +Por favor, tengo hecha una reserva a nombre de Teresa Ibáñez. +He de marcharme hoy mismo a las once en punto de la mañana. +Desearía que me bajase los bultos a la habitación doce. +¿Dónde? +Por favor, ¿nos podría pedir un taxi para la habitación seis catorce? +Por favor, ¿les importaría despertarme mañana a las cuatro y media? +Por favor, nos gustaría cambiarnos a otra habitación menos ruidosa. +Creo que se ha equivocado en la cuenta. +¿Está incluido el teléfono? +Una habitación a nombre de Virginia Álvarez, por favor. +Tenemos que marcharnos hoy mismo por la noche. +En la habitación hace mucho calor. +Por favor, ¿me podrían preparar mi factura? +¿Podría ver alguna habitación, por favor? +Hemos reservado una habitación doble. +¿Aceptarían tarjetas de crédito? +Me he de marchar el jueves dieciséis a las nueve y media de la noche. +Por favor, suba mi maleta a mi habitación. +Deseo una habitación individual. +¿Hay habitaciones dobles y tranquilas libres? +Deseamos que baje nuestras maletas a la habitación. +¿Tienen libre una habitación? +Nos vamos a marchar el sábado. +Por favor, tengo hecha la reserva de una habitación con televisión y teléfono a nombre de Inmaculada Colomer. +Súbanme mis maletas a la habitación número dos ocho, por favor. +¿Les importaría despertarnos a las cuatro y media, por favor? +Hay un error en la cuenta de la habitación setecientos diecinueve. +¿Querría pedirnos nuestro taxi para la habitación dos tres uno? +Por favor, ¿podrían subirnos nuestra bolsa de viaje a la habitación? +¿Les importaría llevar nuestros bultos a nuestra habitación? +¿Podría cambiarme a otra habitación menos fría? +Hemos reservado una habitación. +¿Le importaría que echáramos un vistazo a alguna habitación? +¿Cuántas? +Déme las llaves de nuestra habitación. +¿Podría llamarme a un taxi? +Desearía que me llevara mi maleta a la habitación número setecientos tres, por favor. +Por favor, tenenos hecha una reserva. +¿Podría cambiarme a otra habitación más cálida? +Adiós. +Por favor, lléveme mi maleta a la habitación. +Por favor, ¿podrían llevarme ustedes mis bultos a la habitación setecientos veintitrés? +¿Hay alguna habitación doble libre? +Por favor, dénos la llave de la habitación. +Pienso que se ha producido una equivocación en la cuenta. +Despiértenos mañana a la una en punto, por favor. +¿Cuándo? +Me llamo Emilio Navarro. +¿Le importaría subir nuestras bolsas a nuestra habitación, por favor? +Existe un error en nuestra cuenta. +¿Hay teléfono en la habitación? +Por favor, tengo la reserva de una habitación con teléfono, televisión y baño a nombre de Isabel Cabedo. +¿Me podría despertar mañana a las doce, por favor? +Por favor, ¿podríamos ver otra habitación? +¿Me podrían hacer la cuenta? +¿Podría reservar una habitación? +He de marcharme mañana a las seis. +Queremos que nos dé la llave de la habitación número novecientos veintiuno, por favor. +Lleve nuestras bolsas a nuestra habitación. +¿Podría cambiarnos a otra habitación con menos ruido? +Pienso que existe una equivocación en mi cuenta. +He de marcharme el día ocho de septiembre. +He reservado una habitación doble a nombre de la señora Inmaculada Colomer. +¿Podríamos reservar dos habitaciones? +Bajen nuestros bultos a la habitación número cuatrocientos dieciocho. +Me tengo que marchar el trece a las cuatro y cuarto. +¿Tiene libre una habitación individual? +Reservamos dos habitaciones, por favor. +Pienso que existe un error. +¿Haría el favor de cambiarnos a otra habitación con menos ruido? +Dennos las llaves de la habitación nueve nueve dos, por favor. +Por favor, deseo una habitación. +He hecho la reserva de una habitación con teléfono, vistas a la montaña, baño y tele a nombre de Ricardo Vilanova. +Deseo que me suban los bultos a mi habitación. +Tengo hecha una reserva, por favor. +¿Nos podría despertar mañana a las cuatro? +Me parece que se produjo un error en la cuenta. +He de irme mañana. +¿Le importaría darnos la llave de la habitación? +Desearía una habitación hasta el próximo martes. +¿Dónde? +Por favor, ¿les importaría darme la llave de la habitación quinientos veintidós? +Quiero reservar una habitación. +Lléveme mi equipaje a la estación. +¿Me lleva las bolsas? +¿Podrían darnos la llave de mi habitación? +Desearíamos una habitación doble con ducha para un día. +¿Tiene una habitación doble libre? +Se ha producido una equivocación en la cuenta. +Desearía reservar una habitación para siete días. +Tenemos reservada una habitación individual con televisión, teléfono y aseo hasta mañana a nombre de José Herrero, por favor. +¿Están anotados en la cuenta los extras? +Hemos reservado una habitación doble. +La habitación es muy fría. +Tengo reservada una habitación doble para hoy. +¡Buenos días! +¿Pueden llevarme las bolsas de viaje al coche? +¿Podría ver alguna habitación doble y tranquila con televisión, por favor? +¿Están incluidos en la cuenta todos los impuestos? +Hay una equivocación en la cuenta. +¿Le importaría subirme mi equipaje al autobús? +Me marcharé el veintisiete de marzo a las dos y media de la tarde. +Por favor, reservé una habitación tranquila doble con baño, una buena vista y televisión a nombre de Andrés Sanz. +Por favor, llámenos a un taxi. +¿Tenemos que firmar alguna hoja de registro? +He hecho la reserva de una habitación a nombre de Julia Vilanova. +¿Hay alguna habitación tranquila libre? +Me llamo Gregorio Pitarch. +¿Cómo? +Llámeme a mi taxi. +Creo que hay un error en la cuenta. +¿Tiene libre una habitación con aseo, aire acondicionado y televisión? +¿Querría llamarnos a un taxi?, por favor. +De nada. +Reservamos una habitación a nombre de Juan Rubio. +¿Podría reservar una habitación con aire acondicionado para esta semana? +Nos marchamos hoy mismo a las diez y cuarto de la noche. +En la habitación hace demasiado frío. +Por favor, tengo una reserva. +Nos iremos mañana a las tres menos cuarto de la tarde. +Deseamos que nos despierten a las once, por favor. +Quisiera que me diesen las llaves de la habitación número seis tres ocho. +¿Nos pueden preparar la factura?, por favor. +Reservamos una habitación individual, por favor. +Queremos reservar una habitación, por favor. +¿Le importaría llevar mi equipaje a recepción? +¿Me podría llamar a un taxi? +¿Tiene aire acondicionado la habitación? +Me he de ir mañana a las diez y cuarto de la noche. +He reservado una habitación individual. +¿Tiene alguna habitación individual libre? +Nos tenemos que ir el día cuatro. +¿Puedo pagar la cuenta en efectivo? +¿Nos podría usted dar las llaves de nuestra habitación? +Quiero una habitación individual y tranquila para hoy, por favor. +¿Tenemos que firmar la hoja de registro? +Por favor, tenenos hecha una reserva. +¿Le importaría mostrarme alguna habitación con baño, por favor? +Despiérteme mañana a las tres menos cuarto, por favor. +Querría una habitación que tenga buena vista de la montaña y ducha, por favor. +He reservado una habitación. +¿Tenemos que rellenar la hoja de registro? +¿Me pueden despertar a las dos en punto, por favor? +¿Nos puede despertar a las diez, por favor? diff --git a/samples/machine_translation.ipynb b/samples/machine_translation.ipynb new file mode 100644 index 00000000..29b15124 --- /dev/null +++ b/samples/machine_translation.ipynb @@ -0,0 +1,455 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Machine Translation Tutorial\n", + "\n", + "Machine provides a general framework for machine translation engines. It currently provides implementations for statistical MT (SMT) and neural MT (NMT). All MT engines implement the same interfaces, which provides a high level of extensibility for calling applications.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%pip install sil-machine[huggingface,thot]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!git clone https://github.com/sillsdev/machine.py.git\n", + "%cd machine.py/samples" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Statistical Machine Translation\n", + "\n", + "Machine provides a phrase-based statistical machine translation engine that is based on the [Thot](https://github.com/sillsdev/thot) library. The SMT engine implemented in Thot is unique, because it supports incremental training and interactive machine translation (IMT). Let's start by training an SMT model. MT models implement the `TranslationModel` interface. SMT models are trained using a parallel text corpus, so the first step is to create a `ParallelTextCorpus`.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from machine.corpora import TextFileTextCorpus\n", + "\n", + "source_corpus = TextFileTextCorpus(\"data/sp.txt\")\n", + "target_corpus = TextFileTextCorpus(\"data/en.txt\")\n", + "parallel_corpus = source_corpus.align_rows(target_corpus)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Trainers are responsible for training MT models. A trainer can be created either using the constructor or using the `create_trainer` method on the `TranslationModel` interface. Creating a trainer by constructor is useful if you are training a new model. The `create_trainer` method is useful when you are retraining an existing model. In this example, we are going to construct the trainer directly. Word alignment is at the core of SMT. In this example, we are going to use HMM for word alignment.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training model... done.\n", + "Saving model... done.\n" + ] + } + ], + "source": [ + "import os\n", + "import shutil\n", + "from machine.tokenization import LatinWordTokenizer\n", + "from machine.translation.thot import ThotSmtModelTrainer, ThotWordAlignmentModelType\n", + "\n", + "tokenizer = LatinWordTokenizer()\n", + "os.makedirs(\"out/sp-en-smt\", exist_ok=True)\n", + "shutil.copy(\"data/smt.cfg\", \"out/sp-en-smt/smt.cfg\")\n", + "with ThotSmtModelTrainer(\n", + " ThotWordAlignmentModelType.HMM,\n", + " parallel_corpus,\n", + " \"out/sp-en-smt/smt.cfg\",\n", + " source_tokenizer=tokenizer,\n", + " target_tokenizer=tokenizer,\n", + " lowercase_source=True,\n", + " lowercase_target=True,\n", + ") as trainer:\n", + " print(\"Training model...\", end=\"\")\n", + " trainer.train()\n", + " print(\" done.\")\n", + " print(\"Saving model...\", end=\"\")\n", + " trainer.save()\n", + " print(\" done.\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In order to fully translate a sentence, we need to perform pre-processing steps on the source sentence and post-processing steps on the target translation. Here are the steps to fully translate a sentence:\n", + "\n", + "1. Tokenize the source sentence.\n", + "2. Lowercase the source tokens.\n", + "3. Translate the sentence.\n", + "4. Truecase the target tokens.\n", + "5. Detokenize the target tokens into a sentence.\n", + "\n", + "Truecasing is the process of properly capitalizing a lowercased sentence. Luckily, Machine provides a statistical truecaser that can learn the capitalization rules for a language. The next step is train the truecaser model.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "from machine.translation import UnigramTruecaserTrainer\n", + "\n", + "with UnigramTruecaserTrainer(\"out/sp-en-smt/en.truecase.txt\", target_corpus, tokenizer=tokenizer) as trainer:\n", + " trainer.train()\n", + " trainer.save()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now that we have a trained SMT model and a trained truecasing model, we are ready to translate sentences. First, We need to load the SMT model. The model can be used to translate sentences using the `translate` method.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "I would like to book a room until tomorrow.\n" + ] + } + ], + "source": [ + "from machine.translation import UnigramTruecaser\n", + "from machine.translation.thot import ThotSmtModel\n", + "from machine.tokenization import LatinWordDetokenizer\n", + "\n", + "truecaser = UnigramTruecaser(\"out/sp-en-smt/en.truecase.txt\")\n", + "detokenizer = LatinWordDetokenizer()\n", + "\n", + "with ThotSmtModel(\n", + " ThotWordAlignmentModelType.HMM,\n", + " \"out/sp-en-smt/smt.cfg\",\n", + " source_tokenizer=tokenizer,\n", + " target_tokenizer=tokenizer,\n", + " target_detokenizer=detokenizer,\n", + " truecaser=truecaser,\n", + " lowercase_source=True,\n", + " lowercase_target=True,\n", + ") as model:\n", + " result = model.translate(\"Desearía reservar una habitación hasta mañana.\")\n", + " print(result.translation)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Interactive Machine Translation\n", + "\n", + "`ThotSmtModel` also supports interactive machine translation. Under this paradigm, the engine assists a human translator by providing translations suggestions based on what the user has translated so far. This paradigm can be coupled with incremental training to provide a model that is constantly learning from translator input. Models and engines must implement the `InteractiveTranslationModel` and `InteractiveTranslationEngine` interfaces to support IMT. The IMT paradigm is implemented in the `InteractiveTranslator` class. The `approve` method on `InteractiveTranslator` performs incremental training using the current prefix. Suggestions are generated from translations using a class that implements the `TranslationSuggester` interface." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Source: Hablé con recepción.\n", + "Suggestion: [With reception]\n", + "Suggestion: I spoke [with reception]\n", + "Suggestion: I spoke with reception. []\n", + "\n", + "Source: Hablé hasta cinco en punto.\n", + "Suggestion: [I spoke until five o'clock]\n", + "Suggestion: I spoke until five o'clock. []\n" + ] + } + ], + "source": [ + "from machine.translation import PhraseTranslationSuggester, InteractiveTranslatorFactory\n", + "\n", + "suggester = PhraseTranslationSuggester()\n", + "\n", + "def get_current_suggestion(translator):\n", + " suggestion = next(iter(suggester.get_suggestions_from_translator(1, translator)), None)\n", + " suggestion_text = \"\" if suggestion is None else detokenizer.detokenize(suggestion.target_words)\n", + " if len(translator.prefix) == 0:\n", + " suggestion_text = suggestion_text.capitalize()\n", + " prefix_text = translator.prefix.strip()\n", + " if len(prefix_text) > 0:\n", + " prefix_text = prefix_text + \" \"\n", + " return f\"{prefix_text}[{suggestion_text}]\"\n", + "\n", + "\n", + "with ThotSmtModel(\n", + " ThotWordAlignmentModelType.HMM,\n", + " \"out/sp-en-smt/smt.cfg\",\n", + " source_tokenizer=tokenizer,\n", + " target_tokenizer=tokenizer,\n", + " target_detokenizer=detokenizer,\n", + " truecaser=truecaser,\n", + " lowercase_source=True,\n", + " lowercase_target=True,\n", + ") as model:\n", + " factory = InteractiveTranslatorFactory(model, target_tokenizer=tokenizer, target_detokenizer=detokenizer)\n", + "\n", + " source_sentence = \"Hablé con recepción.\"\n", + " print(\"Source:\", source_sentence)\n", + " translator = factory.create(source_sentence)\n", + "\n", + " suggestion = get_current_suggestion(translator)\n", + " print(\"Suggestion:\", suggestion)\n", + "\n", + " translator.append_to_prefix(\"I spoke \")\n", + " suggestion = get_current_suggestion(translator)\n", + " print(\"Suggestion:\", suggestion)\n", + "\n", + " translator.append_to_prefix(\"with reception.\")\n", + " suggestion = get_current_suggestion(translator)\n", + " print(\"Suggestion:\", suggestion)\n", + " translator.approve(aligned_only=False)\n", + " print()\n", + "\n", + " source_sentence = \"Hablé hasta cinco en punto.\"\n", + " print(\"Source:\", source_sentence)\n", + " translator = factory.create(source_sentence)\n", + "\n", + " suggestion = get_current_suggestion(translator)\n", + " print(\"Suggestion:\", suggestion)\n", + "\n", + " translator.append_to_prefix(\"I spoke until five o'clock.\")\n", + " suggestion = get_current_suggestion(translator)\n", + " print(\"Suggestion:\", suggestion)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Neural Machine Translation\n", + "\n", + "Machine also supports neural machine translation through the use of the Huggingface [Transformers](https://huggingface.co/docs/transformers/en/index) library. The Huggingface NMT engine implements the same interfaces that the SMT engine does, so you can train and inference the engine using the same API.\n", + "\n", + "Let's start by fine tuning an NMT model using `HuggingFaceNmtModelTrainer`. One thing to note is that Huggingface models typically have an associated tokenizer. The trainer will handle tokenization for us, so we don't have to tokenize the corpus. We will need to specify the base model and the training arguments. For this example, we will be fine tuning an M2M100 model. We will also need to specify the source and target languages according to the model." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Using custom data configuration default-d72fb4ece0e4f60a\n", + "Found cached dataset generator (C:/Users/damie/.cache/huggingface/datasets/generator/default-d72fb4ece0e4f60a/0.0.0)\n" + ] + }, + { + "data": { + "application/json": { + "ascii": false, + "bar_format": null, + "colour": null, + "elapsed": 0.014008045196533203, + "initial": 0, + "n": 0, + "ncols": null, + "nrows": null, + "postfix": null, + "prefix": "Running tokenizer on train dataset", + "rate": null, + "total": 1, + "unit": "ba", + "unit_divisor": 1000, + "unit_scale": false + }, + "application/vnd.jupyter.widget-view+json": { + "model_id": "364f7d17639b4559aa51b42d6d7841c9", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Running tokenizer on train dataset: 0%| | 0/1 [00:00 None: corpus, src_lang="es", tgt_lang="en", - max_source_length=20, - max_target_length=20, + max_src_length=20, + max_tgt_length=20, ) trainer.train() trainer.save() @@ -125,10 +125,10 @@ def test_update_tokenizer_missing_char() -> None: corpus, src_lang="en_XX", tgt_lang="es_XX", - max_source_length=20, - max_target_length=20, + max_src_length=20, + max_tgt_length=20, add_unk_src_tokens=False, - add_unk_trg_tokens=False, + add_unk_tgt_tokens=False, ) trainer_nochar.train() trainer_nochar.save() @@ -145,10 +145,10 @@ def test_update_tokenizer_missing_char() -> None: corpus, src_lang="en_XX", tgt_lang="es_XX", - max_source_length=20, - max_target_length=20, + max_src_length=20, + max_tgt_length=20, add_unk_src_tokens=True, - add_unk_trg_tokens=True, + add_unk_tgt_tokens=True, ) trainer_char.train() trainer_char.save() @@ -213,10 +213,10 @@ def test_update_tokenizer_missing_char_skip() -> None: corpus, src_lang="en", tgt_lang="es", - max_source_length=20, - max_target_length=20, + max_src_length=20, + max_tgt_length=20, add_unk_src_tokens=False, - add_unk_trg_tokens=False, + add_unk_tgt_tokens=False, ) trainer_nochar.train() trainer_nochar.save() @@ -232,10 +232,10 @@ def test_update_tokenizer_missing_char_skip() -> None: corpus, src_lang="en", tgt_lang="es", - max_source_length=20, - max_target_length=20, + max_src_length=20, + max_tgt_length=20, add_unk_src_tokens=False, - add_unk_trg_tokens=False, + add_unk_tgt_tokens=False, ) trainer_char.train() trainer_char.save() @@ -285,10 +285,10 @@ def test_update_tokenizer_missing_char_src() -> None: corpus, src_lang="en_XX", tgt_lang="es_XX", - max_source_length=20, - max_target_length=20, + max_src_length=20, + max_tgt_length=20, add_unk_src_tokens=False, - add_unk_trg_tokens=False, + add_unk_tgt_tokens=False, ) trainer_nochar.train() trainer_nochar.save() @@ -304,10 +304,10 @@ def test_update_tokenizer_missing_char_src() -> None: corpus, src_lang="en_XX", tgt_lang="es_XX", - max_source_length=20, - max_target_length=20, + max_src_length=20, + max_tgt_length=20, add_unk_src_tokens=True, - add_unk_trg_tokens=False, + add_unk_tgt_tokens=False, ) trainer_char.train() trainer_char.save() @@ -357,10 +357,10 @@ def test_update_tokenizer_missing_char_trg() -> None: corpus, src_lang="en_XX", tgt_lang="es_XX", - max_source_length=20, - max_target_length=20, + max_src_length=20, + max_tgt_length=20, add_unk_src_tokens=False, - add_unk_trg_tokens=False, + add_unk_tgt_tokens=False, ) trainer_nochar.train() trainer_nochar.save() @@ -376,10 +376,10 @@ def test_update_tokenizer_missing_char_trg() -> None: corpus, src_lang="en_XX", tgt_lang="es_XX", - max_source_length=20, - max_target_length=20, + max_src_length=20, + max_tgt_length=20, add_unk_src_tokens=False, - add_unk_trg_tokens=True, + add_unk_tgt_tokens=True, ) trainer_char.train() trainer_char.save() @@ -429,10 +429,10 @@ def test_update_tokenizer_no_missing_char() -> None: corpus, src_lang="en_XX", tgt_lang="es_XX", - max_source_length=20, - max_target_length=20, + max_src_length=20, + max_tgt_length=20, add_unk_src_tokens=False, - add_unk_trg_tokens=False, + add_unk_tgt_tokens=False, ) trainer_nochar.train() trainer_nochar.save() @@ -446,10 +446,10 @@ def test_update_tokenizer_no_missing_char() -> None: corpus, src_lang="en_XX", tgt_lang="es_XX", - max_source_length=20, - max_target_length=20, + max_src_length=20, + max_tgt_length=20, add_unk_src_tokens=True, - add_unk_trg_tokens=True, + add_unk_tgt_tokens=True, ) trainer_char.train() trainer_char.save()