Skip to main content

Pipeline-Normalizer

Installation:

  • pip install -U spacy
  • python -m spacy download en_core_web_sm
  • pip install mofid-normalizer==1.0.83

Requirement:

  • hazm == 0.7.0
  • nltk == 3.3
  • num2fawords == 1.1
  • spacy >= 3.0.6
  • googledrivedownloader

Version:

import mofid_normalizer
print(mofid_normalizer.__version__)

Pipelines

  • char_normalizer
  • spell_checker
  • date2str
  • time2str
  • num2str
  • abbreviation2word
  • affix2norm
  • word_mapper
  • punctuation_remover
  • word_level_tokenizer

Usage

>>> from mofid_normalizer.spacy_loader import nlp
>>> with nlp.select_pipes(enable=["char_normalizer"]):
    print(nlp("اﯙ ایراني ٲست"))
>>>او ایرانی است

>>> with nlp.select_pipes(enable=["num2str"]):
        print(nlp("من مقدار 35.75 تومان پول دارم."))
>>> من مقدار سی و پنج ممیز هفتاد و چهار تومان پول دارم.

>>> with nlp.select_pipes(enable=["time2str"]):
        print(nlp("ساعت 20:27 است."))
>>> ساعت بیست و  بیست و هفت دقیقه است.

>>> with nlp.select_pipes(enable=["date2str"]):
        print(nlp("من در تاریخ 30-2-1375 به دنیا آمدم."))
        
(***Select one of the following randomly.***)
>>> ['من در تاریخ سیم اردیبهشت ماه  یک هزار و سیصد و هفتاد و پنج به دنیا آمدم.',
     'من در تاریخ سیم اردیبهشت ماه  یک هزار و سیصد و هفتاد و پنج شمسی به دنیا آمدم.',
     'من در تاریخ سی اردیبهشت یک هزار و سیصد و هفتاد و پنج شمسی به دنیا آمدم.',
     'من در تاریخ سی دو یک هزار و سیصد و هفتاد و پنج شمسی به دنیا آمدم.',
     'من در تاریخ سی اردیبهشت یک هزار و سیصد و هفتاد و پنج به دنیا آمدم.',
     'من در تاریخ سیم اردیبهشت سال یک هزار و سیصد و هفتاد و پنج شمسی به دنیا آمدم.',
     'من در تاریخ سیم اردیبهشت سال یک هزار و سیصد و هفتاد و پنج به دنیا آمدم.',
     'من در تاریخ سیم اردیبهشت یک هزار و سیصد و هفتاد و پنج به دنیا آمدم.',
     'من در تاریخ سی دو یک هزار و سیصد و هفتاد و پنج به دنیا آمدم.',
     'من در تاریخ سیم اردیبهشت یک هزار و سیصد و هفتاد و پنج شمسی به دنیا آمدم.',
     'ن در تاریخ سی اردیبهشت سال یک هزار و سیصد و هفتاد و پنج به دنیا آمدم.',
     'من در تاریخ سیم دو سال یک هزار و سیصد و هفتاد و پنج به دنیا آمدم.',
     'من در تاریخ سی اردیبهشت سال یک هزار و سیصد و هفتاد و پنج شمسی به دنیا آمدم.',
     'من در تاریخ سیم دو یک هزار و سیصد و هفتاد و پنج به دنیا آمدم.',
     'من در تاریخ سیم اردیبهشت ماه  سال یک هزار و سیصد و هفتاد و پنج شمسی به دنیا آمدم.',
     'من در تاریخ سی اردیبهشت ماه  یک هزار و سیصد و هفتاد و پنج به دنیا آمدم.',
     'من در تاریخ سی اردیبهشت ماه  یک هزار و سیصد و هفتاد و پنج شمسی به دنیا آمدم.',
     'من در تاریخ سی اردیبهشت ماه  سال یک هزار و سیصد و هفتاد و پنج به دنیا آمدم.',
     'من در تاریخ سیم اردیبهشت ماه  سال یک هزار و سیصد و هفتاد و پنج به دنیا آمدم.',
     'من در تاریخ سی دو سال یک هزار و سیصد و هفتاد و پنج به دنیا آمدم.',
     'من در تاریخ سیم دو سال یک هزار و سیصد و هفتاد و پنج شمسی به دنیا آمدم.',
     'من در تاریخ سی اردیبهشت ماه  سال یک هزار و سیصد و هفتاد و پنج شمسی به دنیا آمدم.',
     'من در تاریخ سیم دو یک هزار و سیصد و هفتاد و پنج شمسی به دنیا آمدم.',
     'من در تاریخ سی دو سال یک هزار و سیصد و هفتاد و پنج شمسی به دنیا آمدم.']

>>> with nlp.select_pipes(enable=["abbreviation2word"]):
        print(nlp("امام علی ع در 1 ه.ق به دنیا آمدند."))
