sentencepiece_tokenizer.py 1.2 KB

123456789101112131415161718192021222324252627282930313233343536
  1. from pathlib import Path
  2. from typing import Iterable
  3. from typing import List
  4. from typing import Union
  5. import sentencepiece as spm
  6. from funasr.text.abs_tokenizer import AbsTokenizer
  7. class SentencepiecesTokenizer(AbsTokenizer):
  8. def __init__(self, model: Union[Path, str]):
  9. self.model = str(model)
  10. # NOTE(kamo):
  11. # Don't build SentencePieceProcessor in __init__()
  12. # because it's not picklable and it may cause following error,
  13. # "TypeError: can't pickle SwigPyObject objects",
  14. # when giving it as argument of "multiprocessing.Process()".
  15. self.sp = None
  16. def __repr__(self):
  17. return f'{self.__class__.__name__}(model="{self.model}")'
  18. def _build_sentence_piece_processor(self):
  19. # Build SentencePieceProcessor lazily.
  20. if self.sp is None:
  21. self.sp = spm.SentencePieceProcessor()
  22. self.sp.load(self.model)
  23. def text2tokens(self, line: str) -> List[str]:
  24. self._build_sentence_piece_processor()
  25. return self.sp.EncodeAsPieces(line)
  26. def tokens2text(self, tokens: Iterable[str]) -> str:
  27. self._build_sentence_piece_processor()
  28. return self.sp.DecodePieces(list(tokens))