>>> امام علی علیه السلام در 1 هجری قمری به دنیا آمدند.

>>> with nlp.select_pipes(enable=["affix2norm"]):
        print(nlp("شما رفته بودهباشید))
>>> شما رفته بوده باشید

>>> with nlp.select_pipes(enable=["punctuation_remover"]):
        print(nlp("شما! به علایم نگارشی، تماشا+- نمیکنید. شما هیچ علایم نگارشی ( نخواهید دید./")

>>> شما به علایم نگارشی تماشا نمیکنید شما هیچ علایم نگارشی  نخواهید دید
  
>>> with nlp.select_pipes(enable=["word_level_tokenizer"]):
        print(nlp("من در تاریخ 30-2-1375 در راس ساعت 20:30 به منزل رفتم. آنها در این تاریخ بیست سال از ه.ق عقبلتر هستند."))
>>> ['من', 'در', 'تاریخ', '30-2-1375', 'در', 'راس', 'ساعت', '20:30', 'به', 'منزل', 'رفتم.', 'آنها', 'در', 'این', 'تاریخ', 'بیست', 'سال', 'از', 'ه.ق', 'عقبلتر', 'هستند.']

>>> print(nlp("این یک نمونه کامل از مثالهای نرمالایزر موجود خواهدبود. این نرمالایزر در ساعت 20:47 ساخته شدهاست. شما هیچ گونه علایم نگارشی ﺆ کاراکتر غیر عادی نخواهیدخواند. هدف ما نرمالسازی تمامی کتابها است."))

>>> ['این', 'یک', 'نمونه', 'کامل', 'از', 'مثال', 'های', 'نرمالایزر', 'موجود', 'خواهد', 'بود', 'این', 'نرمالایزر', 'در', 'ساعت', 'بیست', 'و', 'چهل', 'و', 'هفت', 'دقیقه', 'ساخته', 'شده', 'است', 'شما', 'هیچ', 'گونه', 'علا', 'یم', 'نگارشی', 'و', 'کاراکتر', 'غیر', 'عادی', 'نخواهید', 'خواند', 'هدف', 'ما', 'نرمالسازی', 'تمامی', 'کتاب', 'ها', 'است']

>>> with nlp.select_pipes(enable=["word_mapper"]):
        print(nlp(اینگونه))
>>> "این\u200cگونه"

Multiprocessing

Multiprocessing with 4 processes

>>> docs = nlp.pipe(texts, n_process=4)

With as many processes as CPUs (use with caution!)

>>> docs = nlp.pipe(texts, n_process=-1)

Default batch size is nlp.batch_size (typically 1000)

>>> docs = nlp.pipe(texts, n_process=2, batch_size=2000)

Disabling

>>> with nlp.select_pipes(disable=["affix2norm", "date2str"]):
        print(nlp(texts))

Enabling multiple pipe

>>> with nlp.select_pipes(enable=["char_normalizer","spell_checker"]):
        print(nlp(texts))

Remove pipe

>>> nlp.remove_pipe("spell_checker")

Customize pipe

>>> nlp.remove_pipe("word_mapper")
>>> nlp.add_pipe("word_mapper", after="affix2norm", config={"config_file": os.path.dirname(os.path.realpath(__file__)) + "/" +
                 'mappings.json',"half_space_char":'\u200c'})

Default modules format in library

nlp.add_pipe("char_normalizer", first=True,
             config={"config_file": conf_path + 'character_mappings.json'})
nlp.add_pipe("spell_checker", after="char_normalizer", config={})
nlp.add_pipe("date2str", after="spell_checker", config={})
nlp.add_pipe("time2str", after="date2str", config={})
nlp.add_pipe("num2str", after="time2str", config={})
nlp.add_pipe("abbreviation2word", after="num2str", config={})
nlp.add_pipe("affix2norm", after="abbreviation2word",
             config={"config_file": conf_path + 'affix.json', "double_postfix_joint": True})
nlp.add_pipe("word_mapper", after="affix2norm",
             config={"config_file": conf_path + 'word_mappings.json', "half_space_char": "  "})

nlp.add_pipe("punctuation_remover", after="abbreviation2word", config={})
nlp.add_pipe("word_level_tokenizer")

Blank pipes

this class is completely blank, you can customize it.

from spacy_loader import nlp_blank
nlp.add_pipe()

Config files templates

you can modify some modules, new config files should be in the following format.

affix.json

{
e.g: می‌کند <--  می کند
"space_jointer_to_next": [
"بی",
"می",
"نمی"],
e.g: کتاب‌ها <--  کتاب ها
"space_jointer_to_previous": [
"هایی",
"ها",
"های",
....
  ],
e.g: رفته‌شده‌است <--  رفته شده است
"space_jointer_to_next_previous": [
    "شده",
    "نشده"
  ],
e.g: اطلاح‌طلبان <--  اصلاح طلبان
"space_jointer_to_previous_plus": [
    "طلبان",
    "طلب",
    ....
  ],
e.g: کتاب‌تان <--  کتابتان
"prop_postfix_all": [
    "یم",
    "یت",
    "یش",
    ....
  ],
e.g: کتاب‌ها <--  کتابها
"plural_postfix_all": [
    "ها",
    "ات",
    "های",
    ....
  ],
Words in this list will not be splitted
"postfix_joint": [
    "یم",
    "یت",
    "یش",
    "ش",
    ....
  ],
e.g: علاقه‌مند <--  علاقهمند
"irregular_postfix_all": [
    "نده",
    "گانه",
    "دان",
    "ستان",
    "چی",
    ....
  ],
irregular Words in this list will not be splitted.
"irregular_postfix_joint": [
    "نده",
    "دان",
    "ستان",
    "چی",
    ....
  ],
e.g: پاد‌زهر <--  پادزهر
"prefix_all": [
    "نا",
    "پاد",
    "باز",
    ....
  ],
prefix Words in this list will not be splitted.
"prefix_joint": [],
e.g: فرو‌رفت <--  فرورفت
"verb_prefix": [
    "در",
    "بر",
    "پر",
    ....
  ],
prefix verbs in this list will not be splitted.
"verb_prefix_joint": [],
  "slang_verbs_prefix": [
    "می",
    "نمی"
  ]
}

character_mapping.json

Note that only the modules in the Mapper will be applied, and the modules in the Mapper_ignore will not be applied.

{
  "Mapper": {
    "NUMBERS_MAP_EN": {
      "0": "0",
 
  "\u0660": "0",
  "۰": "0",
  ....
},
"FA_ALPHABET_MAP": {
  "\u0627": "\u0627",
  "ٿ": "ت",
  ....

},
"DIACRITICS_MAP": {
  "\u064b": "",
  "\u064c": "",
  "\u064d": "",
    .....
},
"EN_ALPHABET_MAP": {
  "a": "a",
  "\uff41": "a",
  "\uff42": "b",
    ....

},
"VALID_SYMBOL_MAP": {
  ",": ",",
  ",": ",",
    ....
},
"INVALID_SYMBOL_MAP": {
  "\u00a8": "",
  "\u06c1": " ",
  "\u2063": " ",
  ....
},
"HALF_SPACE": {
  "\u200e": "\u200c",
  "\u200c": "\u200c",
    ....
}
  },
  "Mapper_ignore": {
    "FA_Numbers": {
      "0": "\u06F0",
      "1": "\u06F1",
        ....
    },
    "SPACE": {
      "\u2005": " ",
      "\u2009": " ",
        ....
    },
    "english_upper": {
      "A": "a",
      "B": "b",
      .....
    },
    "NUMBERS_MAP_FA": {
      "\u0660": "\u06F0",
      "\u0661": "\u06F1",
       ....
    }
  }
}

word_mapping.json

{
  "\ufeffبیخبر": "بی\u200cخبر",
  "بیتوجهی": "بی توجهی",
  "بیطرفانه": "بی\u200cطرفانه",
  "آنها": "آن\u200cها",
    ....
}

Metadata

Release files for mofid-normalizer 1.0.83

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distribution (wheel)

Table of built distributions (wheels) for mofid-normalizer 1.0.83
File Interpreter ABI Platform
mofid_normalizer-1.0.83-py2.py3-none-any.whl Python 3, Python 2 none any Details

Release files / mofid_normalizer-1.0.83-py2.py3-none-any.whl

Download URL mofid_normalizer-1.0.83-py2.py3-none-any.whl
Size 876.3 kB
Tags Python 2 Python 3
SHA-256 checksum
How to use checksums
1ee108cf96a6c5dc46fd8387250259f937fe2d024941ec6f9185fe9222ab3b36
BLAKE2b-256 checksum
How to use checksums
4fc4b91138dda10bd4fcce31571aba8d577bb9c556a874a85df79442c023bf88
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.4.1 importlib_metadata/4.6.1 pkginfo/1.7.1 requests/2.27.1 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.5

Release history Release notifications | RSS feed

This release

1.0.83 This release

1 release file

1.0.82

1 release file

1.0.81

2 release files

1.0.71

2 release files

1.0.8

1 release file

1.0.7

2 release files

1.0.6

2 release files

1.0.5

2 release files

1.0.4

2 release files

1.0.3

2 release files

1.0.2

2 release files

1.0.1

2 release files

1.0.0

2 release files

0.3.2

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.9

2 release files

0.2.8

2 release files

0.2.7

2 release files

0.2.6

2 release files

0.2.5

2 release files

0.2.4

2 release files

0.2.3

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page