├── .gitignore ├── LICENSE ├── Makefile ├── README.md ├── data ├── ArabicCommunErrors0.2.csv ├── ArabicCommunErrors0.2.ods ├── Diacritics0.1.ods ├── arabic_tags.txt ├── date_semantique.xml ├── dictionaries │ ├── masdars-verbs7000.csv │ └── المصادر.ods ├── done │ ├── coherency.txt │ ├── darja.txt │ ├── diacritics.txt │ ├── grammar.xml │ ├── homophones.txt │ ├── redundancies.txt │ ├── replaces.txt │ ├── wordiness.txt │ └── wrongWordInContext.txt ├── mustafa.csv ├── original │ └── mustafa.csv ├── replaced_rules.xml ├── review_replaces.txt ├── rules.csv ├── sifates │ ├── fa3il.csv │ ├── maf3oul.csv │ ├── moubalagha.csv │ └── sifates.csv ├── to_review_rules.xml └── مستودع الأغلاط الأجنبية.ods ├── doc ├── lt-works.md └── mohamed_fareh.md ├── masdars.csv ├── replaces.txt ├── scripts ├── builder_const.py ├── grammar_csv2xml.py ├── prepare_3obikan.py ├── prepare_masdar_verb.py ├── rule_builder.py ├── rule_builder_replace.py ├── rule_converter.py ├── rule_converter_obikan.py ├── rule_converter_replace.py ├── rule_converter_rule.py └── rule_converter_xml.py └── tests └── data └── ArabicCommunErrors0.2.csv /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | resources/* 31 | # PyInstaller 32 | # Usually these files are written by a python script from a template 33 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 34 | *.manifest 35 | *.spec 36 | 37 | # Installer logs 38 | pip-log.txt 39 | pip-delete-this-directory.txt 40 | 41 | # Unit test / coverage reports 42 | htmlcov/ 43 | .tox/ 44 | .nox/ 45 | .coverage 46 | .coverage.* 47 | .cache 48 | nosetests.xml 49 | coverage.xml 50 | *.cover 51 | *.py,cover 52 | .hypothesis/ 53 | .pytest_cache/ 54 | 55 | # Translations 56 | *.mo 57 | *.pot 58 | 59 | # Django stuff: 60 | *.log 61 | local_settings.py 62 | db.sqlite3 63 | db.sqlite3-journal 64 | 65 | # Flask stuff: 66 | instance/ 67 | .webassets-cache 68 | 69 | # Scrapy stuff: 70 | .scrapy 71 | 72 | # Sphinx documentation 73 | docs/_build/ 74 | 75 | # PyBuilder 76 | target/ 77 | 78 | # Jupyter Notebook 79 | .ipynb_checkpoints 80 | 81 | # IPython 82 | profile_default/ 83 | ipython_config.py 84 | 85 | # pyenv 86 | .python-version 87 | 88 | # pipenv 89 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 90 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 91 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 92 | # install all needed dependencies. 93 | #Pipfile.lock 94 | 95 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 96 | __pypackages__/ 97 | 98 | # Celery stuff 99 | celerybeat-schedule 100 | celerybeat.pid 101 | 102 | # SageMath parsed files 103 | *.sage.py 104 | 105 | # Environments 106 | .env 107 | .venv 108 | env/ 109 | venv/ 110 | ENV/ 111 | env.bak/ 112 | venv.bak/ 113 | 114 | # Spyder project settings 115 | .spyderproject 116 | .spyproject 117 | 118 | # Rope project settings 119 | .ropeproject 120 | 121 | # mkdocs documentation 122 | /site 123 | 124 | # mypy 125 | .mypy_cache/ 126 | .dmypy.json 127 | dmypy.json 128 | 129 | # Pyre type checker 130 | .pyre/ 131 | tests/ 132 | tests/output/ 133 | tests/data/ 134 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | #/usr/bin/sh 2 | # Build Arramooz dictionary files 3 | DATA_DIR :=data 4 | DATA_DIR_OUT :=tests/data 5 | RELEASES :=releases 6 | OUTPUT :=tests/output 7 | SCRIPT :=scripts 8 | VERSION=0.1 9 | DOC="." 10 | #~ RULES_CANDIDATES=ArabicCommunErrors0.2.csv 11 | RULES_CANDIDATES=Obikab-classified-0.1.csv 12 | LIBREOFFICE=libreoffice6.3 13 | OBIKAN_DICT=3bykan.csv 14 | 15 | CATEGORY=all 16 | default: all 17 | # Clean build files 18 | clean: 19 | rm -f -r $(RELEASES)/* $(OUTPUT) 20 | backup: 21 | mkdir -p $(RELEASES)/backup$(VERSION) 22 | touch $(RELEASES)/todo.bz2 23 | mv $(RELEASES)/*.bz2 $(RELEASES)/backup$(VERSION) 24 | #create all files 25 | all: ods convert 26 | 27 | # Publish to github 28 | publish: 29 | git push origin master 30 | 31 | ods: 32 | $(LIBREOFFICE) --headless --convert-to "csv:Text - txt - csv (StarCalc):9,34,UTF8" --outdir $(DATA_DIR_OUT)/ $(DATA_DIR)/*.ods 33 | 34 | oneword:CATEGORY=oneword 35 | spell:CATEGORY=spell 36 | gender:CATEGORY=gender 37 | jar:CATEGORY=jar 38 | adj:CATEGORY=adjective 39 | expression:CATEGORY=expression 40 | verb:CATEGORY=verb 41 | trans:CATEGORY=indirect-transitive 42 | double:CATEGORY=double-transitive 43 | 44 | misc:CATEGORY=misc 45 | convert test oneword spell gender expression jar adj verb trans double misc:ods 46 | python3 $(SCRIPT)/grammar_csv2xml.py -d xml -t $(CATEGORY) -v $(VERSION) -f $(DATA_DIR_OUT)/$(RULES_CANDIDATES) > $(OUTPUT)/rules.tmp.xml 47 | xmllint --format $(OUTPUT)/rules.tmp.xml --output $(OUTPUT)/rules-candidates.xml 48 | 49 | ods_obikan: 50 | $(LIBREOFFICE) --headless --convert-to "csv:Text - txt - csv (StarCalc):9,34,UTF8" --outdir $(DATA_DIR_OUT)/ $(DATA_DIR)/*.ods 51 | 52 | #~ obikan:ods_obikan 53 | obikan: 54 | #~ python3 $(SCRIPT)/prepare_3obikan.py -l 200 -f $(DATA_DIR_OUT)/$(OBIKAN_DICT) > $(OUTPUT)/obican_dict.csv 55 | python3 $(SCRIPT)/prepare_3obikan.py -f $(DATA_DIR_OUT)/$(OBIKAN_DICT) -d $(DATA_DIR_OUT)/done.txt > $(OUTPUT)/obican_dict.csv 56 | cut -f4 $(OUTPUT)/obican_dict.csv |sort | uniq -c 57 | cut -f2 $(OUTPUT)/obican_dict.csv |sort | uniq -c 58 | done: 59 | cut -f1 -d= $(DATA_DIR)/done/*.txt |grep -v "^#" |sed '/^$$/d' > /tmp/done.txt 60 | grep "done" $(DATA_DIR_OUT)/$(RULES_CANDIDATES)|cut -f6 >> /tmp/done.txt 61 | strip_tashkeel.sh /tmp/done.txt > /tmp/done.un.txt 62 | sort -u /tmp/done.un.txt > $(DATA_DIR_OUT)/done.txt 63 | messages: 64 | # extract keywords from messages to detect errors categories 65 | strip_tashkeel.sh tests/data/notes.txt > /tmp/notes.txt 66 | tokenize_uniq.sh /tmp/notes.txt | head -n 1000 > tests/data/keywords.txt 67 | 68 | diac:CATEGORY=diac 69 | replace:CATEGORY=diac 70 | word:CATEGORY=word 71 | darja:CATEGORY=darja 72 | added:CATEGORY=added 73 | homophone:CATEGORY=homophone 74 | exp2:CATEGORY=expression 75 | replace diac word darja added exp2 homophone:ods 76 | python3 $(SCRIPT)/grammar_csv2xml.py -t $(CATEGORY) -d replace -v $(VERSION) -f $(DATA_DIR_OUT)/$(RULES_CANDIDATES) > $(OUTPUT)/replaces.debug.txt 77 | grep -v "^$$" $(OUTPUT)/replaces.debug.txt | grep -v "#" > $(OUTPUT)/replaces.candidates.txt 78 | cp $(OUTPUT)/replaces.debug.txt $(OUTPUT)/replaces.$(CATEGORY).debug.txt 79 | cp $(OUTPUT)/replaces.candidates.txt $(OUTPUT)/replaces.$(CATEGORY).txt 80 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Fareh فارح 2 | 3 |
4 | القواعد العربية للتدقيق النحوي والأسلوبي 5 |
6 | Arabic rules database for grammar and style checking 7 | 8 | ## Description 9 | Fareh is a database of rules applied to check grammar and languaage checking, it contains list of common errors patterns. 10 | 11 | It will be used especially for LanguageTool grammar and style checker.[LanguageTool grammar and style checker.](http://languagetool.org) 12 | 13 | #### Developpers: 14 | Taha Zerrouki: http://tahadz.com 15 | taha dot zerrouki at gmail dot com 16 | 17 | Sohaib Afifi: http://sohaibafifi.com 18 | 19 | Features | value 20 | ------------|--------------------------------------------------------------------------- 21 | Authors | [Authors.md](https://github.com/linuxscout/fareh/master/AUTHORS.md) 22 | Release | 0.1 23 | License |[GPL](https://github.com/linuxscout/fareh/master/LICENSE) 24 | Tracker |[linuxscout/Fareh/Issues](https://github.com/linuxscout/fareh/issues) 25 | 26 | 27 | 28 | 29 | ## Citation 30 | If you would cite it in academic work, can you use this citation 31 | ``` 32 | T. Zerrouki‏, S. Afifi, Fareh: Arabic rules database for grammar and style checking, https://github.com/linuxscout/fareh/, 2019 33 | ``` 34 | or in bibtex format 35 | ```bibtex 36 | @misc{zerrouki2019Fareh, 37 | title={Fareh, Arabic mophological generator Library for python.}, 38 | author={Zerrouki, Taha and Afifi Sohaib}, 39 | url={https://github.com/linuxscout/fareh}, 40 | year={2019} 41 | } 42 | ``` 43 | ## Applications 44 | * Grammar checking 45 | * Common error checking 46 | 47 | ## Features مزايا 48 |
49 | 50 | - تسهيل بناء قواعد بصيغة xml لإثراء برنامج أداة اللغة 51 | - صيغة مقروءة برمجيا 52 | - متابعة التقدم في بناء القواعد 53 | 54 |
55 | - Facilitate build rules in xml format for LanguageTool grammar checker. 56 | - Machine readable format 57 | - Advancement tracking in rules building 58 | 59 | 60 | 61 | 62 | ### Requirements 63 | - PyArabic: Arabic language tools library : http://pypi.pyton/pyarabic 64 | 65 | 66 | 67 | 68 | ## أصل التسمية 69 | 70 |
71 | سمي هذا البرنامج نسبة إلى الشيخ محمد فارح الجزائري، أستاذ صحفي لغوي أشتهر بعمله في التدقيق اللغوي وإعداده برنامجا إذاعيا "لغتنا الجميلة" في الإذاعة الجزائرية. 72 | 73 | [المزيد عن الشيخ محمد فارح](doc/mohamed_fareh.md) 74 |
75 | 76 | Usage 77 | ===== 78 | 1- Edit rules file 79 | Rules file is edited in data directory as open document format. 80 | 81 | 2- Build candidate rules in xml format: 82 | 83 | ```sh 84 | make test 85 | ``` 86 | 87 | 88 | ### Files 89 | 90 | * file/directory category description 91 | 92 | * data/ A list of rules files 93 | 94 | * data/done A list of rules files already treated, it an be reviewed to fix some errors, or to avoid duplicated rules 95 | 96 | * data/original original source files saved as archive 97 | 98 | * data/ArabicCommunErrors0.2.ods to add new rules as fields, or an other files with similar format 99 | 100 | 101 | 102 | 103 | 104 | -------------------------------------------------------------------------------- /data/ArabicCommunErrors0.2.ods: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linuxscout/fareh/e8ba93c4b343a328632d31e0fb5d494f653dbb2d/data/ArabicCommunErrors0.2.ods -------------------------------------------------------------------------------- /data/Diacritics0.1.ods: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linuxscout/fareh/e8ba93c4b343a328632d31e0fb5d494f653dbb2d/data/Diacritics0.1.ods -------------------------------------------------------------------------------- /data/arabic_tags.txt: -------------------------------------------------------------------------------- 1 | Description of Arabic tag sets 2 | ============================= 3 | The arabic tag sytax for grammar check is composed of 4 parts 4 | 5 | The tag starts by word class 6 | for example 7 | V: Verb 8 | N: Noun 9 | P: tool or partical 10 | 11 | Nouns 12 | ====== 13 | 14 | 3 parts: 15 | ====== 16 | * word class and category 17 | * Conjugation ( suffixes used to conjugate words in dual form, feminin form). 18 | * Affixes ( prefixes and encletics) 19 | 20 | 21 | 22 | Word class and category: 23 | ====== 24 | define the attributes of word in dictionary, for example, 25 | contains 3 parts 26 | - Word type: 27 | N: noun, 28 | V: verb, 29 | P: particle 30 | - Word sub class: 31 | M Masdar مصدر 32 | A Adjective صفة 33 | A Adjective similair صفة مشبهة 34 | A Adjective superlative صيغة مبالغة 35 | A maf3oul اسم مفعول 36 | A fa3il اسم فاعل 37 | P Proper Noun اسم علم 38 | S Superlative اسم تفضيل 39 | J jamid جامد 40 | - Not used 41 | 42 | 43 | Noun conjugation : 4 letters 44 | ====== 45 | - Gender suffix: 46 | M: masculine ( ون is a mark of masculine) 47 | F: feminine (ة or ات) 48 | -: none 49 | - Number suffix: 50 | 1: single 51 | 2: dual 52 | 3: plural ( regular masculine or feminine plural, or irregular plural) 53 | 3I: irregular plural form 54 | - Case ( إعراب) 55 | U marfou3 مرفوع 56 | 0 manjzoum مجزوم 57 | I majrour مجرور 58 | A mansoub منصوب 59 | B mabni مبني 60 | - undef لاشيء 61 | - Inflection Mark علامة الإعراب 62 | u damma الضمة 63 | a fatha الفتحة 64 | i kasra الكسرة 65 | 0 sukun السكون 66 | U dammatan تنوين الضمة 67 | e fathatan تنوين الفتحة 68 | E alef_fathatan تنوين الألف 69 | I kasratan تنوين الكسرة 70 | A alef الألف 71 | W waw الواو 72 | Y yeh الياء 73 | N noon ثبوت النون 74 | - undef لاشيء 75 | 76 | Noun prefixes and encletic : 77 | ============= 78 | contains 3 parts 79 | W: conjonction: starts by WAW or FEH, take 3 values: W: for waw, F; for Feh, -: none. 80 | B: preposition: B: for Beh, K: for Kaf, L: for Lam, by default we use B, -: none. 81 | L/H: definite article, L: for AL, H: attached pronouns -: none. 82 | H : define the extended words added to the lexem: الضمائر المضافة 83 | H: if have encletic 84 | 85 | Example: 86 | شرفك شرف NS-;M3U-;--H 87 | شرفي شرف NS-;M3U-;--- 88 | الشرف شرف NS-;M3A-;--L 89 | شرفتك شرف NS-;F3A-;--H 90 | شرف شرف NS-;M3U-;--- 91 | شرفين شرف NS-;M3I-;--- 92 | بالشرف شرف NS-;M3I-;-BL 93 | الشرفي شرف NS-;M3A-;--L 94 | شرف شرف NS-;M3A-;--- 95 | شرفي شرف NS-;M3A-;--- 96 | 97 | 98 | 99 | 100 | 101 | 102 | Verbs 103 | ===== 104 | Word class + conjugation + affixes 105 | 106 | verb Word class : 107 | ============= 108 | Word type: V 109 | verb class: 110 | N invariable فعل جامد 111 | H heart أفعال القلوب 112 | R probability أفعال الظن 113 | T Tranfert أفعال التحويل 114 | I initiative أفعال الشروع 115 | W Weak معتل 116 | transitivity: 117 | 0 intransitive لازم 118 | 1 transitive متعدي 119 | 2 double transitive متعدي لمفعولين 120 | 4 commun مشترك 121 | تعدي undef لاشيء 122 | 123 | verb conjugation : 124 | ============= 125 | # Conjugation 126 | ## Gender الجنس 127 | M masculine مذكر 128 | F Feminine مؤنث 129 | - none لاشيء 130 | ## Number العدد 131 | 1 single مفرد 132 | 2 dual مثنى 133 | 3 plural جمع 134 | 4 plural جمع تكسير 135 | - none لاشيء 136 | ## Inlfection case الحالة الإعرابية 137 | U marfou3 مرفوع 138 | 0 manjzoum مجزوم 139 | I majrour مجرور 140 | A mansoub منصوب 141 | B mabni مبني 142 | - undef لاشيء 143 | ## Inflection marks 144 | u damma الضمة 145 | a fatha الفتحة 146 | i kasra الكسرة 147 | 0 sukun السكون 148 | U dammatan تنوين الضمة 149 | e fathatan تنوين الفتحة 150 | E alef_fathatan تنوين الألف 151 | I kasratan تنوين الكسرة 152 | A alef الألف 153 | W waw الواو 154 | Y yeh الياء 155 | N noon ثبوت النون 156 | - undef لاشيء 157 | ## tense الزمن 158 | p past ماض 159 | f present مضارع 160 | i imperative أمر 161 | - undef لاشيء 162 | 163 | ## Voice البناء 164 | a acive voice معلوم 165 | p acive voice مجهول 166 | - undef لاشيء 167 | 168 | ## person الشخص 169 | I 1st person متكلم 170 | Y 2nd person مخاطب 171 | H 3rd person غائب 172 | - undef لاشيء 173 | 174 | Affixes ( Procletic + Ecletic) 175 | ====== 176 | Verb procletic : 177 | ============= 178 | W: conjonction: starts by WAW or FEH, take 3 values: W: for waw, F; for Feh, -: none. 179 | S: future prefix, س+يتعلم 180 | Verb encletic : 181 | ============= 182 | define the extended words added to the lexem: الضمائر المضافة 183 | H: if have encletic 184 | 185 | -------------------------------------------------------------------------------- /data/dictionaries/المصادر.ods: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linuxscout/fareh/e8ba93c4b343a328632d31e0fb5d494f653dbb2d/data/dictionaries/المصادر.ods -------------------------------------------------------------------------------- /data/done/coherency.txt: -------------------------------------------------------------------------------- 1 | # Words that have two valid spellings in one locale(refer to https://github.com/languagetool-org/languagetool/issues/834). Used by WordCoherencyRule. 2 | # This file must be encoded in UTF-8. 3 | # NOTE: 4 | # 1) The comparison between two variants is based on the word's base form 5 | # (Hence, variants which have the same base form such as 'cancelled' and 'canceled' are [currently] not detected) 6 | # 2) to find fullforms those forms may need to be added to added.txt 7 | # absinth;absinthe: https://wikidiff.com/absinth/absinthe 8 | شؤون;شئون 9 | الشؤون;الشئون 10 | ظَنَّ;ضَنَّ 11 | مسؤول;مسئول 12 | الذي;الذى 13 | تركية;تركيا 14 | -------------------------------------------------------------------------------- /data/done/darja.txt: -------------------------------------------------------------------------------- 1 | # Format: word=suggestion1|suggestion2|suggestion3... 2 | # Simple replace table for Arabic dialects العامية والدارجة 3 | # This is only for words that are not caught by spell checker 4 | أبجورة=ظُلّة أبجورة أجنبية والعربي ظُلّة 5 | أبلة=معلمة|مُدَرِّسَة لأن الأبلة كلمة تركية معناها المعلمة والمدرسة، وهي في اللغة العربية تدل على الثقل والوخامة في الطعام 6 | أتوبيس=حافلة 7 | أتيكيت=لصيقة|بطاقة الأتيكيت فرنسية، واللصيقة أو البطاقة عربي 8 | أجندة=مُذَكِّرَة|مُفَكِّرَة 9 | أرشيف=محفوظات أصل الكلمة إنجليزي هو Archive 10 | إستاد=ملعب 11 | استوديو=مَرْسَمْ 12 | إسفلت=زفت 13 | إشارب=وِشاح|وُشاح|إِشاح فالإشارب هو الاسم الفرنسي المعرب 14 | أطلنطي=أطلسي فالأطلسي هو الاسم الذي أطلقه عليه العرب، نسبة إلى سلسلة الجبال في شمال إفريقيا 15 | أكي=مُوَافِقٌ 16 | الأبلة=المعلمة|المُدَرِّسَة لأن الأبلة كلمة تركية معناها المعلمة والمدرسة، وهي في اللغة العربية تدل على الثقل والوخامة في الطعام 17 | الأتوبيس=الحافلة كلمة إنجليزية Bus 18 | الأتيكيت=اللصيقة|البطاقة الأتيكيت فرنسية، واللصيقة أو البطاقة عربي 19 | الأرشيف=المحفوظات أصل الكلمة إنجليزي هو Archive 20 | الإشارب=الوِشاح|الوُشاح|الإِشاح فالإشارب هو الاسم الفرنسي المعرب 21 | الأطلنطي=الأطلسي فالأطلسي هو الاسم الذي أطلقه عليه العرب، نسبة إلى سلسلة الجبال في شمال إفريقيا 22 | الباروكة=الشعر المستعار فالباروكة اسم فرنسي معرّب: Perruque 23 | الباص=الحافلة كلمة إنجليزية Bus 24 | البجامة=المنامة لأن البجامة أو البيجامة كلمة ليست عربية 25 | البدروم=السرداب بدرون وبدروم اسمان فارسيان معربان من "بيدون" 26 | البدرون=السرداب بدرون وبدروم اسمان فارسيان معربان من "بيدون" 27 | البرواز=الإطار 28 | البروتوكول=العرف|المراسم لأن البروتوكول كلمة إغريقية 29 | البلكون=الشُّرْفَة الاسم المعرّب 30 | البند=المادة|الفقرة لأن كلمة "بند" فارسية معربة 31 | البنسل=القلم|قلم الرصاص كلمة إنجليزية Pencil، وعربيها القلم أو قلم الرصاص 32 | البنك=المصرف كلمة إيطالية عربيها المصرف 33 | البنوار=المقصورة الأولى بَنوار اسم فرنسي معرّب 34 | البوفيه=المَقْصِف لأن "بوفيه" كلمة إنجليزية: Buffet وقد وضع لها كلمة "مَقْصِف" 35 | البوليس=الشُرَطَة|الشُرَطي|الشُرْطي إذ كلمة "بوليس" كلمة إنجليزية: Police 36 | ألبوم=سِجِلُّ الصور 37 | ألبوم=مجموعة الصور فالألبوم اسم معرّب من اللغات الإنجليزية والفرنسية والألمانية 38 | البيبرون=الرضّاعة البيبرون اسم فرنسي معرّب 39 | البيجامة=المنامة لأن البجامة أو البيجامة كلمة ليست عربية 40 | البيسين=مسبح البيسين الاسم الفرنسي المعرّب 41 | التراتوار=الرَّصِيف التراتوار الاسم الفرنسي المعرّب 42 | الترمس=الزجاجة العازلة|كاظمة|كظيمة اسم أجنبي معرّب 43 | الترموس=الزجاجة العازلة|كاظمة|كظيمة اسم أجنبي معرّب 44 | الترمومتر=ميزان الحرارة|مِحْرَار الترمومتر اسم معرّب 45 | التكنولوجيا=التِقَانَة كلمة "تكنولوجيا كلمة إنجليزية، يقابلها في العربية تِقانة على وزن "فِعالة"، و"التِّقني، التِّقنية".من "تِقْن" أي حاذق 46 | التلسكوب=مِرْقَب|مِنْظار|مقراب الاسم الذي أطلقه مجمع اللغة العربية بالقاهرة 47 | الجاكيت=الرِّدَاء|السُّتْرَة الجاكيت هو الاسم المعرب عن اللغة الفرنسية 48 | الجرسون=النّادل لأنه اسم فرنسي معرّب 49 | الدسك=الطَّبَق طَبَق" الغضروف بين كل فقرتين من فقار الظهر 50 | الدسك=طَبَق "طَبَق" الغضروف بين كل فقرتين من فقار الظهر 51 | الدكتاتور=الطاغية|المستبد فكلمة "دكتاتور" لاتينية الأصل، تطلق على الحكام في الحالات العصيبة 52 | الدوبلاج=دبلجة دبلجة أو ازدواج 53 | الدوسييه=الملف|الإضبارة لأن الدوسييه اسم فرنسي "dossier" والفايل كلمة إنجليزية "file" 54 | الديسك=القرص كلمة إنجليزية Disc 55 | الروتين=الرَّتابَة 56 | الروتين=الرتابة|التكرار أصل الكلمة إنجليزي هو Routine 57 | الريبورتاج=التحقيق الصُّحُفي|التقرير الصحفي 58 | الريجيم=الحمية 59 | السرفيس=الطَّقْم 60 | السكرتير=الأمين|أمين السر|كاتب السر فكلمة سكرتير كلمة معرّبة 61 | السمنار=حلقة البحث|يوم دراسي|لقاء علمي|ندوة السمنار كلمة غير عربية، اسم علم 62 | السيفون=صُنْدُوق الطَّرْد 63 | الطربيد=النَّسِيفَة كلمة "الطُّربيد" من أصل لاتيني 64 | الفاكس=الناسخ|الناسوخ الفاكس كلمة أنجليزية، تعريبها الناسوخ 65 | الفايل=الملف|الإضبارة لأن الدوسييه اسم فرنسي "dossier" والفايل كلمة إنجليزية "file 66 | القاشاني=الخزف المصقول 67 | القيشاني=الخزف المصقول 68 | الكابين=المقصورة اسم فرنسي وإنجليزي معرّب 69 | الكازينو=النادي 70 | الكباريه=الملهى الليلي اسم فرنسي معرّب 71 | الكراج=حظيرة السيارات|المِرْأَب اسم إنجليزي وفرنسي معرّب 72 | الكلوروفيل=اليَخْضُور 73 | الكمبارس=ممثل ثانوي اسم فرنسي معرّب 74 | الكمبيوتر=الحاسوب أصل الكلمة إنجليزي هو Computer 75 | الكنبة=الأريكة فالكنبة أخذتها الفرنسية عن اللاتينية واليونانية، يقول تعالى: "هم وأزواجهم على الأرائك" 76 | الكوبري=الجسر|القنطرة كوبري كلمة غير عربية، عربيها الجسر أو القنطرة 77 | الكورة الأرضية=الكرة الأرضية 78 | الكومودينو=الصِّوانة 79 | اللوج=المقصورة الثانية 80 | الماكيت=نموذج|مُجَسَّم اسم فرنسي معرّب 81 | المانشيت=العنوان الرئيس اسم فرنسي معرّب 82 | المايسترو=قائد الجوق اسم أعجمي معرّب 83 | المذهب الرومانسي=المذهب الابتداعي رومانس كلمة غربية، والصواب ما أقره المجمع، فهو عربي 84 | الميلودراما=المَشْجَاة 85 | الميلودرام=المَشْجَاة 86 | النقانق=السُّجُق 87 | النوت بك=المذكرة|المفكرة كلمة إنجليزية NOTE ، Notebook 88 | النوتة=المذكرة|المفكرة كلمة إنجليزية NOTE ، Notebook 89 | النيجاتيف=السَّلْبِيَّة الصورة السلبية 90 | اليانسون=الأنيسون|الآنسون كلمة "اليانسون" عامية غير واردة في كتب اللغة 91 | أنترنت=الشَّابِكة، (وهو المصطلح المعتَمَدُ مِن طرف مكتب تنسيق التعريب عِوَضَ لَفْظَة انترنت). 92 | إنسكلوبيديا=موسوعة|دائرة معارف 93 | انفلونزا=رَشْحَة برد|نزلة برد 94 | أوبرا=مسرحية غنائية 95 | أوتوبيس=حافلة 96 | أوتوماتيك=تلقائية|آلي تلقائي، آلي 97 | أوتوماتيكي=تلقائي 98 | باراشوت=مِظَلة الهبوط 99 | بارتاج=مُشاركة 100 | باروكة=شعر المستعار فالباروكة اسم فرنسي معرّب: Perruque 101 | باص=حافلة كلمة إنجليزية Bus 102 | بالطو=مِعْطف 103 | بالون=مِنْطاد 104 | بترول=نَفْط 105 | بجامة=منامة لأن البجامة أو البيجامة كلمة ليست عربية 106 | بدروم=سرداب بدرون وبدروم اسمان فارسيان معربان من "بيدون" 107 | بدرون=سرداب بدرون وبدروم اسمان فارسيان معربان من "بيدون" 108 | برشامة=مُسْوَدَّة|مُسَوَّدة|كبسولة دواء 109 | برواز=إطار 110 | بروتوكول=عرف|مراسم لأن البروتوكول كلمة إغريقية 111 | بروفات=تجربة|تجارب فالبروفة كلمة أعجمية 112 | بروفة=تجربة|تجارب فالبروفة كلمة أعجمية 113 | بس=حسبك|اكففْ|مَهْ فكلمة "بَسْ" فارسية الأصل 114 | بلكون=شُرْفَة 115 | بلكون=شُرفة 116 | بلكون=شُرْفَة الاسم المعرّب 117 | بنج=مُخدّر للجراحة 118 | بند=مادة|فقرة لأن كلمة "بند" فارسية معربة 119 | بنسل=قلم كلمة إنجليزية Pencil، وعربيها القلم أو قلم الرصاص 120 | بنك=مصرف كلمة إيطالية عربيها المصرف 121 | بنوار=مقصورة الأولى بَنوار اسم فرنسي معرّب 122 | بورتريه=بطاقة فنية|لوحة فنية 123 | بوفيه=مَقْصِف لأن "بوفيه" كلمة إنجليزية: Buffet وقد وضع لها كلمة "مَقْصِف" 124 | بوليس=شُرَطَة|شُرَطي|شُرْطي إذ كلمة "بوليس" كلمة إنجليزية: Police 125 | بيبرون=رضّاعة البيبرون اسم فرنسي معرّب 126 | بيجامة=مَنَامَة 127 | بيجامة=منامة لأن البجامة أو البيجامة كلمة ليست عربية 128 | بيسين=مسبح البيسين الاسم الفرنسي المعرّب 129 | تراتوار=رَصِيف التراتوار الاسم الفرنسي المعرّب 130 | ترمس=زجاجة العازلة|كظيمة اسم أجنبي معرّب 131 | ترموس=زجاجة العازلة اسم أجنبي معرّب 132 | ترمومتر=ميزان الحرارة|مِحْرَار الترمومتر اسم معرّب 133 | تكاية=مِخَدَّة|وِسادة 134 | تكنولوجيا=تِقَانَة كلمة "تكنولوجيا كلمة إنجليزية، يقابلها في العربية تِقانة على وزن "فِعالة"، و"التِّقني، التِّقنية".من "تِقْن" أي حاذق 135 | تلسكوب=مِرْقَب|مِنْظار|مقراب الاسم الذي أطلقه مجمع اللغة العربية بالقاهرة 136 | تلفون=هاتِف 137 | جاكيت=رِدَاء|سُتْرَة الجاكيت هو الاسم المعرب عن اللغة الفرنسية 138 | جرسون=نادل لأنه اسم فرنسي معرّب 139 | جيم=إعجاب 140 | خان=فُندق 141 | دبلوم=شهادة|إجازة حيث إن الدبلوم كلمة من الدخيل 142 | دفاية=مدفأة 143 | دكتاتور=طاغية|مستبد فكلمة "دكتاتور" لاتينية الأصل، تطلق على الحكام في الحالات العصيبة 144 | دكتاتوري=جبّار|حكم جباريّ دكتاتور كلمة غير عربية، عربيها المستبد أو الجبار 145 | دوبلاج=دبلجة دبلجة أو ازدواج 146 | دوخة=دُوَّار 147 | دوسييه=ملف|إضبارة لأن الدوسييه اسم فرنسي "dossier" والفايل كلمة إنجليزية "file" 148 | دولاب=خِزانة الخزانة أفضل 149 | ديبلوم=شهادة 150 | ديسك=قرص كلمة إنجليزية Disc 151 | ديلايت=حذفْ 152 | راديو=مِذياع 153 | ربورتاج=التحقيق الصُّحُفي|التقرير الصحفي|الاستطلاع 154 | رتوش=لَمَسَات 155 | رجيم=حِمْيَة 156 | روبرتاج=استطلاع 157 | روتين=رَتَابَة 158 | روتين=رَتابَة 159 | روتين=رتابة|تكرار أصل الكلمة إنجليزي هو Routine 160 | روكورد=جهاز التسجيل 161 | رومانسية=شاعريَّة 162 | رومانسية=شاعرية 163 | رومانسي=شاعري 164 | ريبورتاج=تحقيق صُحُفي|تقرير صحفي|استطلاع 165 | ريجيم=حمية 166 | ساندوتش=شطيرة 167 | سبيطار=مستشفى 168 | سراي=دار فأصل كلمة "سراي" من سرايا جمع سرية، وهي قطعة من الجيش 169 | سرفيس=طَقْم 170 | سكانر=ماسح ضوئي 171 | سكرتير=أمين فكلمة سكرتير كلمة معرّبة 172 | سمنار=حلقة البحث|يوم دراسي|لقاء علمي|ندوة السمنار كلمة غير عربية، اسم علم 173 | سندويتش=شَطِيرَة 174 | سوبر=عِملاق|خارق 175 | سيفون=صُنْدُوق الطَّرْد 176 | سيناريو=النص السينمائي 177 | شرشف=غِطاء 178 | شلة=ثُلَّة 179 | شهادة الباكالوريوس=شهادة الإجازة 180 | شير=مُشارَكَة 181 | صالة=بَهْو 182 | صالونات=مَجالِس|نَوادي 183 | طابور=زُمْرَة|جماعة|ثُلَّة|طائِفة|حِزْب 184 | طابوهات=محظورات|مُحرمات|مَمنوعات 185 | طاسة=وِعَاء|إنَاء 186 | طبنجة=مُسَدَّسْ 187 | طربيد=نَسِيفَة كلمة "الطُّربيد" من أصل لاتيني 188 | طرشي=فلفل حلو 189 | فاتورة=وَرقة الحساب|بَيَانُ الحساب 190 | فاكس=ناسخ|ناسوخ الفاكس كلمة أنجليزية، تعريبها الناسوخ 191 | فايدة=فائدة 192 | فايل=ملف|إضبارة لأن الدوسييه اسم فرنسي "dossier" والفايل كلمة إنجليزية "file" 193 | فحص إكلينيكي=فَحْصٌ سَرِيرِيّ 194 | فلاشة=شَريحة إلكترونية 195 | فيتو=نَقْض 196 | فيزا=تأشيرة|إذن دخول لأن كلمة "فيزا: Visa" كلمة إنجليزية 197 | فيش=قَابِس كهربائي|مِشْبَكْ كهربائي 198 | فيلا=دَارَة 199 | قاشاني=خزف المصقول 200 | قيشاني=خزف المصقول 201 | كابين=مقصورة اسم فرنسي وإنجليزي معرّب 202 | كادر=إطار|أُطُر ف "كادر" كلمة فرنسية، عربيها الإطار، جمعه أطر 203 | كارت=بِطاقة 204 | كازينو=نادي 205 | كباريه=ملهى الليلي اسم فرنسي معرّب 206 | كراج=مِرْأَب اسم إنجليزي وفرنسي معرّب 207 | كرباج=سوط كلمة دخيلة على اللغة العربية 208 | كرونومتر=مِيقاتة 209 | كشكول=كُرَّاسَة 210 | كلاسيكي=عَتِيق|قديم|بدائي 211 | كلوروفيل=يَخْضُور 212 | كمبارس=ممثل ثانوي اسم فرنسي معرّب 213 | كمبيوتر=حاسوب أصل الكلمة إنجليزي هو Computer 214 | كنبة=أريكة فالكنبة أخذتها الفرنسية عن اللاتينية واليونانية، يقول تعالى: "هم وأزواجهم على الأرائك" 215 | كوادر=إطار|أُطُر ف "كادر" كلمة فرنسية، عربيها الإطار، جمعه أطر 216 | كوبري=جسر|قنطرة كوبري كلمة غير عربية، عربيها الجسر أو القنطرة 217 | كورس=مَطبوع|مُلخص 218 | كومبيوتر=حاسوب 219 | كومنت=تَعْلِيق 220 | كومودينو=صِوانة 221 | لايك=إعجاب 222 | لمبة=مِصباح 223 | لوج=مقصورة ثانية 224 | ماركة=عَلامَة 225 | ماكيت=نموذج|مُجَسَّم اسم فرنسي معرّب 226 | مانشيت=عنوان الرئيس اسم فرنسي معرّب 227 | مايسترو=قائد الجوق اسم أعجمي معرّب 228 | مخدة=وِسادة 229 | مرجيحة=أًرْجُوحَة 230 | موديل=نَوْع|نَموذج 231 | ميلودراما=مَشْجَاة 232 | ميلودرام=مَشْجَاة 233 | نقانق=سُجُق 234 | نوت بك=مذكرة|مفكرة كلمة إنجليزية NOTE ، Notebook 235 | نوتة=مذكرة|مفكرة كلمة إنجليزية NOTE ، Notebook 236 | نوتة=نصّ الموسيقيّ 237 | نيجاتيف=سَلْبِيَّة الصورة السلبية 238 | هيلكوبتر=طائرة عمودية|مِروحية 239 | ولاعة=قَدَّاحَة 240 | يافطة=لافِتَةُ إِعْلان|لوحة إشهار 241 | يانسون=أنيسون|آنسون كلمة "اليانسون" عامية غير واردة في كتب اللغة 242 | -------------------------------------------------------------------------------- /data/done/diacritics.txt: -------------------------------------------------------------------------------- 1 | 2 | # For notes, refer to https://github.com/sohaibafifi/languagetool/issues/21 3 | # we can use it to handle ambiguation case 4 | # words with diacritics 5 | # word with corrected diacritization 6 | ابنة عمران=آل عِمْرَان|ابنة عِمران آل عِمْرَان|ابنة عِمران بكسر العين 7 | ابن خلكان=ابن خَلِّكان ابن خَلِّكان اسم علم بفتح الخاء وكسر اللام المضعفة 8 | أبو نواس=أبو نُوَاس أبو نُوَاس بضم النون 9 | أبونواس=أبو نُوَاس أبو نُوَاس بضم النون 10 | أحادي اللغة=أُحادِيّ اللغة|أُحَادِيّة اللغة فالنسب هنا إلى أُحَاد، ف "فُعَالِيّ وفُعَالِيّة" فنقول: ثُنائِيّ وثُنَائِيّة، ثُلَاثِيّ وثُلَاثِيّة، رُبَاعِيّ ورُبَاعِيّة، خُمَاسِيّ وخُمَاسِيّة... عُشَارِيّ وعُشَارِيّ 11 | أحادية اللغة=أُحادِيّ اللغة|أُحَادِيّة اللغة فالنسب هنا إلى أُحَاد، ف "فُعَالِيّ وفُعَالِيّة" فنقول: ثُنائِيّ وثُنَائِيّة، ثُلَاثِيّ وثُلَاثِيّة، رُبَاعِيّ ورُبَاعِيّة، خُمَاسِيّ وخُمَاسِيّة... عُشَارِيّ وعُشَارِيّ 12 | أحجية=أُحْجِيَّة الأُحْجِيَّة بتشديد الياء 13 | أحمد الصباح=الأحمد الصُّبَاح|أحمد الصُّبَاح|آل الصُّبَاح حكام الكويت من آل الصُّبَاح بضم الصاد. 14 | أخطبوط=أُخْطُبوط الأُخْطُبوط بضم الألف والطاء 15 | إربا إربا=إرْبًا إرْبًا إرْبًا بتسكين الراء 16 | أردن=أرْدُنّ نون الأردن مضعفة، وليست مخففة 17 | أردني=أُرْدُنّيّ نون الأردن مضعفة، وليست مخففة 18 | استووا يرحمكم الله=استووا يرْحَمْكم الله لأن "يرحمْكم" مجزوم في جواب الطلب 19 | أكفاء=أكْفاء|أكفياء|كُفاة 20 | الأحجية=الأُحْجِيَّة الأُحْجِيَّة بتشديد الياء 21 | الأحمد الصباح=الأحمد الصُّبَاح|أحمد الصُّبَاح|آل الصُّبَاح حكام الكويت من آل الصُّبَاح بضم الصاد. 22 | الأخطبوط=الأُخْطُبوط الأُخْطُبوط بضم الألف والطاء 23 | الأردن=الأُرْدُنّيّ|الأرْدُنّ نون الأردن مضعفة، وليست مخففة 24 | الأردني=الأُرْدُنّيّ|الأرْدُنّ نون الأردن مضعفة، وليست مخففة 25 | الأكفاء=الأكْفاء|الأكفياء|الكُفاة 26 | آل الصباح=الأحمد الصُّبَاح|أحمد الصُّبَاح|آل الصُّبَاح حكام الكويت من آل الصُّبَاح بضم الصاد. 27 | الإمام النسائي=الإمام النَّسائي 28 | البترول=البِترول البِترول بكسر الباء والأفصح النفط 29 | البحبوحة=البُحْبُوحَة بُحبوحة بضم الباء الأولى 30 | البحة=البُحَّة البُحَّة بضم الباء 31 | البخور=البَخُور البَخُور دون تشديد الخاء 32 | البدء=البَدْء البَدْء بالفتح من الفعل بدأ يبدأ 33 | البذرة=البَذْرَة البَذرة بفتح الباء 34 | البرسيم=البِرسيم البِرسيم بكسر الباء 35 | البرغوث=البُرغوث 36 | البرميل=البِرْمِيل البِرْمِيل بكسر الباء 37 | البرنامج=البرنامَج فارسية "برنامة" عُرِّبت إلى برنامَج بفتح الميم 38 | البزة=البِزَّة البزة بكسر الباء، الثياب والسلاح والهيئة 39 | البس=البَسّ البَسّ هو الهِرّة الأهلية بفتح الباء 40 | البشرة=البَشَرَة البَشَرَة بفتح الباء والشين، جلد الإنسان 41 | البطريق=البِطْرِيق البِطْرِيق بكسر الباء طيور تعيش في الماء 42 | البعاد=البِعاد البِعاد بكسر الباء، مثل أضناه البِعاد 43 | البعثة=البَعثة البَعثة بفتح الباء 44 | البنج=البَنْج|المخدّر فالبَنج بفتح الباء نبات مخدر 45 | البنى=البِنَى البِنَى بكسر الباء جمع بِنْيَة 46 | البهرج=البَهرَج البَهرَج بفتح الباء هو الباطل الرديء الزائف 47 | البوتقة=البُوْتَقَة البُوتقة بضم الباء 48 | البيطار=البَيطار البَيْطار بفتح الباء طبيب بيطري 49 | التجارب=التجارِب 50 | التجوال=التَّجْوال التَّجْوال بفتح التاء 51 | التخمة=التُّخَمَة التُخَمَة بفتح الخاء 52 | التذكار=التَّذْكار التَّذْكار بفتح التاء مصدر للفعل (ذكر) 53 | التذكرة=التَّذْكِرَة تَذْكِرَة بكسر الكاف 54 | الترجمة=التَّرْجَمَةً ترجَمة بفتح الجيم 55 | الترس=التُّرْس التُّرْس بضمّ التاء 56 | التعليم المهني=التعليم المِهْنِيّ لأن النسب إلى "مِهْنَة" بكسر الميم 57 | التلمود=التَّلْمُود التَّلْمُود بالفتح كتاب يضم شرائع اليهود 58 | التنبل=التِّنْبَل التِّنْبَل بكسر التاء خامل الذِّكر 59 | الثغرة=الثُّغْرَة الثُّغْرَة بضم الثاء 60 | الثقب=الثَّقب 61 | الثكنة=الثُّكْنَة الثُّكْنَة بضم الثاء 62 | الجبن=الجُبْن|الجُبُن|الجُبْنة الجُبْنُ بالضم 63 | الجبنة=الجُبْن|الجُبُن|الجُبْنة الجُبْنُ بالضم 64 | الجعبة=الجَعْبة الجَعبة بالفتح أصوب 65 | الجفن=الجَفْن الجَفن بفتح الجيم 66 | الجمهور=الجَمهور الجُمهور بضم الجيم 67 | الجنوب=الجَنُوب الجَنُوب بفتح الجيم 68 | الجهبذ=الجِهْبِذ الجِهبذ بكسر الجيم 69 | الجهوري=الجَهْوَري 70 | الحافة=الحافَة الحافة دون تشديد الفاء 71 | الحزمة=الحُزْمَة الحُزْمَة بضم الحاء، مثل حُزمة الحطب. 72 | الحساء=الحَساء الحِساء بكسر الحاء 73 | الحضن=الحِضن 74 | الحطام=الحُطَام الحُطَام بضم الحاء 75 | الحقبة=الحِقْبَة الحِقْبَة بكسر الحاء 76 | الحلقات=الحلَقات لأن الكلمة المفردة التي على وزن فَعْلَة "حَلْقة" صحيحة العين، فإنها عند جمعها جمع مؤنث سالمًا يجب تحريك عين الكلمة بالفتح إتباعًا لفائها 77 | الحلقوم=الحُلْقُوم الحُلقوم بضم الحاء كقوله تعالى: "فلولا إذا بلغت الحلقوم" 78 | الحلويات=الحَلْوَيَات جمع حلوى "حَلْوَيَات" على غرار نَجْوَى نَجْوَيَات، وسلوى سلويات 79 | الحمة=الحُمَة 80 | الحمص=الحِمِّص|الحِمَّص الحِمِّص أو الحِمَّص بكسر الحاء 81 | الحنجرة=الحَنْجَرة الحَنجرة بفتح الحاء 82 | الحنق=الحَنَق 83 | الحنكة=الحُنْكَة الحُنْكَة بضم الحاء 84 | الحوالة=الحَوالة الحوالة بفتح الحاء 85 | الحيرة=الحَيْرَة الحَيْرَة بفتح الحاء 86 | الختم=الخَتْم الخَتْم بفتح الخاء هو كل ما يختم به 87 | الخدمات=الخِدْمَات "خِدْمَات" بسكون الدال جمع "خِدْمَة" 88 | الخذلان=الخِذْلان الخِذْلان بكسر الخاء 89 | الخرطوم=الخُرْطُوم الخُرْطُوم بضم الخاء 90 | الخشية=الخَشْيَة الخَشْيَة بفتح الخاء 91 | الخصم=الخَصْم الخَصْم كقوله تعالى: "وهل أتاك نبأ الخصم إذ تسوروا المحراب" 92 | الخلخال=الخَلْخَال الخَلْخَال بفتح الخاء 93 | الخلسة=الخُلْسَة الخُلْسَة بضم الخاء 94 | الخيار=الخِيار 95 | الدخان=الدُّخَان الدُخَان دون تشديد الخاء 96 | الدرزية=الدَّرْزِيَّة الدَّرْزِيَّة بفتح الدال نسبة إلى أبي محمد الدَّرْزِي 97 | الدرهم=الدَّرْهم الدَّرْهم بفتح الدال 98 | الدم=الدَّمُ الدّمُ دون تشديد الميم، كقوله تعالى: "حرمت عليكم الميتة والدَّم" 99 | الدهليز=الدِّهْلِيز الدِّهْلِيز بكسر الدال 100 | الدهن=الدُّهْن الدُّهْن هو الزيت، أما الدِّهن فهو شجر 101 | الدية=الدِّيَة الدِّيَة دون تشديد الياء كقوله تعالى: "فَدِيَة مسلمة إلى أهله" 102 | الذماء=الذَّمَاء الذَّماء بفتح الذال هو بقية الروح في المذبوح 103 | الذهاب=الذَّهاب 104 | الرجحان=الرُّجْحَان فلم يرد في مصدر "رَجَحَ" رَجَحَان، بل رُجُوحًا، رُجْحَان، رَجَاحَة 105 | الرجعي=الرُجْعِيّ الرُجْعِيّ بضم الراء نسبة إلى "رُجْعَة" وليس "رَجْعَة" 106 | الرحلات=الرِّحْلات الرِّحْلات بكسر الراء وسكون الحاء جمع (رِحْلَة) 107 | الرصاص=الرَّصاص|الرِّصاص الرّصاص بفتح الراء أو كسرها 108 | الرفاهية=الرَفَاهيَة 109 | الرقابة=الرِّقابة الرِّقابة بكسر الرّاء معناها الحراسة والمراقبة 110 | الرهان=الرِّهان الرِّهان بكسر الرّاء من الفعل (راهن) مصدره (رِهان، ومراهنة) 111 | الريحان=الرَّيْحَان الرَّيْحَان بفتح الراء، كقوله تعالى: "فروح وريحان وجنة نعيم" 112 | الزبون=الزَّبُون الزَّبُون بفتح الزاي 113 | الزنبور=الزُّنبور 114 | الزيف=الزَّيف 115 | السبورة=السَّبُّورَة السَّبُّورَة بفتح السين 116 | السجادات=السَّجادة|السَّجادات|السجاجيد السَّجادة بفتح السين 117 | السجادة=السَّجادة|السَّجادات|السجاجيد السَّجادة بفتح السين 118 | السحور=السَّحُور السَّحور بفتح السين 119 | السعة=السَّعَة السَّعَة بفتح السين كقوله تعالى: (لينفق ذو سعة من سعته) 120 | السعودية=السُّعُودية السُّعُودية بضم السين فالنسب إلى سُعود، وليس إلى سَعود 121 | السفارة=السِّفَارة السِّفارة بكسر السين مقام السفير وعمله 122 | السماد=السَّماد السَّماد بالفتحة 123 | السندان=السَّندان|بين المطرقة والسَّندان السَّنْدَان بالفتح ما يطرق عليه الحداد الحديد، والسِّندان بالكسر هو الرجل العظيم الشديد 124 | السنون=السِّنُون السِّنُون بالكسر جمع سنة 125 | السهل والحزن=السَّهْل والحَزْن فالحَزَن والحُزْن هو الهم والغم 126 | السواك=السِّواك السواك بكسر السين 127 | الشفة=الشِّفَة الشِّفة بكسر الشين 128 | الشمالية=الشِّمالية ذلك ما أثبتته المعجمات؛ لقوله تعالى: "وأصحاب الشمال ما أصحاب الشمال" 129 | الصحافة=الصِّحافة الصِّحافة بكسر الصاد 130 | الصرعة=الصُّرَعَة 131 | الصقع=الصُّقْع الصُّقْع بضمّ الصاد، صقع من أصقاع العالم. 132 | الصلاحية=الصَّلاحِيَة صلاحِيَة دون تشديد الياء 133 | الصلب=الصُّلْب صُلْب بضم الصاد كقوله صلب الرأي 134 | الطازج=الطازَج 135 | الطمأنينة=الطُمَأنينة 136 | الظفر=الظُّفُر لقوله تعالى: "حرمنا كل ذي ظفر" 137 | العبوة=العُبْوَة العُبْوَة بضمّ العين 138 | العتمة=العَتَمَة العَتَمَة بفتح العين والتاء أي ظلام أول الليل 139 | العرصة=العَرْصَة العَرْصَة بسكون الراء 140 | العصفور=العُصفور 141 | العصي=العِصِيّ العِصِيّ بكسر العين كقوله تعالى: (فإذا حبالهم وعصيهم يخيل إليه من سحرهم أنها تسعى) 142 | العصيان=العِصْيَان العِصْيَان كقوله تعالى: (وكره إليكم الكفر والفسوق والعصيان) 143 | العقبان=العِقبان العِقبان بكسر العين جمعُ عُقَاب 144 | العلمانية=العَلمانية لأنها منسوبة إلى "العَلم" بمعنى العالم 145 | العمادة=العِمادة العِمادة بالكسر بمعنى منصب العميد لأن اشتقاق المهن يكون على وزن فِعالة، مثل: زِراعة 146 | العمامة=العِمَامَة العِمَامَة بكسر العين 147 | آل عمران=آل عِمْرَان|ابنة عِمران آل عِمْرَان|ابنة عِمران بكسر العين 148 | العنجهية=العُنْجُهِيّة العُنْجُهِيّة بضم العين والجيم 149 | العنوة=العَنْوَة العَنْوَة بفتح العين 150 | العوض=العِوَض العِوَض بكسر العين 151 | الغربال=الغِرْبال الغِرْبال بكسر الغين 152 | الغش=الغِشّ الغِشّ بكسر الغين من الفعل "غَشّ" 153 | الغل=الغِلّ الغِلّ بكسر الغين هو الحقد والكراهية 154 | الغواية=الغَوَاية الغواية بالفتح مصدر الفعل "غوي" هو "غَوَاية" وليس غِوَاية 155 | الغيرة=الغَيْرَة الغَيْرَة مصدر الفعل "غار" 156 | الفجل=الفُجْل الفُجل بضم الفاء نبات 157 | الفخار=الفَخَّار الفَخَّار بالفتح كقوله تعالى: "خلق الإنسان من صلصال كالفخار" 158 | الفراق=الفِرَاقَ الفِراق بكسر الفاء 159 | الفرجار=الفِرْجار الفِرْجار بكسر الفاء يستعمل لرسم الدوائر والأقواس 160 | الفهرس=الفِهْرِس|الفِهْرِست الفِهْرِس بكسر الفاء والراء، كلمة فارسية أصلها الفِهْرِست وعُرِّبت إلى "الفِهْرس" 161 | القرميد=القِرميد القِرميد بكسر القاف هو الآجر أو الخزف 162 | القرنبيط=القُنَّبِيط القُنَّبِيط بضمّ القاف بَقْلة 163 | القفل=القُفْل القُفْل بالضم قفل الباب 164 | القنبيط=القُنَّبِيط القُنَّبِيط بضمّ القاف بَقْلة 165 | الكتان=الكَتَّان الكَتَّان بالفتح 166 | الكراس=الكُرّاسَة|الكُرّاس الكُرّاسَة والكُرّاس بضم الكاف 167 | الكراسة=الكُرّاسَة|الكُرّاس الكُرّاسَة والكُرّاس بضم الكاف 168 | الكراهية=الكراهيَة الكراهيَة، دون تشديد الياء 169 | الكروية=الكُرَوِيّة كُروية بضم الكاف لأنها منسوبة إلى "كُرَة" 170 | الكفة=الكِفّة الكِفّة بكسر الكاف 171 | الكمامة=الكِمامة "الكِمامة" بكسر الكاف وتخفيف الميم هي ما يُكم به الفم 172 | الكمية=الكَمّيَّة|الكَمَيَّة الكَمّيَّة|الكَمَيَّة بالفتح لأنها نسبة إلى كَمّ 173 | اللثة=اللثَة اللِّثَةُ دون تشديد الثاء: ما حول الأسنان من اللَّحم وفيه مغارزُها 174 | اللطف والظرف=اللُّطف والظَّرْف الظَّرْف بفتح الظاء، فليس في المعجمات كلمة "الظُّرْف" 175 | اللقاح=اللِّقاح 176 | اللكنة=اللُكْنَة اللُّكْنَة بضم اللام معناها عجمة في اللسان 177 | اللياقة=اللِّيَاقَة اللِّيَاقَة بكسر اللام 178 | المجرفة=المِجْرَفَة المِجْرَفَة بكسر الميم اسم آلة على وزن "مِفْعَلَة" 179 | المذي=المَذْيَ المَذْيَ بفتح الميم وسكون الذال، ما يخرج من قُبُل الإنسان عند نشاط أو مداعبة أهل 180 | المرتزقة=المُرْتَزِقَة|المُرْتَزِقُون المُرْتَزِقَة بكسر الزاي، لأنه طالب الرزق 181 | المرتزقون=المُرْتَزِقَة|المُرْتَزِقُون المُرْتَزِقَة بكسر الزاي، لأنه طالب الرزق 182 | المركب=المركَب فالمركَب بفتح الكاف ما يركب عليه في البر والبحر 183 | المروحة=المِرْوَحَة المِرْوَحَة بكسر الميم اسم آلة على وزن "مِفْعَلَة" 184 | المريخ=المِرِّيخ المِرِّيخ بالكسر 185 | المزاج=المِزَاج المِزَاج بكسر الميم 186 | المسحة=المَسْحَة المَسْحَة بكسر الميم هي الأثر الظاهر 187 | المسمار=المِسْمَار المِسمار بكسر الميم 188 | المسودة=مُبَيَّضَة الكتاب|المُسَوَّدَة مُبَيَّضَة الكتاب اسم مفعول من الفعل: "بَيّض" مُسوّدة الكتاب اسم مفعول من الفعل "سَوّد" 189 | المصقع=المِصْقَع المِصْقَع بكسر الميم هو البليغ وعالي الصوت 190 | المصلت=المُصْلَت مُصْلَت ومعناه مُجرّد اسم مفعول من الفعل (أصلت) 191 | المطبعة=المِطْبَعَة مِطْبَعَة" اسم آلة على وزن "مِفْعَلَة" 192 | المطران=المَطْرَان|المِطْرَان المَطْرَان|المِطْرَان بفتح الميم وكسرها رئيس ديني عند النصارى 193 | المعرض=المَعْرِض مَعْرِض بكسر الراء اسم المكان من "عرض، يَعْرِض" على وزن "مَفْعِل" 194 | المعزل=المعزِل معزِل بكسر الزاي كقوله تعالى: (ونادى نوح ابنه وكان في معزل) 195 | المعمر=المُعَمَّر فالمعمِّر (بكسر الميم) هو الله، والمعمَّر هو (بفتح) الإنسان؛ كقوله تعالى: "وما يعمر من معمر ولا ينقص من عمره إلا في كتاب" 196 | المعوذتين=المُعَوِّذَتين المُعَوِّذَتين بكسر الواو لأنها اسم فاعل 197 | المغص=المغْص 198 | المقبض=المِقْبَض "المِقْبَض" اسم آلة على وزن "مِفْعَل" 199 | المقعد=المَقْعَد المَقْعَد بفتح الميم كقوله تعالى: "فرح المخلفون بمقعدهم خلاف رسول الله" 200 | المكنسة=المِكْنَسَة المِكنسة بكسر الميم اسم آلة على وزن مِفْعَلَة 201 | الملف=المِلَفّ المِلَفّ بكسر الميم 202 | الملقط=المِلْقَط|المِلْقَاط فالمَلْقَط بفتح الميم هو المعدن أو المطب، والمِلقط بكسر الميم اسم آلة على وز مِفعلة 203 | المنشفة=المِنْشَفَة المِنْشَفَة بكسر الميم اسم آلة على وزن "مِفْعَلَة" 204 | المنطاد=المُنطاد 205 | المهبل=المَهْبِل المَهْبِل بكسر الباء عضو التناسل عند المرأة 206 | الميزة=المِيزة|المزيّة 207 | النجعة=النُّجعَة 208 | النحوية=النَحْوِيّة النحْوية بتسكين الحاء لأنها منسوبة إلى "نَحْو" 209 | النخالة=النُّخالة لأن النُّخالة بضم النون ما يبقى من المُنْخُل بعد النخل 210 | الند للند=النِّدّ للنِّدّ النِّد بالكسر هو المثل والنظير، أما النَّدّ فضرب من النبات يُتبخَّر بعوده 211 | النشادر=النُّشادر النُّشادر بضم النون 212 | النغمة=النَّغْمَة النَّغْمَة بفتح النون وسكون الغين 213 | النقابة=النِّقابة نِقابة بكسر النون 214 | النقاط=النُّقَط|النِّقَاط نُقَط بضم النون|نِقَاط بكسر النون 215 | النمر=النَّمِر النَّمِر بكسر الميم 216 | الهواية=الهِواية هِواية بكسر الهاء، فليس لكلمة "هَواية" و"هُواية" دلالة لغوية 217 | الهوية=الهُوِيَّة هُوِيّة بالضم لأن النسب إلى "هُو" 218 | الوديان=الوُدْيَان الوُدْيَان بضم الواو جمع وادٍ. 219 | أما وقد=أمَا وقد ميم (أمَا) لا تُشدّد؛ لأنها حرف تنبيه بتخفيف الميم المفتوحة 220 | أمس=أمسِ لأن الظرف "أمس" مبني على الكسر 221 | أنطاكية=أنطاكيَة أنطاكيَة دون تشديد الياء 222 | بترول=بِترول البِترول بكسر الباء والأفصح النفط 223 | بحبوحة=بُحْبُوحَة بُحبوحة بضم الباء الأولى 224 | بحة=بُحَّة البُحَّة بضم الباء 225 | بخور=بَخُور البَخُور دون تشديد الخاء 226 | بدء=بَدْء البَدْء بالفتح من الفعل بدأ يبدأ 227 | بذرة=بَذْرَة البَذرة بفتح الباء 228 | برسيم=بِرسيم البِرسيم بكسر الباء 229 | برغوث=بُرغوث 230 | برميل=بِرْمِيل البِرْمِيل بكسر الباء 231 | برنامج=برنامَج فارسية "برنامة" عُرِّبت إلى برنامَج بفتح الميم 232 | بزة=بِزَّة البزة بكسر الباء، الثياب والسلاح والهيئة 233 | بشرة=بَشَرَة البَشَرَة بفتح الباء والشين، جلد الإنسان 234 | بطريق=بِطْرِيق البِطْرِيق بكسر الباء طيور تعيش في الماء 235 | بطيخ=بِطّيخ البِطِّيخ بكسر الباء هو الصحيح 236 | بعاد=بِعاد البِعاد بكسر الباء، مثل أضناه البِعاد 237 | بعثة=بَعثة البَعثة بفتح الباء 238 | بلقيس=بِلْقِيس بِلْقِيس بكسر الباء ملكة سبأ 239 | بمؤخر عينه=بمُؤْخِر عينه بتشديد الخاء لأن "المُؤَخِّر" اسم فاعل من أخّر 240 | بناء على ذلك=بِناءً على ذلك بِناءً بكسر بالباء مصدر "بنى" بناءً، وليس بُناءً 241 | بنج=بَنْج|مخدّر فالبَنج بفتح الباء نبات مخدر 242 | بنى=بِنَى البِنَى بكسر الباء جمع بِنْيَة 243 | بهرج=بَهرَج البَهرَج بفتح الباء هو الباطل الرديء الزائف 244 | بوتقة=بُوْتَقَة البُوتقة بضم الباء 245 | بيطار=بَيطار البَيْطار بفتح الباء طبيب بيطري 246 | بين المطرقة والسندان=السَّندان|بين المطرقة والسَّندان السَّنْدَان بالفتح ما يطرق عليه الحداد الحديد، والسِّندان بالكسر هو الرجل العظيم الشديد 247 | تارة=تارَة بتخفيف الراء، فمعنى تارة: الحين والمرة 248 | تجارب=تجارِب 249 | تجربة=تجرِبة 250 | تجوال=تَجْوال التَّجْوال بفتح التاء 251 | تخمة=تُخَمَة التُخَمَة بفتح الخاء 252 | تذكار=تَذْكار التَّذْكار بفتح التاء مصدر للفعل (ذكر) 253 | تذكرة=تَذْكِرَة تَذْكِرَة بكسر الكاف 254 | ترجمة=تَرْجَمَة ترجَمة بفتح الجيم 255 | ترس=تُرْس التُّرْس بضمّ التاء 256 | تعالوا=تعالَوا 257 | تعليم مختلط=تعليم مختلِط مختلِط بكسر اللام ف "تعليم" هو المتلبس بالاختلاط، وليس الاختلاط واقعًا عليه 258 | تلقائيا=تِلْقائيًا تِلْقائيًا بكسر التاء 259 | تنبل=تِنْبَل التِّنْبَل بكسر التاء خامل الذِّكر 260 | ثبت المراجع=ثَبَت المصادر|ثَبَت المراجع ثَبَت المصادر بفتح الثاء والباء لأن الثّبْت هو الشجاع الثابت القلب 261 | ثبت المصادر=ثَبَت المصادر|ثَبَت المراجع ثَبَت المصادر بفتح الثاء والباء لأن الثّبْت هو الشجاع الثابت القلب 262 | ثغرة=ثُغْرَة الثُّغْرَة بضم الثاء 263 | ثكنة=ثُكْنَة الثُّكْنَة بضم الثاء 264 | جبنة=جُبْن|جُبُن|جُبْنة الجُبْنُ بالضم 265 | جبن=جُبْن|جُبُن|جُبْنة الجُبْنُ بالضم 266 | جرم سماوي=جِرْم سماوي الِجرم السماوي بكسر الياء أما "الجُرْم" بالضمة فهو الذنب 267 | جعبة=جَعْبة الجَعبة بالفتح أصوب 268 | جفن=جَفْن الجَفن بفتح الجيم 269 | جلطة=جُلْطَة الجُلطة الدموية بضم الجيم 270 | جمادى=جُمادى 271 | جمهور=جَمهور الجَمهور بضم الجيم 272 | جنوب=جَنُوب الجَنُوب بفتح الجيم 273 | جهبذ=جِهْبِذ الجِهبذ بكسر الجيم 274 | جهوري=جَهْوَري 275 | حافة=حافَة الحافة دون تشديد الفاء 276 | حراك=حَراك 277 | حرب الفجار=حرب الفِجَار حربالفِجار بالكسر وقعت بين قريش وحلفائها وبين هوازن 278 | حزمة=حُزْمَة الحُزْمَة بضم الحاء، مثل حُزمة الحطب. 279 | حزيران=حَزِيران حَزِيران بفتح الحاء 280 | حساء=حَساء الحِساء بكسر الحاء 281 | حطام=حُطَام الحُطَام بضم الحاء 282 | حقبة=حِقْبَة الحِقْبَة بكسر الحاء 283 | حلقات=حلَقات لأن الكلمة المفردة التي على وزن فَعْلَة "حَلْقة" صحيحة العين، فإنها عند جمعها جمع مؤنث سالمًا يجب تحريك عين الكلمة بالفتح إتباعًا لفائها 284 | حلقوم=حُلْقُوم الحُلقوم بضم الحاء كقوله تعالى: "فلولا إذا بلغت الحلقوم" 285 | حلويات=حَلْوَيَات جمع حلوى "حَلْوَيَات" على غرار نَجْوَى نَجْوَيَات، وسلوى سلويات 286 | حمة=حُمَة 287 | حمر النعم=حُمْرِ النَّعَم 288 | حمص=حِمِّص|حِمَّص الحِمِّص أو الحِمَّص بكسر الحاء 289 | حنجرة=حَنْجَرة الحَنجرة بفتح الحاء 290 | حنكة=حُنْكَة الحُنْكَة بضم الحاء 291 | حوالة=حَوالة الحوالة بفتح الحاء 292 | حيرة=حَيْرَة الحَيْرَة بفتح الحاء 293 | حيي بن أخطب=حُيَيّ بن أخطب حُيَيّ بن أخطب من يهود يثرب 294 | ختم=خَتْم الخَتْم بفتح الخاء هو كل ما يختم به 295 | خدمات=خِدْمَات "خِدْمَات" بسكون الدال جمع "خِدْمَة" 296 | خذلان=خِذْلان الخِذْلان بكسر الخاء 297 | خرطوم=خُرْطُوم الخُرْطُوم بضم الخاء 298 | خشية=خَشْيَة الخَشْيَة بفتح الخاء 299 | خصم=خَصْم الخَصْم كقوله تعالى: "وهل أتاك نبأ الخصم إذ تسوروا المحراب" 300 | خضراوات=خَضْراوات 301 | خط الرقعة=خطّ الرُّقْعَة منسوبة إلى الرُّقْعَة -بالضم- وهي قطعة الورق أو الجلد التي كان يكتب عليها 302 | خلخال=خَلْخَال الخَلْخَال بفتح الخاء 303 | خلسة=خُلْسَة الخُلْسَة بضم الخاء 304 | خيار=خِيار 305 | داء مستفحل=داء مُسْتَفْحِل "مُسْتَفْحِل" اسم فاعل من الفعل استفحل، أي تفاقم 306 | دخان=دُخَان الدُخَان دون تشديد الخاء 307 | درة عمر=دِرَّة عمر 308 | درزية=دَرْزِيَّة الدَّرْزِيَّة بفتح الدال نسبة إلى أبي محمد الدَّرْزِي 309 | درهم=دَرْهم الدَّرْهم بفتح الدال 310 | دم=دَم الدّمُ دون تشديد الميم، كقوله تعالى: "حرمت عليكم الميتة والدَّم" 311 | دهليز=دِهْلِيز الدِّهْلِيز بكسر الدال 312 | دهن=دُهْن الدُّهْن هو الزيت، أما الدِّهن فهو شجر 313 | دية=دِيَة الدِّيَة دون تشديد الياء كقوله تعالى: "فَدِيَة مسلمة إلى أهله" 314 | ذماء=ذَمَاء الذَّماء بفتح الذال هو بقية الروح في المذبوح 315 | ذهاب=ذهاب 316 | رباطة الجأش=رِباطَة الجأش رِباطة الجأش بكسر الرّاء معناها الشجاعة وشدة القلب وقوته 317 | رتل من الدبابات=رَتَل من السيارات|رتَل من الشاحنات|رَتَل من الدبابات رتَل بفتح التاء 318 | رتل من السيارات=رَتَل من السيارات|رتَل من الشاحنات|رَتَل من الدبابات رتَل بفتح التاء 319 | رتل من الشاحنات=رَتَل من السيارات|رتَل من الشاحنات|رَتَل من الدبابات رتَل بفتح التاء 320 | رجحان=رُجْحَان فلم يرد في مصدر "رَجَحَ" رَجَحَان، بل رُجُوحًا، رُجْحَان، رَجَاحَة 321 | رجعي=رُجْعِيّ الرُجْعِيّ بضم الراء نسبة إلى "رُجْعَة" وليس "رَجْعَة" 322 | رحلات=رِحْلات الرِّحْلات بكسر الراء وسكون الحاء جمع (رِحْلَة) 323 | رزمة=رِزْمَة|رِزَم رِزْمة ورِزَم بكسر الراء 324 | رزم=رِزْمَة|رِزَم رِزْمة ورِزَم بكسر الراء 325 | رصاص=رَصاص|رِصاص الرّصاص بفتح الراء أو كسرها 326 | رعاع=رَُعاع 327 | رفاهية=رَفَاهيَة 328 | رقابة=رِقابة الرِّقابة بكسر الرّاء معناها الحراسة والمراقبة 329 | رهان=رِهان الرِّهان بكسر الرّاء من الفعل (راهن) مصدره (رِهان، ومراهنة) 330 | ريحان=رَيْحَان الرَّيْحَان بفتح الراء، كقوله تعالى: "فروح وريحان وجنة نعيم" 331 | زاد الطين بَلّة=زاد الطين بِلَّّة 332 | زبون=زَبُون الزَّبُون بفتح الزاي 333 | زغلول=زُغلُول زُغلُول بضم الغين 334 | زنبور=زُنبور 335 | زيف=زَيف 336 | سبورة=سَبُّورَة السَّبُّورَة بفتح السين 337 | سجادات=سَجادة|سَجادات|سجاجيد السَّجادة بفتح السين 338 | سجادة=سَجادة|سَجادات|سجاجيد السَّجادة بفتح السين 339 | سحور=سَحُور السَّحور بفتح السين 340 | سداد القارورة=صِمَام القارورة|سِدَاد القارورة 341 | سعة=سَعَة السَّعَة بفتح السين كقوله تعالى: (لينفق ذو سعة من سعته) 342 | سعودية=سُعُودية السُّعُودية بضم السين فالنسب إلى سُعود، وليس إلى سَعود 343 | سفارة=سِفَارة السِّفارة بكسر السين مقام السفير وعمله 344 | سماد=سَماد السَّماد بالفتحة 345 | سندان=سَندان السَّنْدَان بالفتح ما يطرق عليه الحداد الحديد، والسِّندان بالكسر هو الرجل العظيم الشديد 346 | سنمار=سِنِمَّار سِنِمَّار اسم بناء رومي 347 | سنون=سِنُون السِّنُون بالكسر جمع سنة 348 | سني عمره=سني عمره سني عمره دون شدة، جمع المذكر السالم وما يلحق به تحذف نونه عند الإضافة دون تشديد الياء 349 | سواك=سِواك السواك بكسر السين 350 | شاهد عيان=شاهد عِيان العِيان بالكسر مصدر الفعل "عاين" إذا رأى الشيء بعينه 351 | شغاف القلب=شَغاف القلب شَغاف بفتح الشين 352 | شفة=شِفَة الشِّفة بكسر الشين 353 | شمالية=شِمالية ذلك ما أثبتته المعجمات؛ لقوله تعالى: "وأصحاب الشمال ما أصحاب الشمال" 354 | صحافة=صِحافة الصِّحافة بكسر الصاد 355 | صقع=صُقْع الصُّقْع بضمّ الصاد، صقع من أصقاع العالم. 356 | صلاحية=صَلاحِيَة صلاحِيَة دون تشديد الياء 357 | صلب=صُلْب صُلْب بضم الصاد كقوله صلب الرأي 358 | صمام=صِمَام | سِدَاد 359 | صنعة محكمة=صنعة مُحْكَمَة فالفعل "أحكم" بمعنى "أتقن" أما الفعل "حكّم" فليس من معانيه أتقن وأجاد 360 | طازج=طازَج 361 | طحال=طِحال 362 | طرفة عين=طَرْفَة عين الطُّرفة بالضم الشيء المستحدث العجيب. أما طًرفة العين فبالفتح. 363 | طلسم=طَلسَم|طِلسِم 364 | طمأنينة=طُمَأنينة 365 | طهران=طِهران 366 | طوال عمري=طَوال عمري طَوَال عمري بالفتح، لأن طِوال بالكسر جمع طويل 367 | ظفر=ظُفُر لقوله تعالى: "حرمنا كل ذي ظفر" 368 | ظهرانينا=ظهرانَينا ظهرانينا بفتح النون 369 | عبوة=عُبْوَة العُبْوَة بضمّ العين 370 | عتمة=عَتَمَة العَتَمَة بفتح العين والتاء أي ظلام أول الليل 371 | عرصة=عَرْصَة العَرْصَة بسكون الراء 372 | عرض الحائط=عُرْضَ الحائط 373 | عرق النسا=عرق النَّسا عرق النَّسا بفتح النون 374 | عصفور=عُصفور 375 | عصيان=عِصْيَان العِصْيَان كقوله تعالى: (وكره إليكم الكفر والفسوق والعصيان) 376 | عصي=عِصِيّ العِصِيّ بكسر العين كقوله تعالى: (فإذا حبالهم وعصيهم يخيل إليه من سحرهم أنها تسعى) 377 | عقبان=عِقبان العِقبان بكسر العين جمعُ عُقَاب 378 | علمانية=عَلمانية لأنها منسوبة إلى "العَلم" بمعنى العالم 379 | عمادة=عِمادة العِمادة بالكسر بمعنى منصب العميد لأن اشتقاق المهن يكون على وزن فِعالة، مثل: زِراعة 380 | عمامة=عِمَامَة العِمَامَة بكسر العين 381 | عنجهية=عُنْجُهِيّة العُنْجُهِيّة بضم العين والجيم 382 | عنوة=عَنْوَة العَنْوَة بفتح العين 383 | عوض=عِوَض العِوَض بكسر العين 384 | غربال=غِرْبال الغِرْبال بكسر الغين 385 | غش=غِشّ الغِشّ بكسر الغين من الفعل "غَشّ" 386 | غل=غِلّ الغِلّ بكسر الغين هو الحقد والكراهية 387 | غواية=غَوَاية الغواية بالفتح مصدر الفعل "غوي" هو "غَوَاية" وليس غِوَاية 388 | غيرة=غَيْرَة الغَيْرَة مصدر الفعل "غار" 389 | فبها ونعمت=فبها ونِعْمَتْ فالمقصود فعل المدح "نِعْمَ" أي نِعْمَتْ الخلَّة 390 | فجل=فُجْل الفُجل بضم الفاء نبات 391 | فخار=فَخَّار الفَخَّار بالفتح كقوله تعالى: "خلق الإنسان من صلصال كالفخار" 392 | فراق=فِرَاقَ الفِراق بكسر الفاء 393 | فرجار=فِرْجار الفِرْجار بكسر الفاء يستعمل لرسم الدوائر والأقواس 394 | فطحل=فِطَحْل 395 | فهرس=فِهْرِس|فِهْرِست الفِهْرِس بكسر الفاء والراء، كلمة فارسية أصلها الفِهْرِست وعُرِّبت إلى "الفِهْرس" 396 | قبالته=قُبالَتَه 397 | قبول=قَبُول القَبول بفتح القاف، كقوله تعالى: "قَبولًا حسنًا" 398 | قرمزي=قِرْمزي قِرْمزي بكسر القاف 399 | قرميد=قِرميد القِرميد بكسر القاف هو الآجر أو الخزف 400 | قرنبيط=قُنَّبِيط القُنَّبِيط بضمّ القاف بَقْلة 401 | قصارى=قُصَارَى قُصَارَى بضم القاف 402 | قفل=قُفْل القُفْل بالضم قفل الباب 403 | قنبيط=قُنَّبِيط القُنَّبِيط بضمّ القاف بَقْلة 404 | قنديل=قِنْدِيل القِنديل بكسر القاف 405 | قيد أنملة=قِيد أنملة قِيد بكسر القاف معناه المقدار. 406 | كتاب مشكل=كتاب مشكول|كتاب مُشكَل 407 | كتان=كَتَّان الكَتَّان بالفتح 408 | كذبة إبريل=كَذْبَة إبريل كذبة بكسر الكاف، أما بفتحها كَذْبة فهي المرة من الكذب 409 | كراسة=كُرّاسَة|كُرّاس الكُرّاسَة والكُرّاس بضم الكاف 410 | كراس=كُرّاسَة|كُرّاس الكُرّاسَة والكُرّاس بضم الكاف 411 | كراهية=كراهيَة الكراهيَة، دون تشديد الياء 412 | كروية=كُرَوِيّة كُروية بضم الكاف لأنها منسوبة إلى "كُرَة" 413 | كفة=كِفّة الكِفّة بكسر الكاف 414 | كمامة=كِمامة "الكِمامة" بكسر الكاف وتخفيف الميم هي ما يُكم به الفم 415 | كمية=كَمّيَّة|كَمَيَّة الكَمّيَّة|الكَمَيَّة بالفتح لأنها نسبة إلى كَمّ 416 | كوكب الزهرة=كوكب الزُّهَرَة كوكب الزُّهَرَة بضم الزاي 417 | لا مشاحة=لا مُشاحَّة 418 | لثة=لِثَة اللِّثَةُ دون تشديد الثاء: ما حول الأسنان من اللَّحم وفيه مغارزُها 419 | لطف والظرف=لُطف والظَّرْف الظَّرْف بفتح الظاء، فليس في المعجمات كلمة "الظُّرْف" 420 | لعبة=لُعْبَة اللُعبة بضم اللام 421 | لقاح=لِقاح 422 | لكنة=لُكْنَة اللُّكْنَة بضم اللام معناها عجمة في اللسان 423 | لياقة=لِيَاقَة اللِّيَاقَة بكسر اللام 424 | مأثرة=مأثُرة المأثُرة بضم الثاء بمعنى المَكْرُمَة المتوارثة 425 | مأزق=مأزِق المأزِق بكسر الزاي هو المضيق الحرج 426 | مبيضة الكتاب=مُبَيَّضَة الكتاب|المُسَوَّدَة مُبَيَّضَة الكتاب اسم مفعول من الفعل: "بَيّض" مُسوّدة الكتاب اسم مفعول من الفعل "سَوّد" 427 | مجرفة=مِجْرَفَة المِجْرَفَة بكسر الميم اسم آلة على وزن "مِفْعَلَة" 428 | محفل=محفِل "محفِل" بكسر الفاء اسم مكان على وزن "مفعِل" 429 | مختلف البلاد=مُخْتَلِف البلاد مُخْتَلِف البلاد لأنه اسم الفاعل من الفعل (اختلف) 430 | مخلب=مِخْلَب مِخْلَب بكسر الميم 431 | مد البصر=مَدّ البصر|مَدى البصر 432 | مدينة الموصل=مدينة المَوصِل مدينة الموصل بفتح الميم 433 | مذي=مَذْي المَذْيُ بفتح الميم وسكون الذال، ما يخرج من قُبُل الإنسان عند نشاط أو مداعبة أهل 434 | مرتزقة=مُرْتَزِقَة|مُرْتَزِقُون المُرْتَزِقَة بكسر الزاي، لأنه طالب الرزق 435 | مرتزقون=مُرْتَزِقَة|مُرْتَزِقُون المُرْتَزِقَة بكسر الزاي، لأنه طالب الرزق 436 | مركب=مركَب فالمركَب بفتح الكاف ما يركب عليه في البر والبحر 437 | مروحة=مِرْوَحَة المِرْوَحَة بكسر الميم اسم آلة على وزن "مِفْعَلَة" 438 | مريخ=مِرِّيخ المِرِّيخ بالكسر 439 | مزاج=مِزَاج المِزَاج بكسر الميم 440 | مسحة=مَسْحَة المَسْحَة بكسر الميم هي الأثر الظاهر 441 | مسمار=مِسْمَار المِسمار بكسر الميم 442 | مشين=مَشِين مَشِين بفتح الميم لأنه اسم مفعول من الفعل: "شان" 443 | مصرف=مَصْرِف مَصْرِف لأن الفعل مكسور العين في المضارع "يصرِف" 444 | مصقع=مِصْقَع المِصْقَع بكسر الميم هو البليغ وعالي الصوت 445 | مصلت=مُصْلَت مُصْلَت ومعناه مُجرّد اسم مفعول من الفعل (أصلت) 446 | مصلى=مُصَلَّى مُصلّى بالضم والتشديد كقوله تعالى: "واتخذوا من مقام إبراهيم مصلى" 447 | مطبعة=مِطْبَعَة مِطْبَعَة" اسم آلة على وزن "مِفْعَلَة" 448 | مطران=مَطْرَان|مِطْرَان المَطْرَان|المِطْرَان بفتح الميم وكسرها رئيس ديني عند النصارى 449 | معرض=مَعْرِض مَعْرِض بكسر الراء اسم المكان من "عرض، يَعْرِض" على وزن "مَفْعِل" 450 | معزل=معزِل معزِل بكسر الزاي كقوله تعالى: (ونادى نوح ابنه وكان في معزل) 451 | معمر=مُعَمَّر فالمعمِّر (بكسر الميم) هو الله، والمعمَّر هو (بفتح) الإنسان؛ كقوله تعالى: "وما يعمر من معمر ولا ينقص من عمره إلا في كتاب" 452 | معوذتين=مُعَوِّذَتين المُعَوِّذَتين بكسر الواو لأنها اسم فاعل 453 | معيب=مَعِيب مَعِيب بفتح الميم من الفعل "عاب" وليس فيها "أعاب" 454 | مفاد=مُفَاد مُفاد بضم الميم اسم المفعول من "أفاد". 455 | مفحص قطاة=مَفْحَص قطاة 456 | مفصل=مَفصِل|مُفصّل 457 | مقبض=مِقْبَض "المِقْبَض" اسم آلة على وزن "مِفْعَل" 458 | مقعد=مَقْعَد المَقْعَد بفتح الميم كقوله تعالى: "فرح المخلفون بمقعدهم خلاف رسول الله" 459 | مكنسة=مِكْنَسَة المِكنسة بكسر الميم اسم آلة على وزن مِفْعَلَة 460 | ملف=مِلَفّ المِلَفّ بكسر الميم 461 | ملقط=مِلْقَط|مِلْقَاط فالمَلْقَط بفتح الميم هو المعدن أو المطب، والمِلقط بكسر الميم اسم آلة على وز مِفعلة 462 | من الآن=من الْآنَ ف "الآنَ" مبني على الظرفية 463 | منشفة=مِنْشَفَة المِنْشَفَة بكسر الميم اسم آلة على وزن "مِفْعَلَة" 464 | منطاد=مُنطاد 465 | مهبل=مَهْبِل المَهْبِل بكسر الباء عضو التناسل عند المرأة 466 | مهمة عسكرية=مُهِمَّة عسكرية 467 | ميزة=مِيزة|مزيّة 468 | نحوية=نَحْوِيّة النحْوية بتسكين الحاء لأنها منسوبة إلى "نَحْو" 469 | نخالة=نُخالة لأن النُّخالة بضم النون ما يبقى من المُنْخُل بعد النخل 470 | ندبة=نَدَبَة 471 | نشادر=نُشادر النُّشادر بضم النون 472 | نصب عينيه=نُصْبَ عينيه بضم الصاد "نُصب عينيه" أي أمامه 473 | نصراني=نَصْرَانِيّ نَصْرَانِيّ بفتح النون نسبة إلى الناصرة على غير قياس 474 | نغمة=نَغْمَة النَّغْمَة بفتح النون وسكون الغين 475 | نقابة=نِقابة نِقابة بكسر النون 476 | نقاط=نُقَط|نِقَاط نُقَط بضم النون|نِقَاط بكسر النون 477 | نمر=نَمِر النَّمِر بكسر الميم 478 | هرج ومرج=هَرْج ومَرْج لأن "هَرْج" هو الفتنة والاختلاط، و"مَرَج" هو الفتنة والاختلاط أيضًا، وقد سُكِّنت راء "المَرَج" لمناسبة راء "الهَرْج" 479 | هضبة الجولان=هضبة الجَوْلان الجَوْلان بالفتح 480 | هضبة=هَضْبَة 481 | هل ترى=هل تُرَى|يا تُرَى بضم التاء، بمعنى يا رجل، أتُرَى؟ 482 | هنات=هَنَات 483 | هنة=هَنَة 484 | هواية=هِواية هِواية بكسر الهاء، فليس لكلمة "هَواية" و"هُواية" دلالة لغوية 485 | هوية=هُوِيَّة هُوِيّة بالضم لأن النسب إلى "هُو" 486 | وديان=وُدْيَان الوُدْيَان بضم الواو جمع وادٍ. 487 | ورق البردي=ورق البَرْدِيّ ورق البَرْدي بفتح الباء 488 | وفقا للتعليمات=وَفْقًا للتعليمات وَفْقًا للتعليمات بفتح الواو 489 | وقع في روعي=رُوْعي 490 | ولوع=وَلُوع 491 | يا ترى=هل تُرَى|يا تُرَى بضم التاء، بمعنى يا رجل، أتُرَى؟ 492 | ينبوع=يَنبوع 493 | يوسف=يُوسُف يُوسُف ورد في القرآن الكريم سبعًا وعشرين مرة بضم السين 494 | رَدْحًا من الزمن=رَدَحًا من الزمن 495 | -------------------------------------------------------------------------------- /data/done/homophones.txt: -------------------------------------------------------------------------------- 1 | # Arabic Homophones 2 | # Words here are both correct, but we need explaination to avoid confusion 3 | # For notes, refer to https://github.com/sohaibafifi/languagetool/issues/9 4 | إحضار=إحظار 5 | إضراب=إظراب 6 | أضل=أظل 7 | بض=بظ 8 | بغض=بغظ 9 | بيض=بيظ 10 | تضفير=تظفير 11 | تقريض=تقريظ 12 | حاضر=حاظر 13 | حافض=حافظ 14 | حض=حظ 15 | حضل=حظل 16 | حضيض=حظيظ 17 | خضل=خظل 18 | ضير=ظئر 19 | ضاف=ظاف 20 | ضال=ظال 21 | ضان=ظان 22 | ضراب=ظراب 23 | ضرار=ظرار 24 | ضرب=ظرب 25 | ضرير=ظرير 26 | ضفرة=ظفرة 27 | ضل=ظل 28 | ضلع=ظلع 29 | ضمان=ظمآن 30 | ضن=ظن 31 | ضهر=ظهر 32 | عض=عظ 33 | عضب=عظب 34 | عضة=عظة 35 | عضل=عظل 36 | عضام=عظام 37 | عضم=عظم 38 | عضين=عظين 39 | غيض=غيظ 40 | فض=فظ 41 | فيض=فيظ 42 | فاض=فاظ 43 | قارض=قارظ 44 | قريض=قريظ 45 | قيض=قيظ 46 | لضلضة=لظلظة 47 | مض=مظ 48 | مضلة=مظلة 49 | ناضر=ناظر 50 | نضار=نظار 51 | نضير=نظير 52 | فضيض=فظيظ 53 | مضر=مظر 54 | مضنة=مظنة 55 | حضر=حظر 56 | حاضر=حاظر 57 | أذان=آذانَ|أذان ف "أذان" هو نداء المؤذن للصلاة، أما "آذان" فجمع أذن، وهي عضو السمع 58 | الأب=الأبُّ|الأبُ فالأبُّ معناه المرعى؛ لقوله تعالى: "وفاكهة وأبًّا" أما الأب فأصله "أَبَو" فإذا نُسِب إليه، قيل: "أبويٌّ" والمثنّى "أبوان" 59 | أب=أبُّ|أبُ فالأبُّ معناه المرعى؛ لقوله تعالى: "وفاكهة وأبًّا" أما الأب فأصله "أَبَو" فإذا نُسِب إليه، قيل: "أبويٌّ" والمثنّى "أبوان" 60 | الأمس=الأمس|أمسِ أمس اليوم السابق، الأمس أي يوم مضى؛ لذا إذا نُكِّرت "الأمس" عُرِّفت وإذا عُرِّفت نُكِّرت 61 | أمس=الأمس|أمسِ أمس اليوم السابق، الأمس أي يوم مضى؛ لذا إذا نُكِّرت "الأمس" عُرِّفت وإذا عُرِّفت نُكِّرت 62 | الجد=الجِدّ|الجَدّ فالجِدّ هو الاجتهاد، أما الجَدّ فهو أب الأب وأب الأم 63 | جد=جِدّ|جَدّ فالجِدّ هو الاجتهاد، أما الجَدّ فهو أب الأب وأب الأم 64 | الجنازة=الجَنازة|الجِنازة الجَنازة بالفتح : الميت نفسه. الجِنازة بالكسر: النعش 65 | جنازة=جَنازة|جِنازة الجَنازة بالفتح : الميت نفسه. الجِنازة بالكسر: النعش 66 | الجنان=الجِنان|الجَنان الجِنان بالكسر جمع كلمة "الجَنّة". الجَنان بالفتح القلب 67 | جنان=جِنان|جَنان الجِنان بالكسر جمع كلمة "الجَنّة". الجَنان بالفتح القلب 68 | الحدأة=الحَدَأة|الحِدَأَة "الحَدَأَة" بالفتح هي الفأس أو نصل السهم. والكسر طائر من الجوارح 69 | حدأة=حَدَأة|حِدَأَة "الحَدَأَة" بالفتح هي الفأس أو نصل السهم. والكسر طائر من الجوارح 70 | الحلبة=الحِلْبَة|الحُلْبَة الحُلْبَة نبات يشرب والحَلَبة مكان المصارعة 71 | حلبة=حِلْبَة|حُلْبَة الحُلْبَة نبات يشرب والحَلَبة مكان المصارعة 72 | الخطبة=الخُطْبة|الخِطْبَة الخِطْبة -بالكسر- طلب الزواج. الخُطبة:-بالضم- كلام موجّه لجمهور. 73 | خطبة=خُطْبة|خِطْبَة الخِطْبة -بالكسر- طلب الزواج. الخُطبة:-بالضم- كلام موجّه لجمهور. 74 | الرق=الرِّق|الرَّق الرِّق بالكسر العبيد، وبالفتح يُكتب عليه 75 | رق=رِق|رَق الرِّق بالكسر العبيد، وبالفتح يُكتب عليه 76 | الرقم=الرَّقَم|الرَّقْم لأن الرَّقَم هو جانب الوادي والروضة 77 | رقم=رَقَم|رَقْم لأن الرَّقَم هو جانب الوادي والروضة 78 | العقار=العَقَار|العقّار العَقَار دون تشديد القاف: هو كل ملك ثابت له أصل. والعقّار بتشديد القاف هو الدواء 79 | عقار=عَقَار|عقّار العَقَار دون تشديد القاف: هو كل ملك ثابت له أصل. والعقّار بتشديد القاف هو الدواء 80 | العلاقة=العِلاقة|العُلاقة|العَلاقة العِلاقة -بالكسر- هي ما يعلق به السيف، والعُلاقة -بالضم-: لم يرد استعمال العرب لها. العَلاقة -بالفتح-: الرابط 81 | علاقة=عِلاقة|عُلاقة|عَلاقة العِلاقة -بالكسر- هي ما يعلق به السيف، والعُلاقة -بالضم-: لم يرد استعمال العرب لها. العَلاقة -بالفتح-: الرابط 82 | الفتحة=الفَتْحَة|الفُتْحَة لأن ال "فَتْحَة" اسم مرّة 83 | فتحة=فَتْحَة|فُتْحَة لأن ال "فَتْحَة" اسم مرّة 84 | الفرار=الفَرَار|الفِرَار "الفَرَار"-بالفتح:الكشف عن أسنان الدابة، لمعرفة عمرها . الفِرار بالكسر الهروب. 85 | فرار=فَرَار|فِرَار "الفَرَار"-بالفتح:الكشف عن أسنان الدابة، لمعرفة عمرها . الفِرار بالكسر الهروب. 86 | الفرقة=الفِرْقَة|الفُرْقَة الفُرْقَة معناها الافتراق، أما الفِرْقَة فتعني كل طائفة من الناس 87 | فرقة=فِرْقَة|فُرْقَة الفُرْقَة معناها الافتراق، أما الفِرْقَة فتعني كل طائفة من الناس 88 | القوى=القِوَى|القُوَى لأن "القُوَى" جمع ل "قُوَّة"، ويقول تعالى: "علمه شديد القوى" 89 | قوى=قِوَى|قُوَى لأن "القُوَى" جمع ل "قُوَّة"، ويقول تعالى: "علمه شديد القوى" 90 | الكلية=الكِلْيَة|الكُلْيَة الكُلية عضو في الإنسان، والكُلّية منسوبة إلى الكُلّ 91 | كلية=كِلْيَة|كُلْيَة الكُلية عضو في الإنسان، والكُلّية منسوبة إلى الكُلّ 92 | المبخرة=المَبْخَرَة|المِبْخَرَة ف "المِبْخَرة" اسم آلة على وزن "مِفْعَلَة" و"المَبْخَرَة" هي ما يسبب بخر الفم 93 | مبخرة=مَبْخَرَة|مِبْخَرَة ف "المِبْخَرة" اسم آلة على وزن "مِفْعَلَة" و"المَبْخَرَة" هي ما يسبب بخر الفم 94 | المبرد=المَبْرَد|المِبْرَد اسم آلة على وزن "مِفْعَل" 95 | مبرد=مَبْرَد|مِبْرَد اسم آلة على وزن "مِفْعَل" 96 | المتمنيات=المتمنِّيات|المتمنَّيات لأن المفرد هو "متمنَّى" وهو ما يتمنّاه الشخص لنفسه أو لغيره، أما المتمنِّيات فتعني النساء اللائي يتمنَّين 97 | متمنيات=متمنِّيات|متمنَّيات لأن المفرد هو "متمنَّى" وهو ما يتمنّاه الشخص لنفسه أو لغيره، أما المتمنِّيات فتعني النساء اللائي يتمنَّين 98 | المرثية=المَرْثِيَّة|المَرْثِيَة|المَرْثَاة المَرْثِيَّة هي المرأة التي رثاها غيرها. المَرْثِيَة أو المَرْثَاة قصيدة في رثاء المتوفى 99 | مرثية=مَرْثِيَّة|مَرْثِيَة|مَرْثَاة المَرْثِيَّة هي المرأة التي رثاها غيرها. المَرْثِيَة أو المَرْثَاة قصيدة في رثاء المتوفى 100 | المستردات=المستردِّات|المستردَّات لأن الفعل "استردّ يستردّ استردادًا" متعدٍّ ينصب مفعولًا به 101 | مستردات=مستردِّات|مستردَّات لأن الفعل "استردّ يستردّ استردادًا" متعدٍّ ينصب مفعولًا به 102 | المعدات=المُعِدَّات|المُعَدَّات المُعِدّات بالكسر اسم فاعل، والمُعَدّات اسم مفعول 103 | معدات=مُعِدَّات|مُعَدَّات المُعِدّات بالكسر اسم فاعل، والمُعَدّات اسم مفعول 104 | المغريات=المغرَيات|المغرِيات فالفعل "أغرى" اسم الفاعل منه للمؤنث "مغرٍية" والجمع مُغرِيات، وليس المقصود هنا اسم المفعول "مغرَيات" 105 | مغريات=مغرَيات|مغرِيات فالفعل "أغرى" اسم الفاعل منه للمؤنث "مغرٍية" والجمع مُغرِيات، وليس المقصود هنا اسم المفعول "مغرَيات" 106 | المنوى=المُنْوَى|المَنْوِيّ لأن "المُنْوَى" اسم مفعول من الفعل "أَنْوَى" وليس "نَوَى" 107 | منوى=مُنْوَى|مَنْوِيّ لأن "المُنْوَى" اسم مفعول من الفعل "أَنْوَى" وليس "نَوَى" 108 | الميت=المَيِّت|المَيْت حيث المَيْت هو من فارق الحياة، والمَيّت هو الذي أوشك أن يموت 109 | ميت=مَيِّت|مَيْت حيث المَيْت هو من فارق الحياة، والمَيّت هو الذي أوشك أن يموت 110 | النعرة=النَّعْرَة|النُّعَرَة لأن النّعْرَة اسم مرة من الفعل "نَعَرَ"، أما النُّعَرَة فهي الخيشوم، ثم استعملت مجازًا للخيلاء والكبر 111 | نعرة=نَعْرَة|نُعَرَة لأن النّعْرَة اسم مرة من الفعل "نَعَرَ"، أما النُّعَرَة فهي الخيشوم، ثم استعملت مجازًا للخيلاء والكبر 112 | الوفيات=الوَفِيَّات|الوَفَيَات فالوفيّات جمع "وفيّة" لا جمع "وفاة" 113 | وفيات=وَفِيَّات|وَفَيَات فالوفيّات جمع "وفيّة" لا جمع "وفاة" 114 | تظافر=تظافر|تضافر فمادة "ضفر" تعني الربط والجمع بإحكام، أما مادة "ظفر" فتعني النصر والحصول على المراد 115 | جدة=جَدَّة|جُدَّة جُدّة مدينة في الحجاز، والجَدّة والدة الأم أو الأب 116 | جلسة=الجِلسة|جَلسة|الجَلسة|جِلسة فال "جلسة" هي اسم مرّة فتكون على وزن "فَعْلَة، جَلْسَة" و"جلسة" اسم هيئة، فتكون على وزن "فِعْلَة، جِلْسَة" 117 | الجلسة=الجِلسة|جَلسة|الجَلسة|جِلسة فال "جلسة" هي اسم مرّة فتكون على وزن "فَعْلَة، جَلْسَة" و"جلسة" اسم هيئة، فتكون على وزن "فِعْلَة، جِلْسَة" 118 | جلسة=جِلسة|جَلسة فال "جلسة" هي اسم مرّة فتكون على وزن "فَعْلَة، جَلْسَة" و"جلسة" اسم هيئة، فتكون على وزن "فِعْلَة، جِلْسَة" 119 | الحجة=الحَجَّة|الحِجَّة اسم المرة على وزن "فَعْلَة"، ولكن خرج عن هذا الوزن اسم المرة من الفعل حَجَّ، فهو "حِجَّة" 120 | حجة=حَجَّة|حِجَّة اسم المرة على وزن "فَعْلَة"، ولكن خرج عن هذا الوزن اسم المرة من الفعل حَجَّ، فهو "حِجَّة" 121 | الخصلة=الخُصْلَة|الخِصْلَة لأن الخَصْلة هي الخلة في الخير أو الشر، أما الخُصْلة فهي الشعر المتجمع 122 | خصلة=خُصْلَة|خِصْلَة لأن الخَصْلة هي الخلة في الخير أو الشر، أما الخُصْلة فهي الشعر المتجمع 123 | الخطة=الخِطَّة|الخُطَّة لأن الخِطة هي الأرض التي يختطها الإنسان لنفسه 124 | خطة=خِطَّة|خُطَّة لأن الخِطة هي الأرض التي يختطها الإنسان لنفسه 125 | الخلدي=الخُلْدِي|الخَلَدِي حيث الخُلْد هو البقاء، أما الخَلَد فهو النفس والقلب 126 | خلدي=خُلْدِي|خَلَدِي حيث الخُلْد هو البقاء، أما الخَلَد فهو النفس والقلب 127 | الدرة=الدُرّة|الدِرّة حيث الدُّرّة معناها اللؤلؤة. أما الدِرّة فهي العصا 128 | درة=دُرّة|دِرّة حيث الدُّرّة معناها اللؤلؤة. أما الدِرّة فهي العصا 129 | الدقة=الدَّقَّة|الدِّقَّة لأن (دَقَّة) هي المرة الواحدة من الفعل (دقّ) أما (دِقّة) فهيئة الدق 130 | دقة=دَقَّة|دِقَّة لأن (دَقَّة) هي المرة الواحدة من الفعل (دقّ) أما (دِقّة) فهيئة الدق 131 | الدولي=الدُّوَليّ|الدَّوْليّ ينسب إلى "الدَّوْلَة"، وليس إلى "الدُّوَل"، وقد أجاز الكوفيون النسب إلى الجمع 132 | دولي=دُوَليّ|دَوْليّ ينسب إلى "الدَّوْلَة"، وليس إلى "الدُّوَل"، وقد أجاز الكوفيون النسب إلى الجمع 133 | الريع=الرِّيْع|الرَّيْع الرِّيع بالكسر هو المرتفع من الأرض أو الطريق، يقول تعالى: "أتبنون بكل ريع آية". والرَّيْع الغَّلَةُ 134 | ريع=رِيْع|رَيْع الرِّيع بالكسر هو المرتفع من الأرض أو الطريق، يقول تعالى: "أتبنون بكل ريع آية". والرَّيْع الغَّلَةُ 135 | الشقة=الشُّقَّة|الشِّقَّة|الشَّقَّة الشُّقَّة بالضم معناها البعد، كقوله تعالى: "بعدت عليهم الشقة". والشِّقّة والشَّقّة السكن. 136 | شقة=شُقَّة|شِقَّة|شَقَّة الشُّقَّة بالضم معناها البعد، كقوله تعالى: "بعدت عليهم الشقة". والشِّقّة والشَّقّة السكن. 137 | العنان=العِنان|العَنان "العِنان" بكسر السين هو سير اللجام الذي تمسك به الدابة. عَنَانُ السَّمَاءِ : مَا يَبْدُو لَكَ مِنَ السَّمَاءِ إِذَا نَظَرْتَ إِلَيْهَا 138 | عنان=عِنان|عَنان "العِنان" بكسر السين هو سير اللجام الذي تمسك به الدابة. عَنَانُ السَّمَاءِ : مَا يَبْدُو لَكَ مِنَ السَّمَاءِ إِذَا نَظَرْتَ إِلَيْهَا 139 | الفقرة=الفَقَرة|الفِقْرة لأن "الفِقْر ة" جزء من موضوع، أما "الفَقَرة" فواحدة من عظام سلسلة الظهر، وتجمع "فِقْرة" على فِقْرات وتجمع فَقَرة على فَقَرات 140 | فقرة=فَقَرة|فِقْرة لأن "الفِقْر ة" جزء من موضوع، أما "الفَقَرة" فواحدة من عظام سلسلة الظهر، وتجمع "فِقْرة" على فِقْرات وتجمع فَقَرة على فَقَرات 141 | الفناء=الفَنَاء|الفِنَاء فِنَاء بكسر الفاء فناء الدار، أما الفَنَاء فهو العدم 142 | فناء=فَنَاء|فِنَاء فِنَاء بكسر الفاء فناء الدار، أما الفَنَاء فهو العدم 143 | شر قتلة=شر قَتْلة|شرّ قِتْلة "القَتْلة" بالفتح اسم مرة، بينما "قِتْلة" بالكسر اسم هيئة، شرّ قِتلة 144 | الكفاءة=الكفاءة|الكفاية لأن "الكفاءة" تعني المساواة و"الكفاية" تعني التفوق 145 | كفاءة=كفاءة|كفاية لأن "الكفاءة" تعني المساواة و"الكفاية" تعني التفوق 146 | لغوي=لَغَوي|لُغَوي لَغَوي بفتح اللام:كثير اللغو، أي ثرثار. لُغوي بضم اللام: منسوب باللغة. 147 | اللمة=اللَّمَّة|اللُّمَّة اللُّمَّة معناها الرفقة، أما اللَّمَّة فاسم مرة من الفعل "لمّ" 148 | لمة=لَمَّة|لُمَّة اللُّمَّة معناها الرفقة، أما اللَّمَّة فاسم مرة من الفعل "لمّ" 149 | اللوثة=اللَّوثَة|اللُّوثَة لأن اللّوثَة هي مسّ الجنون والبطء، أما اللَّوثَة فاسم المرة من الفعل "لاث" 150 | لوثة=لَوثَة|لُوثَة لأن اللّوثَة هي مسّ الجنون والبطء، أما اللَّوثَة فاسم المرة من الفعل "لاث" 151 | المد=المَدّ|المُدّ فالمُدّ مكيال معروف والمَدّ التطويل 152 | مد=مَدّ|مُدّ فالمُدّ مكيال معروف والمَدّ التطويل 153 | مدي=مُدْي|مُدَى مُدْيَة "سكين" جمعها مُدَى 154 | المزدوجان=المُزْدَوَجان|المُزْدَوِجان فاسم الفاعل هنا "مُزْدَوِج"، و"مُزْدَوَج" اسم المفعول 155 | مزدوجان=مُزْدَوَجان|مُزْدَوِجان فاسم الفاعل هنا "مُزْدَوِج"، و"مُزْدَوَج" اسم المفعول 156 | المستحقات=المستحِقّات|المستحَقّات اسم فاعل واسم مفعول 157 | المستحق=المستحِقّ|المستحَق اسم فاعل واسم مفعول 158 | مستحقات=مستحِقّات|مستحَقّات اسم فاعل واسم مفعول 159 | مستحق=مستحِقّ|مستحَق اسم فاعل واسم مفعول 160 | المستدعون=المستدعُون|المستدعَون فالاسم المقصور إذا جُمع جمع مذكر سالمًا حُذفت ألفه، وبقي الفتح للدلالة عليها، كقوله تعالى: "وأنتم الأعلون" وقوله: "لمن المصطفين الأخيار" 161 | مستدعون=مستدعُون|مستدعَون فالاسم المقصور إذا جُمع جمع مذكر سالمًا حُذفت ألفه، وبقي الفتح للدلالة عليها، كقوله تعالى: "وأنتم الأعلون" وقوله: "لمن المصطفين الأخيار" 162 | بمنى=بمُنَى|بمِنى فالمُنى جمع مُنية، وهي الأمنية. مِنًى بالكسر مكان الحجيج 163 | النبذة=النَّبْذَة|النُّبْذَة فالنَّبْذَة هي الناحية والنُبذة هي القطعة من الشيء 164 | نبذة=نَبْذَة|نُبْذَة فالنَّبْذَة هي الناحية والنُبذة هي القطعة من الشيء 165 | نظرة=النَّظْرَة|النِّظْرة فالنِّظْرَة مصدر الهيئة أو النوع، أما النَّظْرَة فهي مصدر المرة أو الواحدة 166 | نواح=نَواح|نُوَاح للفعل "ناح" المصادر الآتية: "نَوحًا، نُوَاحًا، نِياحًا، نِياحَة، مَناحَة، مَناحًا". أما "نَواحٍ" فجمع ناحية 167 | الهبة=الهَبَّة|الهِبَّة لأن "هِبّة" اسم هيئة لبيان الحال والنوع والهيئة من الفعل "هبّ". الهَبّة مصدر. 168 | هبة=هَبَّة|هِبَّة لأن "هِبّة" اسم هيئة لبيان الحال والنوع والهيئة من الفعل "هبّ". الهَبّة مصدر. 169 | الوسط=الوَسَط|الوَسْط لأن "وَسْطَ" ظرف بمعنى "بين" والوَسَط هو المعتدل من كل شيء، وما بين طرفي الشيء 170 | وسط=وَسَط|وَسْط لأن "وَسْطَ" ظرف بمعنى "بين" والوَسَط هو المعتدل من كل شيء، وما بين طرفي الشيء 171 | الحوار=الحُوَار|الحِوَار "حُوَار" بالضم هو ولد الناقة، والحِوار بالكسر الحديث 172 | 173 | -------------------------------------------------------------------------------- /data/done/redundancies.txt: -------------------------------------------------------------------------------- 1 | # Redundancies database 2 | سوف لن=لن 3 | سوف لا=لا 4 | إلى عند=إلى 5 | طعام الغداء=الغداء 6 | طعام العشاء=العَشاء 7 | أما بالنسبة إلى=أما|ما يتعلق| أما ما يخصّ 8 | بالنسبة لنا=لنا 9 | بالنسبة له=له 10 | بالنسبة لي=لي 11 | بالنسبة لكما=لكما 12 | بالنسبة لهما=لهما 13 | بالنسبة لهم=لهم 14 | حتى ولو كان=حتى لو كان 15 | على الرحب والسعة= على الرُّحب 16 | إن دل على شيء فإنما يدل على=يدل على 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /data/done/wordiness.txt: -------------------------------------------------------------------------------- 1 | هناك خطأ في العبارة=في العبارة خطأ 2 | هناك مشكلة في الكمبيوتر=في الحاسوب مشكلة 3 | هناك سيارة في الطريق=في الطريق سيارة 4 | الأحسن من ذلك=أحسن من ذلك 5 | الأحسن من هذا=أحسن من هذا 6 | النتائج الأفضل=أفضل النتائج 7 | ليكن في علم=نُعلم 8 | نحيطكم علما=نُعلمكم 9 | لي عظيم الشرف=يُشرفني 10 | وأخيرا وليس آخرا=وأخيرا 11 | لأول وهلة=أول وهلة -------------------------------------------------------------------------------- /data/done/wrongWordInContext.txt: -------------------------------------------------------------------------------- 1 | #word1 word2 match1 match2 context1 context2 [explanation1 explanation2] 2 | #do not forget to add tests to ArabicWrongWordInContextRuleTest.java 3 | 4 | -------------------------------------------------------------------------------- /data/mustafa.csv: -------------------------------------------------------------------------------- 1 | #جمعها مصطفى mutafa0x,,, 2 | #https://github.com/linuxscout/fareh/issues/2,,, 3 | ,,, 4 | خلوق,ص:, حسن الأخلاق,traited 5 | مدبب,ص:, حاد الرأس,traited 6 | مدجج بالسلاح,ص:, مدجج في السلاح,traited 7 | دُرَّة عمر,ص:, دِرَّة عمر,traited 8 | دمغ,ص:, وسم,traited 9 | نفس الشيء,ص:, الشيء نفسه (إن لم يرد بالنفس الذات),traited 10 | رئيسيَّة,ص:, رئيسة,traited 11 | رابعة النهار,ص:, رائعة النهار,traited 12 | على الرَّحب والسعة,ص:, على الرُّحب,traited 13 | ,,,traited 14 | وقع في رَوْعي ,ص:, رُوْعي,traited 15 | زيجة,ص:, زواج,traited 16 | زِيف ,ص:, زَيف,traited 17 | سميك ,ص:, ثخين,traited 18 | الصَرْعة ,ص:, الصُّرَعَة,traited 19 | يفْرُك مؤمن مؤمنة,ص:, يَفرَك,traited 20 | حُمُرِ النِّعَم,ص:, حُمْرِ النَّعَم,traited 21 | حُمَّة ,ص:, حُمَة,traited 22 | لا تعجَز,ص:, تَعجِز,traited 23 | مِفحَص قطاة,ص:, مَفْحَص,traited 24 | نَعِس الصبي ,ص:, نَعَسَ,traited 25 | الصبي حتى يكبُر ,ص:, يَكبَر,traited 26 | يَعمَدُ إلى كذا,ص:, يَعمِدُ,traited 27 | متسول ,ص:, سائل |شحَّاذ,traited 28 | مشبوه,ص:, مشتبه فيه,traited 29 | شحِبَ لونه ,ص:, شَحَب |شَحُبَ,traited 30 | لا مَشاحَّة,ص:, لا مُشاحَّة,traited 31 | نظر شَذَرًا,ص:, شَزْرًا,traited 32 | أشرطة,ص:, شُرُط | شرائط,traited 33 | ,,,traited 34 | تشكل الفريق من..,ص:, تكون من..,traited 35 | كتاب مُشَكَّل,ص:, مشكول | مُشكَل,traited 36 | الشنب,ص:, الشارب,traited 37 | شافاه الله,ص:, شفاه الله,traited 38 | صفحة (للورقة لا أحد وجهيها) ,ص:, صحيفة,traited 39 | صَمَّام | سدَّاد القارورة,ص:, صِمَام | سِدَاد,traited 40 | طابور ,ص:, قطار,traited 41 | طُحال (العضو),ص:, طِحال,traited 42 | طُلسُم ,ص:, طَلسَم | طِلسِم,traited 43 | طَمَأنينة,ص:, طُمَأنينة,traited 44 | جَهُوري,ص:, جَهْوَري,traited 45 | مِنطاد,ص:, مُنطاد,traited 46 | طَهران,ص:, طِهران,traited 47 | أحمر غامق/ صوابه: داكن,,,traited 48 | عُنيَ به فلان,ص:, عَنِيَ به,traited 49 | أبعد النَّجعَة,ص:, أبعد النُّجعَة,traited 50 | مفترق طرق,ص:, مَفرِقِ طرق,traited 51 | كل الصيد في جوف الفِرا,ص:, الفَرَا,traited 52 | مِفصَل,ص:, مَفصِل,traited 53 | فَطْحَل,ص:, فِطَحْل,traited 54 | فطاحل,ص:, فحول أو عظماء,traited 55 | استفهم منه عن الأمرِ,ص:, استفهمَهُ الأمرَ,traited 56 | تقابلت معه,ص:, قابلته,traited 57 | جلس قِبالته,ص:, قُبالَتَه,traited 58 | قَدِمَ زيدٌ إلى أرض كذا,ص:, قَدِمَ زيدٌ أرضَ كذا,traited 59 | ضرب به عَرْض الحائط,ص:, عُرْضَ الحائط,traited 60 | ,,,traited 61 | اشترى كذا بأكمله,ص:,برمته,traited 62 | يَلفُظُ,ص:, يَلفِظُ,traited 63 | اللُّقاح,ص:, اللِّقاح,traited 64 | لواه لويًا,ص:, لَيًَّا,traited 65 | لا أدري (ما إذا |عمَّا إذا |إن) كنتَ راضيا أم لا,ص:, لا أدري أأنت راضٍ أم لا (فلا يرد ما سبق بعد أفعال القلوب),traited 66 | مُدّ البصر,ص:, مَدّ (ومَدى أفصح) البصر,traited 67 | مزح معه,ص:, مازحه,traited 68 | انمسح,ص:, امَّحى,traited 69 | تمعَّن في النظر,ص:, أمعن في النظر,traited 70 | مها (للواحدة),ص:, مهاة,traited 71 | ميِّزة,ص:, مِيزة | مَيْزَة,traited 72 | ميوعة,ص:, مَيْع,traited 73 | يُنبوع الغِواية الفكرية,ص:, يَنبوع الغَواية الفكرية,traited 74 | ,,,traited 75 | نُدْبة/ صوابه: نَدَبَة,,,traited 76 | الإمام النِّسائي,ص:, النَّسائي,traited 77 | تنافسوا على الأمر,ص:, تنافسوا في الأمر,traited 78 | انتقص من حقه,ص:, انتقص حقَّه,traited 79 | نمَّلَت يده,ص:, نَمِلَت يده,traited 80 | رأيت منامًا,ص:, رأيت حُلُْمًا |رؤيا,traited 81 | نوَّه بكذا,ص:, أشار إلى كذا,traited 82 | نوايا,ص:, نيات,traited 83 | هَرَع إليه,ص:, هُرِعَ |أُهْرِعَ |أَهْرَع إليه,traited 84 | أهرامات,ص:, أهرام,traited 85 | هَضَبة,ص:, هَضْبَة,traited 86 | تهكم على فلان,ص:, تهكم بفلان,traited 87 | اهتَمَّ للأمر,ص:, اهتَمَّ بالأمر,traited 88 | مَهَمَّة عسكرية,ص:, مُهِمَّة عسكرية,traited 89 | هِنَة |هِنَات,ص:, هَنَة |هَنَات,traited 90 | رِعاع,ص:, رَُعاع,traited 91 | جَلَسَ لوحدِه,ص:, جَلَس وَحدَه,traited 92 | يورَمُ الجلد,ص:, يَرِمُ الجلد,traited 93 | وُلُوع زيد بالشعر عظيمٌ,ص:, وَلُوع,traited 94 | ,,,traited 95 | كافة الرجال,ص:, الرجال كافة,traited 96 | مسبق,ص:, سابق,traited 97 | ملغية,ص:,ملغاة,traited 98 | -------------------------------------------------------------------------------- /data/original/mustafa.csv: -------------------------------------------------------------------------------- 1 | #جمعها مصطفى mutafa0x 2 | #https://github.com/linuxscout/fareh/issues/2 3 | 4 | ومن الخطأ قولهم: خلوق/ وصوابه: حسن الأخلاق 5 | و: مدبب/ ص: حاد الرأس 6 | و: مدجج بالسلاح/ ص: مدجج في السلاح 7 | و: دُرَّة عمر/ ص: دِرَّة عمر 8 | و: دمغ/ ص: وسم 9 | و: نفس الشيء/ ص: الشيء نفسه (إن لم يرد بالنفس الذات) 10 | و: رئيسيَّة/ ص: رئيسة 11 | و: رابعة النهار/ ص: رائعة النهار 12 | و: على الرَّحب والسعة/ ص: على الرُّحب 13 | 14 | ومن الخطأ قولهم: وقع في رَوْعي / وصوابه: رُوْعي 15 | و: زيجة/ ص: زواج 16 | و: زِيف / ص: زَيف 17 | و: سميك / ص: ثخين 18 | و: الصَرْعة / ص: الصُّرَعَة 19 | و: يفْرُك مؤمن مؤمنة/ ص: يَفرَك 20 | و: حُمُرِ النِّعَم/ ص: حُمْرِ النَّعَم 21 | و: حُمَّة / ص: حُمَة 22 | و: لا تعجَز/ ص: تَعجِز 23 | و: مِفحَص قطاة/ ص: مَفْحَص 24 | و: نَعِس الصبي / ص: نَعَسَ 25 | و: الصبي حتى يكبُر / ص: يَكبَر 26 | و: يَعمَدُ إلى كذا/ ص: يَعمِدُ 27 | و: متسول / ص: سائل-شحَّاذ 28 | و: مشبوه/ ص: مشتبه فيه 29 | و: شحِبَ لونه / ص: شَحَب-شَحُبَ 30 | و: لا مَشاحَّة/ ص: لا مُشاحَّة 31 | و: نظر شَذَرًا/ ص: شَزْرًا 32 | و: أشرطة/ ص: شُرُط- شرائط 33 | 34 | ومن الخطأ قولهم: تشكل الفريق من../ وصوابه: تكون من.. 35 | و: كتاب مُشَكَّل/ ص: مشكول- مُشكَل 36 | و: الشنب/ ص: الشارب 37 | و: شافاه الله/ ص: شفاه الله 38 | و: صفحة (للورقة لا أحد وجهيها) / ص: صحيفة 39 | و: صَمَّام- سدَّاد القارورة/ ص: صِمَام- سِدَاد 40 | و: طابور / ص: قطار 41 | و: طُحال (العضو)/ ص: طِحال 42 | و: طُلسُم / ص: طَلسَم- طِلسِم 43 | و: طَمَأنينة/ ص: طُمَأنينة 44 | و: جَهُوري/ ص: جَهْوَري 45 | و: مِنطاد/ ص: مُنطاد 46 | و: طَهران/ ص: طِهران 47 | . 48 | تنبيه: أُلَخِّص مضمامين كتاب أقرأه، وليس شيءٌ من ذلك رأيي واجتهادي 49 | 50 | ومن الخطأ قولهم: أحمر غامق/ صوابه: داكن 51 | و:عُنيَ به فلان/ ص: عَنِيَ به 52 | و: أبعد النَّجعَة/ ص: أبعد النُّجعَة 53 | و: مفترق طرق/ ص: مَفرِقِ طرق 54 | و: كل الصيد في جوف الفِرا/ ص: الفَرَا 55 | و: مِفصَل/ ص: مَفصِل 56 | و: فَطْحَل/ ص: فِطَحْل 57 | و: فطاحل/ ص: فحول أو عظماء 58 | و: استفهم منه عن الأمرِ/ ص: استفهمَهُ الأمرَ 59 | و: تقابلت معه/ ص: قابلته 60 | و: جلس قِبالته/ ص: قُبالَتَه 61 | و: قَدِمَ زيدٌ إلى أرض كذا/ ص: قَدِمَ زيدٌ أرضَ كذا 62 | و: ضرب به عَرْض الحائط/ ص: عُرْضَ الحائط 63 | 64 | ومن الخطأ قولهم: اشترى كذا بأكمله/ صوابه: برمته 65 | و: يَلفُظُ/ ص: يَلفِظُ 66 | و: اللُّقاح/ ص: اللِّقاح 67 | و: لواه لويًا/ ص: لَيًَّا 68 | و: لا أدري (ما إذا-عمَّا إذا-إن) كنتَ راضيا أم لا/ ص: لا أدري أأنت راضٍ أم لا (فلا يرد ما سبق بعد أفعال القلوب) 69 | و: مُدّ البصر/ ص: مَدّ (ومَدى أفصح) البصر 70 | و: مزح معه/ ص: مازحه 71 | و: انمسح/ ص: امَّحى 72 | و: تمعَّن في النظر/ ص: أمعن في النظر 73 | و: مها (للواحدة)/ ص: مهاة 74 | و: ميِّزة/ ص: مِيزة- مَيْزَة 75 | و: ميوعة/ ص: مَيْع 76 | و: يُنبوع الغِواية الفكرية/ ص: يَنبوع الغَواية الفكرية 77 | 78 | ومن الخطأ قولهم: نُدْبة/ صوابه: نَدَبَة 79 | و: الإمام النِّسائي/ ص: النَّسائي 80 | و: تنافسوا على الأمر/ ص: تنافسوا في الأمر 81 | و: انتقص من حقه/ ص: انتقص حقَّه 82 | و: نمَّلَت يده/ ص: نَمِلَت يده 83 | و: رأيت منامًا/ ص: رأيت حُلُْمًا-رؤيا 84 | و: نوَّه بكذا/ ص: أشار إلى كذا 85 | و: نوايا/ ص: نيات 86 | و: هَرَع إليه/ ص: هُرِعَ-أُهْرِعَ-أَهْرَع إليه 87 | و: أهرامات/ ص: أهرام 88 | و: هَضَبة/ ص: هَضْبَة 89 | و: تهكم على فلان/ ص: تهكم بفلان 90 | و: اهتَمَّ للأمر/ ص: اهتَمَّ بالأمر 91 | و: مَهَمَّة عسكرية/ ص: مُهِمَّة عسكرية 92 | و: هِنَة-هِنَات/ ص: هَنَة-هَنَات 93 | و: رِعاع/ ص: رَُعاع 94 | و: جَلَسَ لوحدِه/ ص: جَلَس وَحدَه 95 | و: يورَمُ الجلد/ ص: يَرِمُ الجلد 96 | و: وُلُوع زيد بالشعر عظيمٌ/ ص: وَلُوع 97 | 98 | ومن الخطأ قولهم: كافة الرجال/ والصحيح: الرجال كافة 99 | و: مسبق/ ص: سابق 100 | و: ملغية/ ص:ملغاة 101 | -------------------------------------------------------------------------------- /data/review_replaces.txt: -------------------------------------------------------------------------------- 1 | بينك وبينه=بينكما لا داعي لتكرار "بين" لأن تكرارها لا يعطي معنى جديدًا 2 | بينه وبينك=بينكما لا داعي لتكرار "بين" لأن تكرارها لا يعطي معنى جديدًا 3 | بينك وبينها=بينكما لا داعي لتكرار "بين" لأن تكرارها لا يعطي معنى جديدًا 4 | بينها وبينك=بينكما لا داعي لتكرار "بين" لأن تكرارها لا يعطي معنى جديدًا 5 | بينه وبينها=بينهما لا داعي لتكرار "بين" لأن تكرارها لا يعطي معنى جديدًا 6 | بينها وبينه=بينهما لا داعي لتكرار "بين" لأن تكرارها لا يعطي معنى جديدًا 7 | بيني وبينك=بيننا لا داعي لتكرار "بين" لأن تكرارها لا يعطي معنى جديدًا 8 | 9 | 10 | 11 | بينه وبينهما=بينهم لا داعي لتكرار "بين" لأن تكرارها لا يعطي معنى جديدًا 12 | بينه وبينهم=بينهم لا داعي لتكرار "بين" لأن تكرارها لا يعطي معنى جديدًا 13 | بينه وبينهن=بينهم لا داعي لتكرار "بين" لأن تكرارها لا يعطي معنى جديدًا 14 | بينها وبينهما=بينهم لا داعي لتكرار "بين" لأن تكرارها لا يعطي معنى جديدًا 15 | بينها وبينهم=بينهم لا داعي لتكرار "بين" لأن تكرارها لا يعطي معنى جديدًا 16 | بينها وبينهن=بينهم لا داعي لتكرار "بين" لأن تكرارها لا يعطي معنى جديدًا 17 | بينهما وبينهم=بينهم لا داعي لتكرار "بين" لأن تكرارها لا يعطي معنى جديدًا 18 | بينهما وبينهن=بينهم|بينهن لا داعي لتكرار "بين" لأن تكرارها لا يعطي معنى جديدًا 19 | بينهما وبينها=بينهم|بينهن لا داعي لتكرار "بين" لأن تكرارها لا يعطي معنى جديدًا 20 | بينهما وبينه=بينهم لا داعي لتكرار "بين" لأن تكرارها لا يعطي معنى جديدًا 21 | 22 | بينكن وبينها=بينكن لا داعي لتكرار "بين" لأن تكرارها لا يعطي معنى جديدًا 23 | بينكن وبينهن=بينكن لا داعي لتكرار "بين" لأن تكرارها لا يعطي معنى جديدًا 24 | بينها وبينكن=بينكن لا داعي لتكرار "بين" لأن تكرارها لا يعطي معنى جديدًا 25 | بينهن وبينكن=بينكن لا داعي لتكرار "بين" لأن تكرارها لا يعطي معنى جديدًا 26 | 27 | بينك وبينه=بينكم لا داعي لتكرار "بين" لأن تكرارها لا يعطي معنى جديدًا 28 | بينك وبينها=بينكم لا داعي لتكرار "بين" لأن تكرارها لا يعطي معنى جديدًا 29 | بينك وبينهما=بينكم لا داعي لتكرار "بين" لأن تكرارها لا يعطي معنى جديدًا 30 | بينك وبينهم=بينكم لا داعي لتكرار "بين" لأن تكرارها لا يعطي معنى جديدًا 31 | بينك وبينهن=بينكم لا داعي لتكرار "بين" لأن تكرارها لا يعطي معنى جديدًا 32 | 33 | بينه وبينك=بينكم لا داعي لتكرار "بين" لأن تكرارها لا يعطي معنى جديدًا 34 | بينها وبينك=بينكم لا داعي لتكرار "بين" لأن تكرارها لا يعطي معنى جديدًا 35 | بينهما وبينك=بينكم لا داعي لتكرار "بين" لأن تكرارها لا يعطي معنى جديدًا 36 | بينهم وبينك=بينكم لا داعي لتكرار "بين" لأن تكرارها لا يعطي معنى جديدًا 37 | بينهن وبينك=بينكم لا داعي لتكرار "بين" لأن تكرارها لا يعطي معنى جديدًا 38 | 39 | بينكما وبينه=بينكم لا داعي لتكرار "بين" لأن تكرارها لا يعطي معنى جديدًا 40 | بينكما وبينها=بينكم لا داعي لتكرار "بين" لأن تكرارها لا يعطي معنى جديدًا 41 | بينكما وبينهما=بينكم لا داعي لتكرار "بين" لأن تكرارها لا يعطي معنى جديدًا 42 | بينكما وبينهم=بينكم لا داعي لتكرار "بين" لأن تكرارها لا يعطي معنى جديدًا 43 | بينكما وبينهن=بينكم لا داعي لتكرار "بين" لأن تكرارها لا يعطي معنى جديدًا 44 | 45 | بينه وبينكما=بينكم لا داعي لتكرار "بين" لأن تكرارها لا يعطي معنى جديدًا 46 | بينها وبينكما=بينكم لا داعي لتكرار "بين" لأن تكرارها لا يعطي معنى جديدًا 47 | بينهما وبينكما=بينكم لا داعي لتكرار "بين" لأن تكرارها لا يعطي معنى جديدًا 48 | بينهم وبينكما=بينكم لا داعي لتكرار "بين" لأن تكرارها لا يعطي معنى جديدًا 49 | بينهن وبينكما=بينكم لا داعي لتكرار "بين" لأن تكرارها لا يعطي معنى جديدًا 50 | -------------------------------------------------------------------------------- /data/to_review_rules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 27 | 28 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | ]> 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | سَافَرَ 87 | 88 | بلاد 89 | 90 | يفضل أن يقال: 91 | 92 | 93 | 94 | سافر ببلاده 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | سَافَرَ 103 | 104 | ببلاد 105 | 106 | يفضل أن يقال: 107 | اسْتَرْعَى 108 | 109 | 110 | 111 | سافر ببلاده 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | أيان 121 | 122 | 123 | 124 | 125 | يفضل أن يقال: 126 | 127 | 128 | 129 | أيان الكتابان 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | سَرَّعَ 139 | 140 | عمل 141 | 142 | يفضل أن يقال: أسرع العمل بدلا من سرّع العمل. 143 | 144 | 145 | 146 | سرع العمل 147 | أسرَعَ العملَ 148 | 149 | 150 | 151 | 152 | 153 | نَزَعَ|اِجْتَزَّ 154 | عشب 155 | أرض 156 | 157 | 158 | 159 | عَشَّبَ 160 | 161 | أرض 162 | 163 | (عَشَّبَ) فعلٌ لازم، تقول: (عَشَّبَتِ الأرضُ): كثُر عُشبها 164 | اجتز عشب 165 | نزع عشب 166 | 167 | عشب الأرض 168 | اجتزَّ عُشبَ الأرض 169 | نزع عُشبَ الأرض 170 | 171 | 172 | 173 | 174 | 175 | 176 | (&conj;)?غليت(ما|م)? 177 | 178 | ماء 179 | 180 | يفضل أن يقال: 181 | 182 | 183 | 184 | غليت الماء، فهو مغلي 185 | فغليتم الماء، فهو مغلي 186 | 187 | أَغْلَيْتُ الماءَ، فهو مُغْلًى 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | اِسْتَخْدَمَ 204 | 205 | 206 | Test: 207 | اِرْتَادَ إليه 208 | 209 | 210 | استخدمتموه الشيء 211 | احتجتم إليه 212 | 213 | 214 | 217 | 218 | 219 | 220 | تَوَسَّلَ 221 | 222 | 223 | 224 | 225 | تَوَسَّلَ 226 | 227 | 228 | 229 | (توسَّل) لا يتعدى بنفسه, وإنما يتوصل إلى ما يستعين به بالباء 230 | تَوَسَّلَ  231 | ب 232 | 233 | لم تنفعه الحجج التي توسّلها لتبرئته 234 | توسّل بالرسول 235 | 236 | 239 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | تَرَاوَحَ 253 | أعمار|عمر 254 | من 255 | 256 | 257 | يفضل أن يقال: 258 | وَقَعَ  بين 259 | 260 | تتراوح أعمارهم من السابعة إلى العاشرة 261 | تقع أعمارُهم بين السابعة والعاشرة 262 | 263 | 264 | 265 | 266 | لم|لما|إن|إنما|من|ما|مهما|متى|أي|أين|أيان|أنى|حيثما 267 | 268 | 269 | 270 | 271 | لم|لما|إن|إنما|من|ما|مهما|متى|أي|أين|أيان|أنى|حيثما 272 | 273 | 274 | 275 | أتقصد؟ 276 | الفعل المضارع بعد "لم" يأتي مجزوما. 277 | 278 |   279 | 280 | لم يجري 281 | 282 | 283 | 284 | 285 | 286 | لم|لما|إن|إنما|من|ما|مهما|متى|أي|أين|أيان|أنى|حيثما 287 | 288 | 289 | 290 | 291 | لم|لما|إن|إنما|من|ما|مهما|متى|أي|أين|أيان|أنى|حيثما 292 | 293 | 294 | 295 | أتقصد؟ 296 | الفعل المضارع بعد "لم" يأتي مجزوما. 297 | 298 |   299 | 300 | لم يجري 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | أتقصد؟ 313 | الفعل المضارع بعد "لام الأمر" يأتي مجزوما. مثل "ليُنفقْ ذو سعة". 314 | 315 | 316 | 317 | ليجري 318 | 319 | 320 | 321 | 329 | 330 | 331 | ا(&tanwin_fathatan;)$|(&tanwin_fathatan;)ا$ 332 | 333 | 334 | 335 | [^&alef;]$ 336 | 337 | 338 | لأنه من الأخطاء الشائعة كتابة التنوين على الألف، والصحيح أن تُكتب على الحرف الذي قبل الألف؛ لأن التنوين نون ساكنة والألف ساكنة، فلا يجتمع ساكنان 339 | : 340 | 341 | شرب الطفل لبنا 342 | 343 | 344 | 348 | 349 | 350 | 351 | أَخْبَرَ 352 | 353 | ب(&forms_anna;) 354 | 355 | 356 | يفضل أن يقال: 357 |   358 | 359 | أخبر بأنه مريض 360 | أخبرت أنه مريض 361 | 362 | 363 | 364 | 376 | 377 | 378 | اختيار 379 | بين 380 | 381 | 382 | لا تستعمل "بين " مع الاختيار، هذا غير معروف" 383 |  أحد 384 |  إحدى 385 | 386 | 387 | الاختيار بين هذين الأمرين 388 | عليك بالاختيار بين هذين الأمرين 389 | كان اختيارا بين هذين الأمرين 390 | عليك اختيار أحد هذين الشيئين 391 | 392 | 393 | 394 | 395 | 408 | 409 | 410 | بينك|بينكما|بينكم 411 | وبين(ك|ه|ها|هما|هم|هن|كما|كم|كن) 412 | 413 | 414 | لا داعي لتكرار "بين" لأن تكرارها لا يعطي معنى جديدًا 415 | 416 | : بيننا 417 | 418 | 419 | جلس بينك وبينه علي 420 | حال بينكما وبينهما علي 421 | جلس بينكم 422 | 423 | 424 | 425 | 426 | 445 | 446 | 447 | 448 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 462 | 463 | 464 | 465 | المبتدأ لا يكون منصوبا في بداية الكلام" 466 | : 467 | 468 | 469 | العاملين مشغولون 470 | بناؤك جاهز 471 | الفلاحون نشطون 472 | 473 | 474 | 475 | 476 | 479 | 480 | في 481 | 482 | 483 | 484 | 485 | في 486 | 487 | 488 | 489 | 490 | 491 | 492 | 493 | التحقق من الأعداد 494 | 495 | في ألف وخمسمئة وثلاثة وثلاثون مسجد. 496 | 497 | 498 | 499 | 500 | 501 | 504 | 505 | في 506 | 507 | 508 | 509 | 510 | في 511 | 512 | 513 | 514 | 515 | 516 | 517 | 518 | التحقق من الأعداد 519 | 520 | في ألف وخمسمئة واثنان وثلاثون صندوقا. 521 | في مليونان ومئتان وخمسة وأربعون ألفاً وسبعمائة وواحد. 522 | 523 | 524 | 525 | 526 | 527 | 528 | في 529 | 530 | 531 | 532 | 533 | 534 | في 535 | 536 | 537 | 538 | 539 | 540 | التحقق من الأعداد 541 | 542 | 543 | 544 | 545 | في خمسمئة واثنان وثلاثون صندوقا. 546 | 547 | 548 | 549 | 550 | 551 | في 552 | 553 | 554 | 555 | 556 | 557 | 558 | في 559 | 560 | 561 | 562 | 563 | 564 | 565 | التحقق من الأعداد 566 | 567 | في خمسة وثلاثون صندوقا. 568 | في خمسمئة واثنان وثلاثون صندوقا. 569 | في ألف وخمسمئة واثنين وثلاثون صندوقا. 570 | في ألف وخمسمئة واثنان وثلاثون صندوقا. 571 | 572 | 573 | 574 | 575 | في 576 | 577 | 578 | 579 | 580 | 581 | 582 | 583 | 584 | التحقق من الأعداد 585 | 586 | 587 | 588 | في مليونان ومئتان وخمسة وأربعون ألفاً وسبعمائة وواحد صندوق. 589 | 590 | 591 | 592 | 593 | 594 | 595 | 597 | 598 | 599 | في 600 | 601 | 602 | 603 | 604 | 605 | التحقق من الأعداد 606 | 607 | 608 | في ثلاثون صندوق. 609 | في خمسة وثلاثون صندوق. 610 | في خمسمئة واثنان وثلاثون صندوق. 611 | في ألف وخمسمئة واثنين وثلاثون صندوق. 612 | 613 | 621 | في ثلاثون صندوقا. 622 | في ثلاثون. 623 | 624 | 625 | -------------------------------------------------------------------------------- /data/مستودع الأغلاط الأجنبية.ods: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linuxscout/fareh/e8ba93c4b343a328632d31e0fb5d494f653dbb2d/data/مستودع الأغلاط الأجنبية.ods -------------------------------------------------------------------------------- /doc/lt-works.md: -------------------------------------------------------------------------------- 1 | # مشروع المدقق النحوي العربي 2 | 3 | هدف المشروع بناء مدقق لغوي إملائي تركيبي نحوي للغة العربية، يعنى بتدقيق الأخطاء اللغوية في الإملاء والتركيب والنحو والأسلوب، يراجع الأخطاء الشائعة ويساعد الكتاب والقراء على تحسين ملكتهم اللغوية وينتج نصوصا خالية من الأخطاء. 4 | 5 | 6 | 7 | هذا المدقق مفتوح المصدر، وهذا المشروع يدعم العربية في نظام LanguageTool.org متعدد اللغات للتدقيق. 8 | 9 | نظام LanguageTool بما في ذلك العربية. فيما يلي بعض أهم مزاياه: 10 | 11 | نظام LanguageTool أداة تدقيق لغوي متقدمة تدعم العديد من اللغات، الذي سنذكره لاحقا بكلمة أداة اللغة أو اختصارا LT، وهذه بعض مزاياه: 12 | 13 | * مفتوح المصدر 14 | 15 | * متعدد اللغات: حاليا 25 لغة. 16 | 17 | * مدقق إملائي ونحوي. 18 | 19 | * تحليل الأسلوب وتحسين الصياغة. 20 | 21 | * يساعد في تجنب التكرار وتحسين سلاسة النص. 22 | 23 | * *التكامل مع المتصفحات والتطبيقات**: 24 | 25 | * موقع تفاعلي متعدد اللغات 26 | 27 | * يدعم الإضافات لمتصفحات مثل **Chrome، Firefox، Edge**. 28 | 29 | - يتكامل مع **Microsoft Word، Google Docs** والعديد من البرامج الأخرى. 30 | 31 | ### **لماذا تم اختيار دعم العربية في LanguageTool؟** 32 | 33 | * مفتوح المصدر، مما يجعله منافسا لمواقع مثل grammarly التي لا تدعم العربية. 34 | * توثيق جيّد للتطوير وبناء قواعد التدقيق 35 | * كتابة القواعد بلغة XML 36 | * دعم متعدد اللغات. 37 | 38 | ## أنواع التدقيق اللغوي 39 | 40 | * التدقيق الإملائي: التدقيق الإملائي: يهتم بالكلمة دون سياقها. 41 | * مثلا في عبارة "إنشاء الله"، الكلمتان صحيحتان. 42 | * رابط مشروعنا : (http://ayaspell.sf.net)[مشروع المدقق الإملائي العربي الحر] 43 | * التصحيح التلقائي: يهتم بالأخطاء الشائعة التي لها وجه واحد. 44 | * مثل "إستعمال*" والصحيح "استعمال". 45 | * رابط مشروعنا : (http://ghalatawi.sf.net)[مشروع غلطاوي للتصحيح التلقائي] 46 | * التدقيق التركيبي: يهتم بالكلمة في سياقها. 47 | * مثلا في عبارة "إنشاء الله"، الكلمتان صحيحتان، لكن العبارة قد تحتمل خطأ تركيبيا، ويكون الصواب" إن شاء الله"، ولها وجه آخر صحيح في قولنا "الكون من إنشاء الله". 48 | * مثال: "بلاغ إلى المسافرون*"، والصواب "بلاغ إلى المسافرين". 49 | 50 | ## أنواع الأخطاء 51 | 52 | أداة اللغة مدقق لغوي تركيبي أسلوبي نحوي إملائي، ويدقق الأخطاء في الكلمات المركبة وسياقها، وتنقسم الأخطاء التي يعالجها إلى: 53 | 54 | * أخطاء إملائية: مثل "الجزاىر" => "الجزائر" 55 | 56 | * أخطاء نحوية: وتعني تصريف الكلمات حسب موضعها من الجملة. 57 | 58 | * مثل "إلى المسافرون*" => "إلى المسافرين" 59 | * مثل "لم يجري*" والصواب: "لم يجرِ" 60 | 61 | * أخطاء أسلوبية: وتعنى بالاستعمال اللغوي، والتعابير الركيكة. 62 | 63 | * مثل"القيام بعملية الضرب" => "يضرب". 64 | * ""علاوة على ذلك" => "إضافة إلى ذلك" 65 | 66 | * أخطاء دلالية: وتعنى باستعمال كلمات في غير محلها. 67 | 68 | * "كسر القانون" => "خالف القانون" 69 | * "رجل بسيط" => "رجل غرّ، مغفل، ساذج" 70 | 71 | 72 | 73 | ## بناء القواعد 74 | 75 | في أداة اللغة، تبنى القواعد بطريقتين: 76 | 77 | * ملف قواعد مكتوبة بلغة XML حسب صيغة معينة، الملف اسمه grammar.xml 78 | * قواعد مبرمجة بلغة جافا: تتطلب معرفة بنظام أداة اللغة، ومعرفة بالبرمجة، بعض هذه الأدوات يمكنها الاعتماد على ملفات قوائم كلمات مخصصة. 79 | 80 | ### القواعد المبرمجة: 81 | 82 | إليك بعض القواعد المبرمجة وملفات البيانات الخاصة بها: 83 | 84 | #### 85 | 86 | * coherency.txt 87 | 88 | * تجانس طريقة الكتابة، يهتم هذا الملف بالكلمات التي تُكتب بطرق مختلفة، لذا يُنبّه الكاتب إلى أنه استعمل الكلمة بطريقة مختلفة في نصه 89 | * مثلا، تُكتب كلمات مثل شئون ومسئول بطريقتين مختلفتين (شئون، شؤون؛ مسئول، مسؤول)، حسب البلاد العربية، لذا ينبهك المدقق إلى أنك استعملت الكلمة في نفس النص بطريقتين مختلفتين. 90 | 91 | * diacritics.txt 92 | 93 | * ملف الكلمات العامية والأجنبية التي لها مقابل عربي 94 | * مثلا: باص=> حافلة، ماركة=>عَلامَة. 95 | 96 | * redundancies.txt 97 | 98 | * بعض العبارات فيها حشو أي زائد، يستحسن أن تصحح، هذه العبارات يمكن تمثيلها في ملف القواعد، لكن وضعها هنا يسهل إضافتها دون كتابة قاعدة. 99 | * مثلا: سوف لن يسير =>لن يسير. 100 | * سوف لا=لا 101 | إلى عند=إلى 102 | طعام الغداء=الغداء 103 | طعام العشاء=العَشاء 104 | أما بالنسبة إلى=أما|ما يتعلق| أما ما يخصّ 105 | 106 | * wordiness.txt 107 | 108 | * قائمة عبارات الإسهاب المفرط. مثل التكرار والإطناب والعبارات الركيكة. 109 | * مثلا: هناك خطأ في العبارة=في العبارة خطأ 110 | الأحسن من ذلك=أحسن من ذلك 111 | النتائج الأفضل=أفضل النتائج 112 | ليكن في علم=نُعلم 113 | لي عظيم الشرف=يُشرفني 114 | 115 | * wrongWordInContext.txt 116 | 117 | * هذه الحالة تتعامل مع الأخطاء اللغوية الناتجة عن **تشابه الكلمات** التي تُنطق أو تُكتب بشكل متقارب ولكنها تختلف في المعنى، ويتم تصحيحها استنادًا إلى **السياق**. الهدف هو تحسين دقة النصوص العربية عبر التمييز بين الكلمات بناءً على البيئة التي وردت فيها، 118 | * مثل الفرق بين *"علم"* (معرفة) و*"عَلَم"* (راية)، أو *"صلاة"* (عبادة) و*"صلة"* (علاقة). 119 | 120 | * diacritics.txt 121 | 122 | * أحيانا بعض الكلمات نطقها الشائع غير صحيح، لذا يستحسن التنبيه على حركتها، وهي ليست خاطئة بلا حركات. 123 | * مثلا: حِراك => حَراك- فتح الحاء 124 | * طازج => طازَج- بفتح الزاي- 125 | 126 | * replaces.txt 127 | 128 | * لاستبدال الكلمات التي لا يتعرف عليها المدقق الإملائي، 129 | * مثلا: 130 | * ?=؟ 131 | ⁉=!؟ 132 | ⁈=؟! 133 | ⁇=؟؟ 134 | أباضية=إباضيّة الإباضية بكسر الهمزة 135 | أب الفقيد=أبو الفقيد|أبا الفقيد|أبي الفقيد 136 | أجازة=إجازة لأنها مصدر الرباعي "أجاز" 137 | 138 | * Darja.txt 139 | 140 | * في الكلمات العامية أو الأجنبية وما يقابلها من الفصيح 141 | * أمثلة: طرشي=فلفل حلو 142 | فايدة=فائدة 143 | راديو=مذياع 144 | سكانر=ماسح ضوئي 145 | سبيطار=مستشفى 146 | 147 | * arabic_adjective_exclamation.txt 148 | 149 | * قائمة الصفات وصيغة التفضيل منها، تستعمل في تصحيح عبارات التعجب. 150 | * مثلا: جميل=ما أجمل|أجمِل ب 151 | سعيد=ما أسعد|أسعِد ب 152 | مستعجل=ما أشدّ استعجال|اشدد باستعجال 153 | 154 | * arabic_masdar_verb.txt 155 | 156 | * قائمة المصادر وأفعالها المقابلة، تستعمل في استبدال المصدر بفعله في بعض الحالات: 157 | * مثل قاعدة "يقوم بالضرب" => "يضرب" 158 | 159 | * arabic_verb_masdar.txt 160 | 161 | * قائمة الأفعال ومصادرها المقابلة، تستعمل في استبدال الفعل بمصدره في بعض الحالات، مثل المفعول المطلق 162 | * مثل قاعدة "يعمل بأسلوب جميل" => "يعمل عملا جميلا" 163 | 164 | * homophones.txt 165 | 166 | * بعض الكلمات ملتبسة مثل الضن والظن، الأولى للبخل والثانية للشك، ويخلط بينهما الناس بسبب التشابه في النطق، وكلتاهما صحيحة، ولكن علينا توضيح الفرق بينهما في كل مرة، 167 | 168 | * مثال: 169 | 170 | * مضنة=مظنة 171 | حضر=حظر 172 | حاضر=حاظر 173 | أذان=آذانَ|أذان ف "أذان" هو نداء المؤذن للصلاة، أما "آذان" فجمع أذن، وهي عضو السمع 174 | الأب=الأبُّ|الأبُ فالأبُّ معناه المرعى؛ لقوله تعالى: "وفاكهة وأبًّا" أما الأب فأصله "أَبَو" فإذا نُسِب إليه، قيل: "أبويٌّ" والمثنّى "أبوان" 175 | 176 | * inflected_one_word.txt 177 | 178 | * هذا الملف للأغلاط في كلمة واحدة، يدعم هذا الملف الأشكال المختلفة للكلمة، 179 | * مثال: * أبحاث= بحوث 180 | * تشمل : الأبحاث، بالأبحاث، أبحاثهم، والأبحاث، إلخ 181 | * يشترط أن تكون الكلمة المستهدفة وتصحيحها ضمن القاموس، أي أنّ المدقق الإملائي لا يُخطّئها 182 | * أما الافعال، يجب أن تكتب مشكولة 183 | * الكلمات التي ليست معروفة للمدقق الإملائي أو العبارات توضع في ملف replaces.txt 184 | 185 | * verb_trans_direct_to_indirect.txt 186 | 187 | * قائمة الأفعال التي تكتب متعدية والصحيح أن تكون متعدية بحرف 188 | * مثال: تحَاشَى=من الفعل تحاشى متعد بمن. 189 | * أَهْدَى=ل|إلى أهدى متعدٍ بحرف مثلا "أهداه" والصواب: "أهدى له" 190 | 191 | * verb_trans_indirect_to_direct.txt 192 | 193 | * الأفعال المتعدية بحرف، الخاطئة وتصحيحها التعدي بنفسها. 194 | * مثل: يحج إلى البيت => يحج البيت 195 | 196 | * verb_trans_indirect_to_indirect.txt 197 | 198 | * الأفعال المتعدية بحرف، الخاطئة في حرف التعدية، واستبداله بحرف آخر 199 | * مثل تردّد على =>تردد إلى 200 | 201 | * verb_trans_to_untrans2.txt 202 | 203 | * الفعل المتعدي الذي يصحح باللزوم 204 | * مثل: احتاجه => احتاج إليه 205 | 206 | 207 | 208 | 209 | 210 | Here is the sorted table by filename, along with the total size at the end: 211 | 212 | | Filename | Description | Example | Size (lines) | 213 | | ----------------------------------- | ------------------------------------------------------------ | --------------------------------------------------- | ------------ | 214 | | arabic_adjective_exclamation.txt | قائمة الصفات وصيغ التفضيل المستعملة في التعجب | جميل => ما أجمل، سعيد => ما أسعد | 247 | 215 | | arabic_masdar_verb.txt | قائمة المصادر وأفعالها المقابلة | يقوم بالضرب => يضرب | 6361 | 216 | | arabic_verb_masdar.txt | قائمة الأفعال ومصادرها المقابلة | يعمل بأسلوب جميل => يعمل عملاً جميلاً | 5686 | 217 | | coherency.txt | تجانس طريقة الكتابة، يهتم بالكلمات التي تُكتب بطرق مختلفة | شئون، شؤون - مسئول، مسؤول | 6 | 218 | | darja.txt | كلمات عامية وأجنبية وما يقابلها بالفصحى | طرشي => فلفل حلو، راديو => مذياع | 238 | 219 | | diacritics.txt | أحيانا بعض الكلمات نطقها الشائع غير صحيح، لذا يستحسن التنبيه على حركتها، وهي ليست خاطئة بلا حركات | حِراك => حَراك- فتح الحاء؛ طازج => طازَج- بفتح الزاي- | 464 | 220 | | homophones.txt | كلمات ملتبسة بسبب التشابه في النطق | مضنة : مظنة، حضر : حظر | 170 | 221 | | inflected_one_word.txt | تصحيح الكلمة مع كل حالات تصريفها | أبحاث => بحوث، الأبحاث، أبحاثهم، بالأبحاث | 2 | 222 | | replaces.txt | كلمات تُستبدل تلقائياً لتحسين النص | أب الفقيد => أبو الفقيد، أجازة => إجازة | 661 | 223 | | redundancies.txt | عبارات فيها حشو زائد يُستحسن تصحيحها | سوف لن يسير => لن يسير | 18 | 224 | | verb_trans_direct_to_indirect.txt | أفعال متعدية يُصحح تعديها بحرف | تحاشى => تحاشى من، أهدى => أهدى له | 16 | 225 | | verb_trans_indirect_to_direct.txt | أفعال متعدية بحرف يُصحح تعديها بدون حرف | يحج إلى البيت => يحج البيت | 59 | 226 | | verb_trans_indirect_to_indirect.txt | أفعال متعدية بحرف يُصحح حرف تعديها | تردد على => تردد إلى | 88 | 227 | | verb_trans_to_untrans2.txt | أفعال متعدية يُصحح تعديها باللزوم | احتاجه => احتاج إليه | 4 | 228 | | wordiness.txt | عبارات الإسهاب المفرط والتكرار والإطناب | هناك خطأ في العبارة => في العبارة خطأ | 11 | 229 | | wrongWordInContext.txt | كلمات متشابهة في النطق أو الكتابة لكنها تختلف في المعنى | علم (معرفة) - عَلَم (راية) | 1 | 230 | | **Total** | - | - | **13736** | 231 | 232 | 233 | 234 | ### ملف القواعد 235 | 236 | **إحصائيات مفصلة لقواعد النحو العربي (التحليل الكامل)** 237 | 238 | **1. العدد الإجمالي للقواعد** 239 | 240 | - تم **اكتشاف 450 قاعدة** في الملف. 241 | 242 | **2. القواعد حسب الفئة** 243 | 244 | - **إجمالي عدد القواعد لكل فئة** 245 | - **إجمالي عدد القواعد لكل مجموعة قواعد** 246 | - **أكثر أنواع القواعد شيوعًا** 247 | - **ملخص لأنماط القواعد المستخدمة** 248 | 249 | #### **2. Rules by Category** 250 | 251 | | **Category** | **Number of Rules** | 252 | | ---------------------------- | ------------------- | 253 | | التطابق في النوع- مذكر ومؤنث | 28 | 254 | | أخطاء تركيبية | 103 | 255 | | أخطاء نحوية | 4 | 256 | | خطأ في الاستعمال | 99 | 257 | | الأخطاء المتعلقة بالأعداد | 19 | 258 | | أخطاء شائعة في كلمة واحدة | 61 | 259 | | أخطاء شائعة - النعوت | 46 | 260 | | أخطاء الأفعال | 27 | 261 | | تعابير مكررة | 5 | 262 | | مطبعية | 1 | 263 | | للمراجعة | 9 | 264 | | inconsistency | 13 | 265 | | grammar | 35 | 266 | 267 | #### **3. Rules by Rule Group** 268 | 269 | | **Rule Group** | **Number of Rules** | 270 | | --------------------------------- | ------------------- | 271 | | تطابق النوع مع أسماء الإشارة | 22 | 272 | | تطابق النوع مع الأسماء الموصولة | 2 | 273 | | تطابق النوع مع الضمير | 1 | 274 | | تطابق المصوف مع الصفة في النوع | 3 | 275 | | أخطاء شائعة | 27 | 276 | | العوامل الداخلة على الأفعال | 4 | 277 | | متلازمات شائعة | 50 | 278 | | مفعول مطلق | 2 | 279 | | أسماء مركبة | 1 | 280 | | أخطاء في المصادر | 3 | 281 | | استعمال خاطئ لحروف الجر | 20 | 282 | | خطأ في استعمال فعل | 99 | 283 | | تطابق العدد مع النوع | 17 | 284 | | تطابق العدد مع الإعراب | 1 | 285 | | تطابق العدد مع الجمع | 1 | 286 | | أخطاء شائعة ذات كلمة واحدة | 39 | 287 | | خطأ في استعمال كلمة | 22 | 288 | | أخطاء شائعة- الصفات | 37 | 289 | | خطأ في استعمال صفة | 4 | 290 | | النعوت السببية | 5 | 291 | | المتعدي بحرف | 5 | 292 | | المتعدي بحرف تصحيحه متعد بحرف آخر | 12 | 293 | | المتعدي بنفسه تصحيحه متعد بحرف | 2 | 294 | | المتعدي إلى مفعولين | 8 | 295 | | تعبير مكررة | 5 | 296 | | أخطاء مطبعية | 1 | 297 | | للمراجعة | 5 | 298 | | الصفة تتبع الموصوف | 1 | 299 | | صيف 20222 (تصحيح 2022) | 1 | 300 | | تطابق التاريخ مع اليوم | 12 | 301 | | تجربة ميزة جديدة | 7 | 302 | | مبتدأ نكرة بعده حرف جر | 5 | 303 | | اختار بين | 1 | 304 | | بينما في أول الكلام | 2 | 305 | | بين وبين | 6 | 306 | | يعمل كمدير | 3 | 307 | | لمدة | 2 | 308 | | تدقيق ألفاظ الأعداد | 1 | 309 | 310 | ------ 311 | 312 | This is the full and detailed analysis of your **Arabic grammar rules file**. 313 | 314 | 315 | 316 | **تقرير تحليل ملف قواعد النحو العربي** 317 | 318 | ### 1. مقدمة 319 | 320 | يهدف هذا التقرير إلى تحليل ملف قواعد النحو العربي المستعمل في التدقيق اللغوي، واستخراج الإحصائيات المتعلقة بالقواعد المختلفة، بما في ذلك عدد القواعد لكل فئة، وأهم الأخطاء الشائعة، وأنواع القواعد الأكثر استخدامًا. 321 | 322 | ### 2. العدد الإجمالي للقواعد 323 | 324 | تم اكتشاف **450 قاعدة** نحوية في الملف، موزعة على عدة فئات ومجموعات قواعد مختلفة. 325 | 326 | ### 3. توزيع القواعد حسب الفئة (أعلاه) 327 | 328 | ### 5. الاستنتاجات 329 | 330 | من خلال تحليل البيانات، يمكن استخلاص النقاط التالية: 331 | 332 | - الفئة الأكثر احتواءً على القواعد هي **أخطاء تركيبية** بعدد **103 قاعدة**. 333 | - الأخطاء المتعلقة بالاستعمال الخاطئ للأفعال تمثل نسبة كبيرة من القواعد، حيث تحتوي على **99 قاعدة**. 334 | - **المتلازمات الشائعة** تحتوي على **50 قاعدة**، مما يشير إلى وجود أخطاء متكررة في العبارات الاصطلاحية. 335 | - هناك **19 قاعدة** متعلقة بالأعداد، مما يعكس أهمية تدقيق الأخطاء المرتبطة بتمييز العدد وتطابقه مع المعدود. 336 | 337 | ### 6. التوصيات 338 | 339 | - تطوير المدقق اللغوي ليشمل تحسينات بناءً على الفئات الأكثر شيوعًا مثل الأخطاء التركيبية والأفعال. 340 | - تعزيز التدقيق الآلي للمتلازمات الشائعة بسبب كثرة الأخطاء المرتبطة بها. 341 | - تحسين معالجة الأعداد في النصوص العربية لتقليل الأخطاء المتعلقة بتطابق العدد مع الاسم. 342 | 343 | **تم إعداد هذا التقرير بناءً على تحليل ملف القواعد النحوية المستخدم في التدقيق اللغوي للغة العربية.** 344 | -------------------------------------------------------------------------------- /doc/mohamed_fareh.md: -------------------------------------------------------------------------------- 1 | # محمد فارح 2 |
3 | محمد فارح ( 5 ماي 1930 - 31 يوليو 1979) أستاذ ولغوي وصحفي جزائري. 4 | 5 | ## نشأته ودراسته 6 | 7 | 8 | ولد في 5 ماي 1930 بمدينة الميلية شمال قسنطينة بولاية جيجل حاليا. نشأ في أسرة محبة للعلم، بدأ تعلم القرآن في جامع القرية في سن الثالثة على يدي شيخه أحمد بن المشربط، لكن ظروفا اجتماعية قاهرة منعته من المواصلة، فساعد والده لكسب لقمة العيش. لكنه كان مولعا بطلب العلم فحفظ القرآن الكريم وحده وهو يرعى الغنم أو يجلس في الغابة أو يسير في الطريق. 9 | 10 | وعندما بلغ سن السادسة عشرة، انتقل إلى زاوية أولاد سيدي الشيخ بسيدي خليفة ولاية ميلة، ليحفظ القرآن حفظا جيدا، وتعلم رسومه وتعلم مبادئ اللغة العربية والفقه الإسلامي. ثم التحق بمعهد ابن باديس سنة 1950. 11 | 12 | في بداية سنة 1954 تحصل الأستاذ محمد فارح على شهادة الأهلية من معهد ابن باديس بملاحظة الامتياز مما أهله إلى بعثة تعليمية من جمعية العلماء في بعثة تعليمية، لكن الاستعمار حال دون ذلك. فسافر إلى تونس والتحق بجامع الزيتونة أواخر سنة 1955. 13 | 14 | ## إبان الثورة 15 | 16 | شارك محمد فارح في الثورة التحريرية خلال هجومات 20 أوت 1955، إذ التحق بأول خلية ثورية بمنطقة الميلية، وأحرق حقول المعمرين وقام بعمليات فدائية ضد المستعمر. وفي تونس التحق بجمعية الطلبة الجزائريين، ثم اتحاد الطلبة المسلمين الجزائريين في تونس. وكان رفقة المناضل عبد الحميد مهري والمذيع الراحل عيسى مسعودي وغيرهما. 17 | 18 | في سنة 1957 تحصل الأستاذ محمد فارح على شهادة التحصيل، ثم شهادة العالمية. ولما أسست الحكومة الجزائرية المؤقتة،أرسلت بعثات علمية إلى البلدان العربية، فأُرسل إلى جامعة بغداد سنة 1959، منتسبا إلى كلية الآداب، حيث درس على أيدي أساتذة مشهورين منهم الطاهر جواد ومصطفى جواد صاحب “قل ولا تقل في اللغة العربية”، وفي سنة 1962 تخرج منها بشهادة بكالوريوس “الليسانس” في اللغة والأدب العربي. 19 | 20 | ##عمله 21 | 22 | عاد من العراق إلى أرض الوطن غداة الاستقلال، وشكل ملفا للالتحاق بوزارة الخارجية، وبعد قبول التحاقه تقرر أن يرسل إلى سفارة الجزائر بالقاهرة، لكن والدته رفضت سفره، فنزل عند رغبتها. 23 | 24 | التحق بالتدريس بثانوية مليكة قايد بسطيف، وبعد سنة واحدة عاد إلى العاصمة والتحق بثانوية المقراني ببن عكنون كأستاذ للغة والأدب العربي، حيث قضى 14 سنة. 25 | وفي سنة 1976 ألحقه عبد الحميد مهري الذي كان مديرا للمدرسة العليا لتكوين الأساتذة أن يلتحق بالمدرسة. ثم ألحقه إسماعيل حمداني رئيس الحكومة الأسبق، الذي كان يشغل منصب أمين عام مساعد بالرئاسة بالصياغة اللغوية للميثاق الوطني. 26 | 27 | ثم التحق بمنصب مستشار تقني برئاسة الجمهورية سنة 1976، مهمته صياغة النصوص والقوانين، والمراجعة اللغوية لخطابات الرئيس بومدين ثم الشاذلي بن جديد بعد ذلك. 28 | اشتغل الأستاذ محمد فارح بجريدة الشعب كاتبًا صحفيًا منذ فجر الاستقلال طيلة 34 سنة، يكتب المقالات يوميا فكان يعدّ ركن “الثقافة للجميع” و”الخطأ والصواب” وهي صفحة مشكولة. 29 | درس بالمعهد العالي لأصول الدين، وأسهم في نشاطات المجلس الإسلامي الأعلى، وجمعية العلماء المسلمين الجزائريين، وكان مـن  مؤسسي الجمعية الوطنية للغة العربية سنة 1989 30 | 31 | 32 | ## من آثاره: 33 | 34 | * لغتنا الجميلة (حصة إذاعية في الإذاعة الجزائرية) 35 | * الثقافة للجميع (ركن في جريدة الشعب الجزائرية) 36 | * الخطأ والصواب (ركن في جريدة الشعب الجزائرية) 37 | 38 | ### برنامج "لغتنا الجميلة" 39 | 40 | اقترح عليه عيسى مسعودي ومدني حواس والأمين بشيشي إعداد برنامج من خمس دقائق لتصحيح الأخطاء الشائعة إذاعيا، فجاءت فكرة “لغتنا الجميلة”، ثم اختار المذيعين" شميسة وعبد الحفيظ الطويل”. وكان برنامجه الإذاعي الشهير “لغتنا الجميلة” يبث منه 03 حلقات في الأسبوع، و03 مرات في اليوم. 41 | 42 | حصل هذا البرنامج على الجائزة الأولى في المهرجان العربية للإذاعة والتلفزيون بالقاهرة، وتوقف بثه بعد 12 سنة. 43 | 44 | ### وصلات خارجية 45 | [محمد فارح: الصحفي الثائر في وجه التلوث اللغوي](https://www.asjp.cerist.dz/en/article/7050) 46 |
-------------------------------------------------------------------------------- /replaces.txt: -------------------------------------------------------------------------------- 1 | # Simple replace table 2 | # Format: word=suggestion1|suggestion2|suggestion3... 3 | # This is only for words that are not caught by spell checker 4 | # Mainly from https://github.com/linuxscout/aghlat 5 | 6 | ?=؟ 7 | ⁇=؟؟ 8 | ⁈=؟! 9 | ⁉=!؟ 10 | او=أو 11 | اذا=إذا 12 | الى=إلى 13 | فى=في 14 | هى=هي 15 | انت=أنت 16 | انتما=أنتما 17 | التى=التي 18 | الذى=الذي 19 | مائة=مئة 20 | المائة=المئة 21 | يافطة=لافتة 22 | اليافطة=اللافتة 23 | مقفول=مقفل 24 | مغلوق=مغلق 25 | ثقاة=ثقات 26 | رتوش=لمسة 27 | الرتوش=اللمسة 28 | تلفون=هاتف 29 | التلفون=الهاتف 30 | بالتلفون=بالهاتف 31 | بتلفون=هاتف 32 | نجاعة=نجوع 33 | النجاعة=النجوع 34 | ذاتا=ذواتا 35 | أسطحة=سطوح|أسْطح 36 | الأسطحة=السطوح|الأسْطح 37 | أسقفة=أسقف|سقوف|سُقف 38 | الأسقفة=الأسقف|السقوف|السُقف 39 | أظافر=أظفار 40 | الأظافر=الأظفار 41 | حصوة=حصاة 42 | الحصوة=الحصاة 43 | الصالون=البهو|الضيافة 44 | صالون=بهو|ضيافة 45 | كرتون=رسوم متحركة|ورق مقوى 46 | الكرتون=الرسوم المتحركة|الورق المقوى 47 | موانئ=مواني 48 | الموانئ=المواني 49 | وريث=وارث 50 | الوريث=الوارث 51 | أنوية=نَوًى|نَوَيات 52 | الأنوية=النَّوًى|النَّوَيات 53 | تصامم=تصامّ 54 | تطمين=طمأنة 55 | التطمين=الطمأنة 56 | حكايا=حكايات 57 | الحكايا=الحكايات 58 | خارطة=المُصوَّر|خريطة 59 | الخارطة=المُصوَّر|الخريطة 60 | رئيف=رؤوف 61 | الرئيف=الرؤوف 62 | رفاة=رفات 63 | الرفاة=الرفات 64 | عرايا=عريانون 65 | العرايا=العريانون 66 | فحوصات=فحوص 67 | الفحوصات=الفحوص 68 | قفازات=قفافيز 69 | القفازات=القفافيز 70 | كبلات=أكْبُل|كُبُول|أكبال|كِبال 71 | الكبلات=الأكْبُل|الكُبُول|الأكبال|الكِبال 72 | محلات=محالّ 73 | المحلات=المحالّ 74 | مدراء=مُديرو|مُديرون|مُديرين 75 | المدراء=المُديرو|المُديرون|المُديرين 76 | مندهش=دَهِش|مدهوش 77 | المندهش=الدَهِش|المدهوش 78 | نصوح=ناصح 79 | النصوح=الناصح 80 | والتي=التي 81 | والذي=الذي 82 | الإطلاع=الاطّلاع 83 | إطلاع=اطّلاع 84 | استبديت=استبدَدْتُ 85 | استغليت=استغلَلْتُ 86 | استقليت=استقلَلْتُ 87 | يضطرد=يطّرد 88 | اضطرد=يطّرد 89 | إيلول=أيلول 90 | عامود=عمود 91 | عواميد=أعْمِدة|عُمُد 92 | العامود=العمود 93 | العواميد=الأعْمِدة|العُمُد 94 | دافئ=دفئ|دفيء 95 | الدافئ=الدفئ|الدفيء 96 | قفراء=مُقْفِرَة|قَفْرَة|قَفْر 97 | القفراء=المُقْفِرَة|القَفْرَة|القَفْر 98 | أقنية=قنوات 99 | الاقنية=القنوات 100 | مجباة=مجبية 101 | المجباة=المجبية 102 | مندبون=مندوبون|منتدبون 103 | المندبون=المندوبون|المنتدبون 104 | مندبين=مندوبين|منتدبين 105 | المندبين=المندوبين|المنتدبين 106 | مقفول=مقفل 107 | المقفول=المقفل 108 | موصود=موصد|مؤصد 109 | طاقوي=طاقيّ 110 | معكوف=معقوف 111 | معكوفتان=معقوفتان 112 | معكوفة=معقوفة 113 | المعكوف=المعقوف 114 | المعكوفتان=المعقوفتان 115 | المعكوفة=المعقوفة 116 | مشوار=طريق|مسار|نزهة 117 | استبيان=استبانة 118 | الاستبيان=الاستبانة 119 | سواح=سياح 120 | السواح=السياح 121 | -------------------------------------------------------------------------------- /scripts/builder_const.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # 4 | # builder_const.py 5 | # 6 | ENTITIES = {'أنك': '&forms_anna;', 7 | 'أنكم': '&forms_anna;', 8 | 'أنكما': '&forms_anna;', 9 | 'أنكن': '&forms_anna;', 10 | 'أننا': '&forms_anna;', 11 | 'أنه': '&forms_anna;', 12 | 'أنها': '&forms_anna;', 13 | 'أنهم': '&forms_anna;', 14 | 'أنهما': '&forms_anna;', 15 | 'أنهن': '&forms_anna;', 16 | 'أني': '&forms_anna;', 17 | 'إلى': '&forms_ila;', 18 | 'إلي': '&forms_ila;', 19 | 'إليك': '&forms_ila;', 20 | 'إليكم': '&forms_ila;', 21 | 'إليكما': '&forms_ila;', 22 | 'إليكن': '&forms_ila;', 23 | 'إلينا': '&forms_ila;', 24 | 'إليه': '&forms_ila;', 25 | 'إليها': '&forms_ila;', 26 | 'إليهم': '&forms_ila;', 27 | 'إليهما': '&forms_ila;', 28 | 'إليهن': '&forms_ila;', 29 | 'إنك': '&forms_inna;', 30 | 'إنكم': '&forms_inna;', 31 | 'إنكما': '&forms_inna;', 32 | 'إنكن': '&forms_inna;', 33 | 'إننا': '&forms_inna;', 34 | 'إنه': '&forms_inna;', 35 | 'إنها': '&forms_inna;', 36 | 'إنهم': '&forms_inna;', 37 | 'إنهما': '&forms_inna;', 38 | 'إنهن': '&forms_inna;', 39 | 'إني': '&forms_inna;', 40 | 'بك': '&forms_bih;', 41 | 'بكم': '&forms_bih;', 42 | 'بكما': '&forms_bih;', 43 | 'بكن': '&forms_bih;', 44 | 'بنا': '&forms_bih;', 45 | 'به': '&forms_bih;', 46 | 'بها': '&forms_bih;', 47 | 'بهم': '&forms_bih;', 48 | 'بهما': '&forms_bih;', 49 | 'بهن': '&forms_bih;', 50 | 'بي': '&forms_bih;', 51 | 'حول': '&forms_hawla;', 52 | 'حولك': '&forms_hawla;', 53 | 'حولكم': '&forms_hawla;', 54 | 'حولكما': '&forms_hawla;', 55 | 'حولكن': '&forms_hawla;', 56 | 'حولنا': '&forms_hawla;', 57 | 'حوله': '&forms_hawla;', 58 | 'حولها': '&forms_hawla;', 59 | 'حولهم': '&forms_hawla;', 60 | 'حولهما': '&forms_hawla;', 61 | 'حولهن': '&forms_hawla;', 62 | 'على': '&forms_3ala;', 63 | 'علي': '&forms_3ala;', 64 | 'عليك': '&forms_3ala;', 65 | 'عليكم': '&forms_3ala;', 66 | 'عليكما': '&forms_3ala;', 67 | 'عليكن': '&forms_3ala;', 68 | 'علينا': '&forms_3ala;', 69 | 'عليه': '&forms_3ala;', 70 | 'عليها': '&forms_3ala;', 71 | 'عليهم': '&forms_3ala;', 72 | 'عليهما': '&forms_3ala;', 73 | 'عليهن': '&forms_3ala;', 74 | 'عن': '&forms_3an;', 75 | 'عنا': '&forms_3an;', 76 | 'عنك': '&forms_3an;', 77 | 'عنكم': '&forms_3an;', 78 | 'عنكما': '&forms_3an;', 79 | 'عنكن': '&forms_3an;', 80 | 'عنه': '&forms_3an;', 81 | 'عنها': '&forms_3an;', 82 | 'عنهم': '&forms_3an;', 83 | 'عنهما': '&forms_3an;', 84 | 'عنهن': '&forms_3an;', 85 | 'عني': '&forms_3an;', 86 | 'في': '&forms_fi;', 87 | 'فيك': '&forms_fi;', 88 | 'فيكم': '&forms_fi;', 89 | 'فيكما': '&forms_fi;', 90 | 'فيكن': '&forms_fi;', 91 | 'فينا': '&forms_fi;', 92 | 'فيه': '&forms_fi;', 93 | 'فيها': '&forms_fi;', 94 | 'فيهم': '&forms_fi;', 95 | 'فيهما': '&forms_fi;', 96 | 'فيهن': '&forms_fi;', 97 | 'لك': '&forms_lih;', 98 | 'لكم': '&forms_lih;', 99 | 'لكما': '&forms_lih;', 100 | 'لكن': '&forms_lih;', 101 | 'لنا': '&forms_lih;', 102 | 'له': '&forms_lih;', 103 | 'لها': '&forms_lih;', 104 | 'لهم': '&forms_lih;', 105 | 'لهما': '&forms_lih;', 106 | 'لهن': '&forms_lih;', 107 | 'لي': '&forms_lih;', 108 | 'مع': '&forms_ma3a;', 109 | 'معك': '&forms_ma3a;', 110 | 'معكم': '&forms_ma3a;', 111 | 'معكما': '&forms_ma3a;', 112 | 'معكن': '&forms_ma3a;', 113 | 'معنا': '&forms_ma3a;', 114 | 'معه': '&forms_ma3a;', 115 | 'معها': '&forms_ma3a;', 116 | 'معهم': '&forms_ma3a;', 117 | 'معهما': '&forms_ma3a;', 118 | 'معهن': '&forms_ma3a;', 119 | 'من': '&forms_min;', 120 | 'منك': '&forms_min;', 121 | 'منكم': '&forms_min;', 122 | 'منكما': '&forms_min;', 123 | 'منكن': '&forms_min;', 124 | 'مننا': '&forms_min;', 125 | 'منه': '&forms_min;', 126 | 'منها': '&forms_min;', 127 | 'منهم': '&forms_min;', 128 | 'منهما': '&forms_min;', 129 | 'منهن': '&forms_min;', 130 | 'مني': '&forms_min;'} 131 | 132 | DOCTYPE=u""" 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | ]>""" 159 | -------------------------------------------------------------------------------- /scripts/grammar_csv2xml.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # 4 | # test.py 5 | # Convert a file which contains grammar rules into grammar xml format for LanguageTool 6 | # The text file contains linguistic rules from book of "Guide of Commons errors" n by Marwan Albawab 7 | # الملف معالج يدويا ومجهز للبرمجة 8 | # الملف فيه الأعمدة التالية: 9 | # * number الرقم 10 | # * rule id: رقم القاعدة 11 | # * status: الحالة 12 | # * error category: صنف الخطأ 13 | # * style pattern النمطة 14 | # * correction المستبدل 15 | # * note الملاحظة 16 | # * Error الخطأ 17 | # * Correction التصحيح 18 | 19 | 20 | 21 | import sys 22 | import os 23 | import argparse 24 | import rule_builder 25 | import rule_converter_xml 26 | import rule_converter_replace 27 | scriptname = os.path.splitext(os.path.basename(sys.argv[0]))[0] 28 | scriptversion = '0.1' 29 | Separator="\t" 30 | 31 | AuthorName="Taha Zerrouki" 32 | 33 | # Limit of the fields treatment 34 | 35 | MAX_LINES_TREATED=1100000; 36 | 37 | 38 | def grabargs(): 39 | parser = argparse.ArgumentParser(description='Convert rules dictionary to xml rule grammar.') 40 | # add file name to import and filename to export 41 | 42 | parser.add_argument("-f", dest="filename", required=True, 43 | help="input file to convert", metavar="FILE") 44 | 45 | parser.add_argument("-d", dest="outformat", nargs='?', 46 | help="output format(csv, xml)", metavar="FORMAT") 47 | 48 | parser.add_argument("-v", dest="version", nargs='?', 49 | help="Release version", metavar="Version") 50 | 51 | parser.add_argument("-a",dest="all", type=bool, nargs='?', 52 | const=True, 53 | help="Generate all categories") 54 | parser.add_argument("-l",dest="limit", type=int, nargs='?', 55 | help="the limit of treated lines") 56 | parser.add_argument("-t",dest="category", type=str, nargs='?', default="all", 57 | help="generate only the category of errors(oneword, expression, collocations, indirect-transitive,verb, adjective)") 58 | args = parser.parse_args() 59 | return args 60 | 61 | def converter_factory(out_format="csv", category="all", version="N/A"): 62 | """ create a converter""" 63 | if out_format == "xml": 64 | return rule_converter_xml.rule_converter_xml(category, version) 65 | if out_format == "replace": 66 | return rule_converter_replace.rule_converter_replace(category, version) 67 | else: 68 | return rule_converter.rule_converter(category, version) 69 | def main(): 70 | args= grabargs() 71 | filename = args.filename 72 | limit = args.limit 73 | output_format =args.outformat 74 | category = args.category 75 | version = args.version 76 | 77 | try: 78 | fl = open(filename, encoding='utf8'); 79 | except: 80 | print(" Error :No such file or directory: %s" % filename) 81 | sys.exit(0) 82 | 83 | line = fl.readline() 84 | text = u"" 85 | rule_table = []; 86 | nb_field = 2; 87 | while line : 88 | line = line.strip('\n')#.strip() 89 | if not line.startswith("#"): 90 | liste = line.split(Separator); 91 | if len(liste) >= nb_field: 92 | rule_table.append(liste); 93 | 94 | line = fl.readline() 95 | fl.close(); 96 | 97 | model = 0; 98 | 99 | myconverter = converter_factory(output_format , category, version) 100 | # create header 101 | h = myconverter.add_header() 102 | if h: 103 | print(h) 104 | for tuple_rule in rule_table[:limit]: 105 | l = myconverter.add_record(tuple_rule) 106 | if l: 107 | print(l) 108 | # create footer 109 | f = myconverter.add_footer() 110 | if f: 111 | print(f) 112 | 113 | 114 | if __name__ == "__main__": 115 | main() 116 | -------------------------------------------------------------------------------- /scripts/prepare_3obikan.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # 4 | # 3obikan.py 5 | # Convert a data base of 3obikan to rules file 6 | 7 | 8 | import sys 9 | import os 10 | import argparse 11 | #~ import differ 12 | scriptname = os.path.splitext(os.path.basename(sys.argv[0]))[0] 13 | scriptversion = '0.1' 14 | Separator="\t" 15 | 16 | AuthorName="Taha Zerrouki" 17 | import rule_converter_obikan 18 | import rule_converter 19 | # Limit of the fields treatment 20 | 21 | MAX_LINES_TREATED=1100000; 22 | 23 | 24 | def grabargs(): 25 | parser = argparse.ArgumentParser(description='Convert rules dictionary to xml rule grammar.') 26 | # add file name to import and filename to export 27 | 28 | parser.add_argument("-f", dest="filename", required=True, 29 | help="input file to convert", metavar="FILE") 30 | 31 | parser.add_argument("-d", dest="done", nargs='?', 32 | help="Get the done file", metavar="DONE FILE") 33 | 34 | parser.add_argument("-v", dest="version", nargs='?', 35 | help="Release version", metavar="Version") 36 | 37 | parser.add_argument("-a",dest="all", type=bool, nargs='?', 38 | const=True, 39 | help="Generate all categories") 40 | parser.add_argument("-l",dest="limit", type=int, nargs='?', 41 | help="the limit of treated lines") 42 | parser.add_argument("-t",dest="category", type=str, nargs='?', default="all", 43 | help="generate only the category of errors(oneword, expression, collocations, indirect-transitive,verb, adjective)") 44 | args = parser.parse_args() 45 | return args 46 | 47 | def converter_factory(out_format="csv", dones=[], version="N/A"): 48 | """ create a converter""" 49 | if out_format == "obikan": 50 | return rule_converter_obikan.rule_converter_obikan(dones, version) 51 | else: 52 | return rule_converter.rule_converter("all", version) 53 | def read_done(fl): 54 | """ 55 | return a list of patterns 56 | """ 57 | line = fl.readline() 58 | text = u"" 59 | rule_table = []; 60 | nb_field = 2; 61 | while line : 62 | line = line.strip() 63 | if not line or not line.startswith("#"): 64 | rule_table.append(line); 65 | line = fl.readline() 66 | fl.close(); 67 | return rule_table 68 | 69 | def main(): 70 | args= grabargs() 71 | filename = args.filename 72 | limit = args.limit 73 | category = args.category 74 | version = args.version 75 | done_filename = args.done 76 | try: 77 | fl = open(filename, encoding='utf8'); 78 | except: 79 | print(" Error :No such file or directory: %s" % filename) 80 | sys.exit(0) 81 | if done_filename: 82 | try: 83 | fldone = open(done_filename, encoding='utf8'); 84 | except: 85 | print(" Error :No such file or directory: %s" % done_filename) 86 | sys.exit(0) 87 | 88 | dones = read_done(fldone) 89 | else: 90 | dones =[] 91 | 92 | line = fl.readline() 93 | text = u"" 94 | rule_table = []; 95 | nb_field = 2; 96 | while line : 97 | line = line.strip('\n')#.strip() 98 | if not line.startswith("#"): 99 | liste = line.split(Separator); 100 | if len(liste) >= nb_field: 101 | rule_table.append(liste); 102 | 103 | line = fl.readline() 104 | fl.close(); 105 | 106 | model = 0; 107 | myconverter = converter_factory("obikan", dones, version) 108 | # create header 109 | h = myconverter.add_header() 110 | if h: 111 | print(h) 112 | for tuple_rule in rule_table[:limit]: 113 | l = myconverter.add_record(tuple_rule) 114 | if l: 115 | print(l) 116 | # create footer 117 | f = myconverter.add_footer() 118 | if f: 119 | print(f) 120 | 121 | 122 | if __name__ == "__main__": 123 | main() 124 | -------------------------------------------------------------------------------- /scripts/prepare_masdar_verb.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # 4 | # prepare_masdar_verb.py 5 | # 6 | # Copyright 2022 zerrouki 7 | # 8 | # This program is free software; you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation; either version 2 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # This program is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with this program; if not, write to the Free Software 20 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 21 | # MA 02110-1301, USA. 22 | # 23 | # 24 | import pandas as pds 25 | import pyarabic.araby as ar 26 | DATA_FILE= "../data/dictionaries/masdars-verbs7000.csv" 27 | SEP="," 28 | def treat_verb(word): 29 | """ 30 | treat verb field 31 | """ 32 | # remove spaces 33 | word = word.strip() 34 | # ~ # remove مص 35 | # ~ word = word.replace("(مص.","") 36 | # ~ word = word.replace("(مص ","") 37 | # ~ # remove paranthesis 38 | # ~ word = word.replace(")","") 39 | # if not vocalized 40 | if not ar.is_vocalized(word): 41 | word += "Unvocalized" 42 | # Tshakeel before ALEF with hamza and Alef 43 | word = word.replace(ar.ALEF_HAMZA_ABOVE, ar.ALEF_HAMZA_ABOVE+ar.FATHA) 44 | word = word.replace(ar.ALEF_HAMZA_ABOVE+ar.FATHA+ar.SUKUN, ar.ALEF_HAMZA_ABOVE+ar.SUKUN) 45 | word = word.replace(ar.ALEF_HAMZA_ABOVE+ar.FATHA+ar.SHADDA, ar.ALEF_HAMZA_ABOVE+ar.SHADDA) 46 | word = word.replace(ar.TATWEEL,"") 47 | word = word.replace(ar.ALEF+ar.FATHA, ar.ALEF) 48 | word = word.replace(ar.ALEF_MAKSURA, ar.FATHA+ar.ALEF_MAKSURA) 49 | word = word.replace(ar.ALEF, ar.FATHA+ar.ALEF) 50 | word = word.replace(ar.HAMZA, ar.HAMZA+ar.FATHA) 51 | if word.startswith(ar.FATHA): 52 | word = word[1:] 53 | if not word.endswith(ar.FATHA): 54 | if not word.endswith(ar.ALEF_MAKSURA) and not word.endswith(ar.ALEF): 55 | word += ar.FATHA 56 | # remove successive fatha made by replacement 57 | while ar.FATHA+ar.FATHA in word: 58 | word = word.replace(ar.FATHA+ar.FATHA, ar.FATHA) 59 | 60 | wordlist = [w.strip() for w in word.split("،")] 61 | 62 | return wordlist 63 | 64 | 65 | def treat_masdar(word, extra=""): 66 | """ 67 | treat masdar field 68 | """ 69 | wordlist = [] 70 | # remove spaces 71 | word = word.strip() 72 | 73 | # split into fields 74 | fields = word.split("-") 75 | new_word = "" 76 | if len(fields)== 2: 77 | word1 = ar.strip_harakat(fields[0].strip()) 78 | word2 = ar.strip_harakat(fields[1].strip()) 79 | if word1 == word2: 80 | wordlist.append(word1) 81 | else: 82 | 83 | wordlist.extend([word1,word2]) 84 | else: 85 | wordlist.append(word) 86 | # remove spaces 87 | return wordlist 88 | 89 | 90 | def treat_line(line): 91 | """ 92 | Treat a line 93 | """ 94 | list_tuple = [] 95 | if line.startswith("#"): 96 | return False 97 | else: 98 | fields = line.split(SEP) 99 | if len(fields)>= 2: 100 | verbs = treat_verb(fields[0]) 101 | masdars = treat_masdar(fields[1]) 102 | for verb in verbs: 103 | for masdar in masdars: 104 | list_tuple.append({"verb":verb, "masdar":masdar}) 105 | return list_tuple; 106 | def load_file(filename): 107 | """ readline and extract masdars/verbs 108 | """ 109 | # open file 110 | try: 111 | fl=open(filename, "r", encoding="utf8") 112 | except: 113 | print("Can't open file:", filename) 114 | sys.exit() 115 | list_tuple= [] 116 | for line in fl.readlines(): 117 | masdar_verb = treat_line(line) 118 | if masdar_verb: 119 | list_tuple.extend(masdar_verb) 120 | 121 | return list_tuple 122 | 123 | def display(data, option="masdar"): 124 | """ 125 | Display as masdar= verb or verb to masdar 126 | """ 127 | df = pds.DataFrame.from_records(data) 128 | # ~ print(df.head()) 129 | dict_by_verb = df.groupby('verb')['masdar'].apply(list).to_dict() 130 | dict_by_masdar = df.groupby("masdar")['verb'].apply(list).to_dict() 131 | # ~ print(d) 132 | # ~ print(list_tuple) 133 | if option == "masdar": 134 | for key in dict_by_masdar: 135 | # key is masdar, and must be unvocalized 136 | key_nm = ar.strip_tashkeel(key) 137 | # values are verbs, must be vocalized 138 | verbs = dict_by_masdar[key] 139 | print("=".join([key_nm, "|".join(verbs)])) 140 | elif option == "verb": 141 | for key in dict_by_verb: 142 | # key is verb, and must be vocalized 143 | # value are masdars, and must be unvocalized 144 | masdars = [ar.strip_tashkeel(m) for m in dict_by_verb[key]] 145 | print("=".join([key, "|".join(masdars)])) 146 | else: 147 | print("Error: format not specified", option) 148 | 149 | def generate_example(data, option="masdar"): 150 | """ 151 | Display as masdar= verb or verb to masdar 152 | """ 153 | df = pds.DataFrame.from_records(data) 154 | # ~ print(df.head()) 155 | dict_by_verb = df.groupby('verb')['masdar'].apply(list).to_dict() 156 | dict_by_masdar = df.groupby("masdar")['verb'].apply(list).to_dict() 157 | # ~ print(d) 158 | # ~ print(list_tuple) 159 | if option == "masdar": 160 | for tup in data: 161 | masdar = ar.strip_tashkeel(tup.get("masdar","")) 162 | print("الولد يقوم بال%s"%(masdar)) 163 | elif option == "verb": 164 | for tup in data: 165 | verb = ar.strip_tashkeel(tup.get("verb","")) 166 | print(" الولد %s بأسلوب جيد"%(verb)) 167 | else: 168 | print("Error: format not specified", option) 169 | def tread_data(data): 170 | df = pds.DataFrame.from_records(data) 171 | print(df.head()) 172 | d = df.groupby('verb')['masdar'].apply(list).to_dict() 173 | print(d) 174 | def main(args): 175 | data = load_file(DATA_FILE) 176 | # generate data and example for masdars 177 | display(data, "masdar") 178 | # ~ generate_example(data,"masdar") 179 | # generate data and example for masdars 180 | #display(data, "verb") 181 | # ~ generate_example(data,"verb") 182 | 183 | return 0 184 | if __name__ == '__main__': 185 | import sys 186 | sys.exit(main(sys.argv)) 187 | -------------------------------------------------------------------------------- /scripts/rule_builder.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # 4 | # rule_builder.py 5 | # 6 | # Copyright 2019 zerrouki 7 | # 8 | # This program is free software; you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation; either version 2 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # This program is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with this program; if not, write to the Free Software 20 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 21 | # MA 02110-1301, USA. 22 | # 23 | # 24 | import re 25 | import sys 26 | import xml.dom.minidom 27 | 28 | import pyarabic.araby as araby 29 | import pyarabic.trans 30 | 31 | import builder_const 32 | class rule_builder: 33 | """ 34 | rule builder from given data 35 | """ 36 | def __init__(self,): 37 | """ 38 | init the rule builder 39 | """ 40 | self.pattern = [] 41 | self.suggestions = [] 42 | self.message = "" 43 | self.marker = [] 44 | self.examples = {"correct":[], 45 | "incorrect":[]} 46 | self.rulename = "" 47 | self.ruleid = "" 48 | self.category ="" 49 | self.category_english ="" 50 | self.mark_pos = 0 51 | self.example_marker_pos = 0 52 | self.inflected = "" 53 | self.regexp = "" 54 | self.postag = "" 55 | def set_category(self, category=""): 56 | """ set the error rule category""" 57 | self.category = category 58 | def set_category_english(self, category=""): 59 | """ set the error rule category""" 60 | self.category_english = category 61 | 62 | def get_marker_pos(self, marker_string): 63 | """ 64 | extract positions from string 65 | """ 66 | parts = marker_string.split("-") 67 | positions = [] 68 | for part in parts: 69 | try: 70 | x = int(part) - 1 71 | except ValueError: 72 | x = 0 73 | positions.append(x) 74 | if len(positions) >= 2: 75 | return positions[:2] 76 | elif len(positions) == 1: 77 | return positions*2 78 | else: 79 | return [0,0] 80 | 81 | 82 | 83 | def add_pattern(self,pattern, mark_pos = "", inflected="", regexp="", postag="", skip=""): 84 | """ add pattern """ 85 | self.pattern = araby.tokenize(self.clean(pattern)) 86 | # get marker pos as tuple 87 | self.mark_pos = self.get_marker_pos(mark_pos) 88 | #~ try: 89 | #~ self.mark_pos = int(mark_pos) - 1 90 | #~ except ValueError: 91 | #~ self.mark_pos = 0 92 | self.inflected = inflected 93 | self.regexp = regexp 94 | self.postag = postag 95 | try: 96 | self.skip = int(skip) 97 | except ValueError: 98 | self.skip = 0 99 | 100 | def add_context(self, context): 101 | """ add context """ 102 | self.context = araby.tokenize(self.clean(context)) 103 | 104 | def add_suggestions(self, suggestions=[]): 105 | """ add suggestion """ 106 | self.suggestions = self.clean(suggestions.split('|')) 107 | 108 | def add_marker(self, marker): 109 | """ add marker """ 110 | self.marker = araby.tokenize(self.clean(marker)) 111 | 112 | def add_message(self, message): 113 | """ add message """ 114 | self.message = self.clean(message) 115 | 116 | def add_example(self, example, correction=[], mark_pos ="", correct=False): 117 | """ add pattern """ 118 | 119 | 120 | if not correct: 121 | self.example_marker_pos = self.get_marker_pos(mark_pos) 122 | #~ print("# markpos '%s'"%mark_pos) 123 | self.examples['incorrect'].append(araby.strip_tashkeel(self.clean(example))) 124 | else: 125 | self.examples['correct'].append(self.clean(example)) 126 | 127 | def add_rulename(self, ruleid, rulename): 128 | """ add pattern """ 129 | self.rulename = rulename 130 | self.ruleid = ruleid 131 | 132 | def clean(self, strng): 133 | """ 134 | clean a string from unnecessary whitespaces 135 | """ 136 | #if type(strng) == str or type(strng) == unicode: 137 | if type(strng) == str:#python3 138 | strng = araby.strip_tatweel(strng) 139 | return re.sub(u'\s+', ' ', strng).strip() 140 | if type(strng) == list: 141 | l= [re.sub(u'\s+', ' ', s).strip() for s in strng] 142 | return [araby.strip_tatweel(s) for s in l] 143 | 144 | else: 145 | return strng 146 | 147 | def reset(self): 148 | """ reset parts""" 149 | self.__init__() 150 | @staticmethod 151 | def find_sublist(l, s): 152 | sub_set = -1 153 | if s == []: 154 | sub_set = 0 155 | elif s == l: 156 | sub_set = 0 157 | elif len(s) > len(l): 158 | sub_set = -1 159 | 160 | else: 161 | for i in range(len(l)): 162 | if l[i] == s[0]: 163 | n = 1 164 | while (n < len(s)) and (l[i+n] == s[n]): 165 | n += 1 166 | 167 | if n == len(s): 168 | sub_set = i 169 | break 170 | else: 171 | sub_set = -1 172 | 173 | return sub_set 174 | 175 | 176 | def make_pattern(self,): 177 | """ make pattern """ 178 | pattern = "" 179 | tokens = [araby.strip_tashkeel(t) for t in self.pattern] 180 | 181 | # make attributes 182 | attributes = [] 183 | if self.inflected =="yes": 184 | attributes.append('inflected="yes"') 185 | if self.regexp =="yes": 186 | attributes.append('regexp="yes"') 187 | if self.postag: 188 | attributes.append('postag="%s" postag_regexp="yes"'%self.postag) 189 | if self.skip: 190 | attributes.append('skip="%d"'%self.skip) 191 | attributes = u" ".join(attributes) 192 | 193 | 194 | if self.category == u"صفة": 195 | if len(tokens) >= 2: 196 | pattern = u""" 197 | 198 | %s 199 | %s 200 | """%(tokens[0], tokens[1]) 201 | # treat extra tokens in a context 202 | if len(tokens) > 2: 203 | for token in self.pattern[2:]: 204 | token = araby.strip_tashkeel(token) 205 | pattern += u" %s\n"%token 206 | elif self.category == u"كلمة واحدة": 207 | if len(tokens) >= 1: 208 | # one word is often wrong 209 | pattern = u"""(&procletics;)?%s"""%(tokens[0]) 210 | # treat extra tokens in a context 211 | if len(tokens) > 1: 212 | for token in self.pattern[1:]: 213 | token = araby.strip_tashkeel(token) 214 | pattern += self.make_token(token) 215 | elif self.category in (u"فعل", u"متعدي بحرف", u"متعدي إلى مفعولين"): 216 | for i in range(len(tokens)): 217 | # add marker 218 | if i >= self.mark_pos[0] and i <= self.mark_pos[1]: 219 | if i == self.mark_pos[0] : 220 | # one word is often wrong 221 | pattern += u"""""" 222 | pattern += self.make_token(self.pattern[i], attributes) 223 | if i == self.mark_pos[1] : 224 | # one word is often wrong 225 | pattern += u"""""" 226 | # add space 227 | pattern = " " + pattern 228 | # treat extra tokens in a context 229 | else: 230 | token = self.pattern[i] 231 | # some categories impose diacritized tokens out of marker 232 | if self.category not in (u"متعدي بحرف",): 233 | token = araby.strip_tashkeel(token) 234 | pattern += self.make_token(token, attributes) 235 | else: 236 | for token in self.context: 237 | token = araby.strip_tashkeel(token) 238 | pattern += self.make_token(token) 239 | pattern = "%s"%pattern 240 | return pattern 241 | 242 | def make_context(self,): 243 | """ add context """ 244 | pass 245 | def make_ruleid(self,): 246 | """ Build id rule by combining category, number and name""" 247 | # romanize arabic name 248 | 249 | name = pyarabic.trans.convert(self.rulename,'arabic','ascii') 250 | # convert spaces 251 | name = name.replace(" ", "_") 252 | # remove extra chars 253 | name = re.sub('[^a-zA-Z0-9_]','_',name) 254 | #~ ruleid = self.category_english+"_%04d_%s"%(self.ruleid, name) 255 | ruleid = u"%s_%s"%(self.ruleid, name) 256 | return ruleid 257 | 258 | def make_token(self, token, attributes=""): 259 | """ Prapare a token""" 260 | # if token is stop word 261 | # make it as regular expression 262 | entity = builder_const.ENTITIES.get(token, token) 263 | if token != entity: 264 | line = u' %s\n'%entity 265 | 266 | elif token == araby.BEH: 267 | line = u' \n' 268 | line = u' \n' 269 | elif token == araby.LAM: 270 | line = u' \n' 271 | line = u' \n' 272 | else: 273 | line = u" %s\n"%(attributes,token) 274 | return line 275 | def make_suggestions(self, ): 276 | """ add suggestion """ 277 | suggestions = "" 278 | if self.category == u"صفة": 279 | suggestions = """ """ 280 | for sug in self.suggestions: 281 | sug_tokens = araby.tokenize(sug) 282 | sug_tokens = [araby.strip_lastharaka(s) for s in sug_tokens] 283 | tokens = [araby.strip_tashkeel(t) for t in self.pattern] 284 | if len(tokens) >= 2 : 285 | match = tokens[1] 286 | else: 287 | match = "TODO" 288 | if len(sug_tokens) >= 2 : 289 | suggest = sug_tokens[1] 290 | else: 291 | suggest = sug 292 | suggestions += u""" \n"""%(match,suggest) 293 | elif self.category in (u"كلمة واحدة", u"فعل"): 294 | suggestions = "" 295 | for sug in self.suggestions: 296 | sug_tokens = araby.tokenize(sug) 297 | sug_tokens = [araby.strip_lastharaka(s) for s in sug_tokens] 298 | tokens = [araby.strip_tashkeel(t) for t in self.pattern] 299 | if len(tokens) >= 1 : 300 | match = tokens[0] 301 | else: 302 | match = "TODO" 303 | if len(sug_tokens) >= 1 : 304 | suggest = sug_tokens[0] 305 | else: 306 | suggest = sug 307 | elif self.category in ( u"متعدي بحرف", u"متعدي إلى مفعولين" ): 308 | match = self.pattern[0] 309 | 310 | # add some suggestions 311 | suggestions += u"\n" 314 | suggestions += u"\n" 317 | suggestions += u"\n" 320 | 321 | # make suggestion for verb category 322 | else: 323 | for sug in self.suggestions: 324 | suggestions += u" %s\n"%sug 325 | return suggestions 326 | 327 | def make_marker(self, marker): 328 | """ make marker """ 329 | self.marker = araby.tokenize(self.clean(marker)) 330 | 331 | def make_message(self, suggestions): 332 | """ add message """ 333 | # prepare message 334 | if not self.message: 335 | self.message = u"يفضل أن يقال:" 336 | message = u"%s \n%s"%(self.message, suggestions) 337 | return message 338 | 339 | 340 | def make_examples(self,): 341 | """ make xml format example """ 342 | corrections = u"|".join(self.suggestions) 343 | examples = "" 344 | #~ print('#********************%s'%self.example_marker_pos) 345 | #~ print(self.example_marker_pos) 346 | for exmp in self.examples["incorrect"]: 347 | ex_tokens = araby.tokenize(exmp) 348 | exmp_xml = "" 349 | begin_tag = False 350 | end_tag = False 351 | for i in range(len(ex_tokens)): 352 | if i == self.example_marker_pos[0]: 353 | exmp_xml += u"" 354 | begin_tag = True 355 | exmp_xml += ex_tokens[i] 356 | if i == self.example_marker_pos[1]: 357 | exmp_xml += u"" 358 | end_tag = True 359 | exmp_xml +=" " 360 | if begin_tag and not end_tag: 361 | exmp_xml += u"" 362 | examples +=u" %s \n"%(corrections, exmp_xml) 363 | 364 | for exmp in self.examples["correct"]: 365 | #~ exmp = exmp.replace(pat, "%s"%pat) 366 | examples +=u" %s "%(exmp) 367 | return examples 368 | 369 | 370 | 371 | def build(self, ): 372 | """ build actual rule treat rule to be displayed as LT grammar XML 373 | 374 | XML format as: 375 | 376 | 377 | ثلاثة 378 | 379 | 380 | أتقصد ثلاث؟ 381 | الاسم المؤنث يسبق بعدد مذكر 382 | ثلاثأولاد 383 | ثلاثةبنات 384 | 385 | 386 | input format is 387 | rule['pattern'] ; 388 | rule['suggestions'] 389 | rule['message'] ; 390 | rule['wrong_example'] ; 391 | rule['correct_example']; 392 | """ 393 | # every part is generated according to category 394 | # prepare pattern 395 | pattern = self.make_pattern() 396 | # prepare suggestions 397 | suggestions = self.make_suggestions() 398 | # prepare message 399 | message = self.make_message(suggestions) 400 | # prepare examples 401 | examples = self.make_examples() 402 | rule_id = self.make_ruleid() 403 | rulexml = u"" %(rule_id," ".join(self.context)) 404 | rulexml += u""" 405 | 406 | 407 | %s 408 | %s 409 | %s 410 | 411 | """%(rule_id, self.rulename, pattern, message, examples) 412 | 413 | 414 | #~ rulexml = self.pretty(rulexml) 415 | return rulexml 416 | 417 | def pretty(self, rulexml): 418 | """ Convert xml rule to pretty format 419 | """ 420 | # indent xml string 421 | rulexml = re.sub("[\t\n]","", rulexml) 422 | #.replace("\t"," ") 423 | #rulexml = rulexml.replace("\n","") 424 | rulexml = xml.dom.minidom.parseString(rulexml) 425 | rulexml = rulexml.toprettyxml(indent=" ") 426 | rulexml = rulexml.replace('','') 427 | return rulexml 428 | 429 | def main(args): 430 | # build a rule 431 | rb = rule_builder() 432 | dataset=[ 433 | {"pattern":u"يا أبَتِي", 434 | "marker":u"يا أبَتِي", 435 | "example":u"ياأبَتِي", 436 | "suggestions":u"يا أبَتِ", 437 | "message":u"التاء عِوَضٌ من الياء المحذوفة", 438 | }, 439 | ] 440 | for i, d in enumerate(dataset): 441 | rb.reset() 442 | rb.add_rulename(i, "unsorted_%d"%i) 443 | rb.add_pattern(d["pattern"]) 444 | rb.add_message(d['message']) 445 | rb.add_marker(d['marker']) 446 | rb.add_suggestions(d['suggestions']) 447 | rb.add_example(d['example'], d['suggestions'], d["marker"]) 448 | rule =rb.build() 449 | 450 | rule_xml = xml.dom.minidom.parseString(rule) 451 | rule_pretty_xml = xml.toprettyxml(indent=";") 452 | print(rule_pretty_xml) 453 | return 0 454 | 455 | if __name__ == '__main__': 456 | import sys 457 | sys.exit(main(sys.argv)) 458 | -------------------------------------------------------------------------------- /scripts/rule_builder_replace.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # 4 | # rule_builder.py 5 | # 6 | # Copyright 2019 zerrouki 7 | # 8 | # This program is free software; you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation; either version 2 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # This program is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with this program; if not, write to the Free Software 20 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 21 | # MA 02110-1301, USA. 22 | # 23 | # 24 | import re 25 | import sys 26 | import xml.dom.minidom 27 | 28 | import pyarabic.araby as araby 29 | import pyarabic.trans 30 | 31 | import builder_const 32 | import rule_builder 33 | class replace_builder(rule_builder.rule_builder): 34 | """ 35 | rule builder from given data 36 | """ 37 | def __init__(self,): 38 | """ 39 | init the rule builder 40 | """ 41 | rule_builder.rule_builder.__init__(self,) 42 | self.review_mark = "@" 43 | 44 | def reset(self): 45 | """ reset parts""" 46 | self.__init__() 47 | def add_pattern(self, pattern): 48 | """ add pattern """ 49 | self.pattern = araby.strip_tashkeel(self.clean(pattern)).split("|") 50 | self.pattern = list(set(self.pattern)) 51 | 52 | def make_pattern(self,): 53 | """ make pattern """ 54 | 55 | tmp_patterns = self.pattern 56 | for pat in self.pattern: 57 | if pat.startswith(u"ال"): 58 | # strip Al definite artilce 59 | pat = self.review_mark+pat[2:] 60 | tmp_patterns.append(pat) 61 | return tmp_patterns 62 | 63 | 64 | def make_ruleid(self,): 65 | """ Build id rule by combining category, number and name""" 66 | # romanize arabic name 67 | 68 | name = pyarabic.trans.convert(self.rulename,'arabic','ascii') 69 | # convert spaces 70 | name = name.replace(" ", "_") 71 | # remove extra chars 72 | name = re.sub('[^a-zA-Z0-9_]','_',name) 73 | ruleid = u"%s_%s"%(self.ruleid, name) 74 | return ruleid 75 | 76 | def make_suggestions(self, ): 77 | """ add suggestion """ 78 | suggestions = u"|".join(self.suggestions) 79 | return suggestions 80 | 81 | def make_marker(self, marker): 82 | """ make marker """ 83 | self.marker = araby.tokenize(self.clean(marker)) 84 | 85 | def make_message(self, suggestions): 86 | """ add message """ 87 | # prepare message 88 | if not self.message: 89 | self.message = u"" 90 | message = self.message 91 | return message 92 | 93 | 94 | def make_examples(self,): 95 | """ make xml format example """ 96 | return self.examples["incorrect"] + self.examples["correct"] 97 | 98 | 99 | 100 | def build(self, ): 101 | """ build actual rule treat rule to be displayed as LT grammar as text file 102 | pattern=suggestions\tmessage 103 | input format is 104 | rule['pattern'] ; 105 | rule['suggestions'] 106 | rule['message'] ; 107 | rule['wrong_example'] ; 108 | rule['correct_example']; 109 | """ 110 | # every part is generated according to category 111 | # prepare pattern 112 | patterns = self.make_pattern() 113 | # prepare suggestions 114 | suggestions = self.make_suggestions() 115 | # prepare message 116 | message = self.make_message(suggestions) 117 | # prepare examples 118 | examples = self.make_examples() 119 | rule_id = self.make_ruleid() 120 | ruletext = "" 121 | ruletext += "#idr "+ rule_id +"\n" 122 | ruletext += "#ptt "+ u"|".join(patterns) +"\n" 123 | ruletext += "#sgg "+ suggestions +"\n" 124 | ruletext += "#msg "+ message +"\n\n" 125 | for i, patt in enumerate(patterns): 126 | if i: 127 | ruletext += u"#%s [%d]\n"%(rule_id,i) 128 | else: 129 | ruletext += u"#%s\n"%(rule_id) 130 | if self.is_to_review(patt): 131 | suggestions = self.review_suggestions(patt) 132 | ruletext += u"%s=%s\t%s\n"%(patt, suggestions, message) 133 | return ruletext 134 | 135 | def is_to_review(self, pattern): 136 | """ check if pattern need review""" 137 | return self.review_mark in pattern 138 | 139 | def strip_al(self, word): 140 | """ 141 | if the word has an Al definite article and starts by a sun letter and its vocalized, 142 | we correct the shadda position 143 | """ 144 | if not word.startswith(u"ال"): 145 | return word 146 | else: 147 | word = word[2:] 148 | word = re.sub(u"^([%s])(%s)"%(u"".join(araby.SUN),araby.SHADDA), word[0], word, 1, re.UNICODE) 149 | return word 150 | 151 | def review_suggestions(self, pattern): 152 | """ 153 | review suggesions according to pattern 154 | """ 155 | sug_list = [] 156 | if self.review_mark in pattern: 157 | for sug in self.suggestions: 158 | if sug.startswith(u"ال"): 159 | sug = self.strip_al(sug) 160 | sug_list.append(sug) 161 | if sug_list: 162 | return u"|".join(sug_list) 163 | else: 164 | return u"|".join(self.suggestions) 165 | 166 | def main(args): 167 | # build a rule 168 | rb = replace_builder() 169 | dataset=[ 170 | {"pattern":u"يا أبَتِي", 171 | "marker":u"يا أبَتِي", 172 | "example":u"ياأبَتِي", 173 | "suggestions":u"يا أبَتِ", 174 | "message":u"التاء عِوَضٌ من الياء المحذوفة", 175 | }, 176 | {"pattern":u"داوود|طاووس", 177 | "marker":u"", 178 | "example":u"", 179 | "suggestions":u"داود|طاوس", 180 | "message":u"العرب تكره توالي الواوين", 181 | }, 182 | 183 | ] 184 | for i, d in enumerate(dataset): 185 | rb.reset() 186 | rb.add_rulename(i, "unsorted_%d"%i) 187 | rb.add_pattern(d["pattern"]) 188 | rb.add_message(d['message']) 189 | rb.add_marker(d['marker']) 190 | rb.add_suggestions(d['suggestions']) 191 | rb.add_example(d['example'], d['suggestions'], d["marker"]) 192 | rule =rb.build() 193 | 194 | #~ rule_xml = xml.dom.minidom.parseString(rule) 195 | #~ rule_pretty_xml = xml.toprettyxml(indent=";") 196 | print(rule) 197 | return 0 198 | 199 | if __name__ == '__main__': 200 | import sys 201 | sys.exit(main(sys.argv)) 202 | -------------------------------------------------------------------------------- /scripts/rule_converter.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # 4 | # rule_converter.py 5 | # 6 | # Copyright 2019 zerrouki 7 | # 8 | # This program is free software; you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation; either version 2 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # This program is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with this program; if not, write to the Free Software 20 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 21 | # MA 02110-1301, USA. 22 | # 23 | # 24 | import re 25 | import time 26 | import sys 27 | import pyarabic.araby as araby 28 | import rule_builder 29 | 30 | # Convert a file which contains grammar rules into grammar xml format for LanguageTool 31 | # The text file contains linguistic rules from book of "Guide of Commons errors" n by Marwan Albawab 32 | # الملف معالج يدويا ومجهز للبرمجة 33 | # الملف فيه الأعمدة التالية: 34 | # * number الرقم 35 | # * rule id: رقم القاعدة 36 | # * status: الحالة 37 | # * error category: صنف الخطأ 38 | # * style pattern النمطة 39 | # * correction المستبدل 40 | # * note الملاحظة 41 | # * Error الخطأ 42 | # * Correction التصحيح 43 | # * example_marker_pos موضع الاستبدال في المثال 44 | # * marker_pos موضع الاستبدال في النمط 45 | # * inflected تصريف 46 | # * regexp تعبير منتظم 47 | # * postag وسم أقسام الكلم 48 | 49 | class rule_converter: 50 | """ a virtual converter of data from table to specific format 51 | the data is big, then every function print string """ 52 | def __init__(self, category, version="N/A"): 53 | """ 54 | initiate the dict 55 | """ 56 | 57 | self.id = 0 58 | self.version = version 59 | self.field_id={ 60 | 'id':0, ##الرقم الأصلي 61 | 'rule_id':1, #رقم القاعدة 62 | 'status':2, #الحالة 63 | 'unvocalized':3, #غير مشكول للبحث 64 | 'category':4, #صنف الخطأ 65 | 'context':5, #السياق 66 | 'pattern':6, #الخطأ 67 | 'suggestions':7, #التصحيح 68 | 'note':8, #ملاحظة1 69 | 'wrong_example':9, #مثال خاطئ 70 | 'correct_example':10, #مثال صحيح 71 | 'example_marker_pos':11, # موضع الاستبدال في المثال 72 | 'marker_pos':12, # موضع الاستبدال في النمط 73 | 'inflected':13, # تصريف 74 | 'regexp':14,# تعبير منتظم 75 | 'postag':15, # وسم أقسام الكلم 76 | 'skip':16, # تخطي كلمة 77 | } 78 | #give the display order for text format display 79 | self.display_order=[ 80 | 'id', ##الرقم الأصلي 81 | 'rule_id', #رقم القاعدة 82 | 'status', #الحالة 83 | 'unvocalized', #غير مشكول للبحث 84 | 'category', #صنف الخطأ 85 | 'context', #السياق 86 | 'pattern', #الخطأ 87 | 'suggestions', #التصحيح 88 | 'note', #ملاحظة1 89 | 'wrong_example', #مثال خاطئ 90 | 'correct_example', #مثال صحيح 91 | 'example_marker_pos', # موضع الاستبدال في المثال 92 | 'marker_pos', # موضع الاستبدال في النمط 93 | 'inflected', # تصريف 94 | 'regexp',# تعبير منتظم 95 | 'postag', # وسم أقسام الكلم 96 | 'skip', # تخطي كلمة 97 | ] 98 | self.boolean_fields=[ 99 | ] 100 | category_table={ 101 | "oneword":u"كلمة واحدة", 102 | "indirect-transitive":u"متعدي بحرف", 103 | "double-transitive":u"متعدي إلى مفعولين", 104 | "expression":u"تعبير", 105 | "jar":u"حرف جر", 106 | "verb":u"فعل", 107 | "gender":u"نوع", 108 | "adjective":u"صفة", 109 | "spell":u"خطأ إملائي", 110 | "misc":u"منوع", 111 | "all":u"كل", 112 | u"diac":u"شكل", 113 | u"homophone":u"دارج", 114 | u"added":u"مضاف", 115 | u"word":u"كلمة", 116 | u"homophone":u"متشابه", 117 | u"darja":u"دارج", 118 | } 119 | counter_table={ 120 | "oneword":0, 121 | "indirect-transitive":1000, 122 | "expression":2000, 123 | "jar":3000, 124 | "verb":4000, 125 | "adjective":5000, 126 | "all":6000, 127 | "misc":8000, 128 | "":10000, 129 | } 130 | self.id = counter_table.get(category, 1); 131 | self.category = category_table.get(category, "all"); 132 | self.category_english = category 133 | 134 | if not category: 135 | print("Fatal Error : unsupported category", category) 136 | exit(); 137 | #generic Header for project 138 | self.headerlines = [ 139 | "*************************************", 140 | " Fareh, Our beautiful language, grammers errors rules", 141 | "Noun dictionary file", 142 | "Wordtype : %s"%self.category, 143 | "Version : %s"%self.version, 144 | "Generated at : %s"%time.strftime("%Y/%m/%d:%H:%M"), 145 | "Author : Taha Zerrouki", 146 | "Source : http://github.com/linuxscout/fareh", 147 | "*************************************", 148 | ] 149 | def add_header(self,): 150 | """ 151 | add the header for new dict 152 | """ 153 | line = "#" + "\n#".join(self.headerlines) + "\n" 154 | line += "#" + u"\t".join(self.display_order) 155 | return line 156 | 157 | def add_record(self, noun_row): 158 | """ 159 | Add a new to the dict 160 | """ 161 | self.id += 1 162 | fields = self.treat_tuple(noun_row) 163 | # add only given category 164 | if self.category != "all" and fields.get("category","") != self.category: 165 | return "" 166 | items=[]; 167 | for k in range(len(self.display_order)): 168 | key = self.display_order[k]; 169 | # some fields are integer, than we use str 170 | items.append(unicode(fields[key])) 171 | line = u"\t".join(items); 172 | return line 173 | 174 | def add_footer(self): 175 | """close the data set, used for ending xml, or sql""" 176 | return "" 177 | 178 | def __str__(self,): 179 | """ return string to """ 180 | pass; 181 | 182 | def treat_tuple(self,tuple_noun): 183 | """ convert row data to specific fields 184 | return a dict of fields""" 185 | #~ self.id+=1; 186 | #extract field from the noun tuple 187 | fields={}; 188 | for key in self.field_id.keys(): 189 | try: 190 | fields[key] = tuple_noun[self.field_id[key]].strip(); 191 | except IndexError: 192 | print("#"*5, "key error [%s],"%key, self.field_id[key], len(tuple_noun)) 193 | print(list(enumerate(tuple_noun))) 194 | print("key error", key) 195 | sys.exit() 196 | # change boolean fields 197 | for key in self.boolean_fields: 198 | if not fields[key]: 199 | fields[key] = False 200 | elif fields[key] in ('n',"N", "Non"): 201 | fields[key] = "no" 202 | elif fields[key] in ('o',"O"): 203 | fields[key] = "yes" 204 | else: 205 | fields[key] = 1 206 | return fields; 207 | 208 | 209 | def main(args): 210 | return 0 211 | 212 | if __name__ == '__main__': 213 | import sys 214 | sys.exit(main(sys.argv)) 215 | -------------------------------------------------------------------------------- /scripts/rule_converter_obikan.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # 4 | # rule_builder.py 5 | # 6 | # Copyright 2019 zerrouki 7 | # 8 | # This program is free software; you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation; either version 2 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # This program is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with this program; if not, write to the Free Software 20 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 21 | # MA 02110-1301, USA. 22 | # 23 | # 24 | import re 25 | import time 26 | import pyarabic.araby as araby 27 | #~ import sys 28 | 29 | import rule_converter 30 | import difflib 31 | 32 | class rule_converter_obikan(rule_converter.rule_converter): 33 | """ a virtual converter of data from table to specific format 34 | the data is big, then every function print string """ 35 | def __init__(self, dones=[], version="N/A"): 36 | """ 37 | initiate the dict 38 | """ 39 | rule_converter.rule_converter.__init__(self, "all", version) 40 | # rules already managed 41 | self.dones = dones 42 | #~ print(len(dones)) 43 | #~ sys.exit() 44 | self.id = 0 45 | self.field_id={ 46 | 'id':0, ##الرقم الأصلي 47 | 'root':1, #رقم القاعدة 48 | 'status':2, #الحالة 49 | 'category':3, #صنف الخطأ 50 | 'words':4, #السياق 51 | 'wrong_example':5, #مثال خاطئ 52 | 'correct_example':6, #مثال صحيح 53 | 'message':7, #ملاحظة1 54 | } 55 | #give the display order for text format display 56 | self.display_order=[ 57 | 'id', ##الرقم الأصلي 58 | #~ 'rule_id', #رقم القاعدة 59 | 'status', #الحالة 60 | 'words', #الحالة 61 | #~ 'unvocalized', #غير مشكول للبحث 62 | 'category', #صنف الخطأ 63 | 'context', #السياق 64 | 'pattern', #الخطأ 65 | 'suggestions', #التصحيح 66 | 'message', #ملاحظة1 67 | 'wrong_example', #مثال خاطئ 68 | 'correct_example', #مثال صحيح 69 | 'example_marker_pos', # موضع الاستبدال في المثال 70 | 'marker_pos', # موضع الاستبدال في النمط 71 | 'inflected', # تصريف 72 | 'regexp',# تعبير منتظم 73 | 'postag', # وسم أقسام الكلم 74 | 'skip', # تخطي كلمة 75 | 'remark', 76 | 'reference', 77 | ] 78 | #generic Header for project 79 | self.headerlines = [] 80 | #~ self.headerlines = [ 81 | #~ "*************************************", 82 | #~ " Fareh, Our beautiful language, grammers errors rules", 83 | #~ "Noun dictionary file", 84 | #~ "Wordtype : %s"%self.category, 85 | #~ "Version : %s"%self.version, 86 | #~ "Generated at : %s"%time.strftime("%Y/%m/%d:%H:%M"), 87 | #~ "Author : Taha Zerrouki", 88 | #~ "Source : http://github.com/linuxscout/fareh", 89 | #~ "*************************************", 90 | #~ ] 91 | 92 | def add_footer(self,): 93 | """ 94 | add the footer for new dict 95 | """ 96 | line = """""" 97 | return line 98 | @staticmethod 99 | def join_list_list(list_list, sep=u" "): 100 | """ 101 | join a list of list of tokens 102 | """ 103 | strng = u"|".join([sep.join(x) for x in list_list]) 104 | return strng 105 | @staticmethod 106 | def join_list_list_int(list_list, sep=u" "): 107 | """ 108 | join a list of list of tokens 109 | """ 110 | strng = u"|".join([sep.join([str(x) for x in lst]) for lst in list_list]) 111 | return strng 112 | 113 | def add_record(self, noun_row): 114 | """ 115 | Add a new to the dict 116 | """ 117 | self.id += 1 118 | fields = self.treat_tuple(noun_row) 119 | status =fields.get("status", False) 120 | if status != u"سبق": 121 | wrong_example = fields.get("wrong_example","") 122 | correct_example = fields.get("correct_example","") 123 | result = self.wrap_diff_line([wrong_example, correct_example]) 124 | 125 | fields["pattern"] = result.get("patterns", []) 126 | fields["suggestions"] = result.get("suggestions", []) 127 | fields["context"] = result.get("context", []) 128 | fields["example_marker_pos"] = result.get("marker_pos", []) 129 | # add guessed category if no category found 130 | if not fields.get("category","") : 131 | cat = self.guess_category(fields) 132 | if cat: 133 | fields["category"] = cat +"*" 134 | else: 135 | fields["category"] = "" 136 | # guess if already treated 137 | if not fields.get("status","") : 138 | done = self.is_already_done(fields["pattern"], fields["words"], wrong_example ) 139 | if done: 140 | fields["status"] = done +"*" 141 | else: 142 | fields["status"] = "" 143 | # 144 | # join positions 145 | 146 | 147 | # prepare display 148 | items=[]; 149 | for key in self.display_order: 150 | #~ key = self.display_order[k]; 151 | # some fields are integer, than we use str 152 | items.append(fields.get(key,"")) 153 | line = u"\t".join(items); 154 | return line 155 | 156 | @staticmethod 157 | def guess_category(fields): 158 | """ 159 | guess the category of correction 160 | pattern : list of token 161 | """ 162 | # if is a diacritics 163 | #~ pat = u" ".join(pattern) 164 | #~ sug = u" ".join(suggestion) 165 | pattern = fields["pattern"] 166 | suggestions =fields["suggestions"] 167 | words = fields["words"] 168 | message = araby.strip_tashkeel(fields["message"]) 169 | pat_nm = araby.strip_tashkeel(pattern) 170 | sug_nm = araby.strip_tashkeel(suggestions) 171 | if pat_nm == sug_nm: 172 | return "diacritics" 173 | if re.search(u"|".join([u"الضبط الصحيح", u"ضبط", u"نطق", u"ما أقرته المعجمات"]), message): 174 | return "diacritics" 175 | 176 | # test if rule is foreign 177 | if re.search("[a-zA-Z]", message): 178 | return "darja" 179 | indices = [u"فارسي", 180 | u"فرنسي", 181 | u"إنجليزي", 182 | u"تركي", 183 | u"عامي", 184 | u"مترجم", 185 | u"ترجمة", 186 | u"أجنبي", 187 | u"دخيل", 188 | u"أعجمي", 189 | u"أعجمية", 190 | u"لاتيني", 191 | u"غير عربي", 192 | ] 193 | if re.search(u"|".join(indices), message): 194 | return "darja" 195 | # test if rule is transitive verb 196 | if re.search(u"|".join(['يتعدى', 'متعدي', 'بنفسه', 'بحرف', 'تعدي', u"مفعولين"]), message): 197 | return "trans" 198 | # test if rule is verb 199 | if re.search(u"|".join([u"فعل",]), message): 200 | return "verb" 201 | # test if rule is expression 202 | if re.search(u"|".join([u"تعبير",u"ركيك", u"تعابير"]), message): 203 | return "expression" 204 | # test if rule is gender related 205 | if re.search(u"|".join([u"مؤنث",u"مذكر", u"إناث", u"يؤنث",u"يذكر", u"ذكور", u"تأنيث", u"تذكير"]), message): 206 | return "expression" 207 | 208 | # test if rule is gender related 209 | if re.search(u"|".join([u"لم يرد",u"لا يوجد", u"لم تسمع", u"كلام العرب",u"لغة العرب", u"ذكور", u"تأنيث", u"تذكير"]), message): 210 | return "expr" 211 | 212 | # if is just one word 213 | tokens = araby.tokenize(fields["words"]) 214 | tokens_pattern = araby.tokenize(pattern) 215 | if len(tokens) == 1 and len(tokens_pattern) == 1: 216 | return "oneword" 217 | return "" 218 | 219 | 220 | def is_already_done(self, pattern, words ="", wrong_example=""): 221 | """ 222 | check if the pattern is already treated in our project 223 | pattern : list of token 224 | """ 225 | # if pattern exists in dones 226 | pat = araby.strip_tashkeel(pattern) 227 | wrd = words 228 | if wrd: 229 | wrd = araby.strip_tashkeel(wrd) 230 | wrong_example = araby.strip_tashkeel(wrong_example) 231 | if pat in self.dones or wrd in self.dones: 232 | return "done" 233 | for d in self.dones: 234 | if d in wrd: 235 | return "done-word" 236 | if d in pat: 237 | return "done-pattern" 238 | if d in wrong_example: 239 | return "done-example" 240 | return "" 241 | 242 | def wrap_diff_line(self, rule): 243 | """ 244 | extract information from a rule example tuple 245 | """ 246 | result = self.diff_line(rule) 247 | #~ print(result) 248 | #prepare results 249 | result["patterns"] = self.join_list_list(result.get("patterns", [])) 250 | #~ result["patterns"] = araby.strip_tashkeel(result["patterns"]) 251 | result["suggestions"] = self.join_list_list(result.get("suggestions", [])) 252 | result["context"] = u" ".join(result.get("context", [])) 253 | # add guessed category if no category found 254 | #~ result["category"] = u";".join(result.get("categories", [])) 255 | # join positions 256 | result["marker_pos"] = self.join_list_list_int(result.get("marker_pos", []),'-') 257 | return result 258 | 259 | @staticmethod 260 | def diff_line(rule): 261 | """ 262 | extract information from a rule example tuple 263 | """ 264 | # a line contains a correct and incorrect exqmple 265 | marker_begin ="" 266 | marker_end ="" 267 | debug = False 268 | a,b = rule 269 | a = araby.tokenize(a) 270 | b = araby.tokenize(b) 271 | s = difflib.SequenceMatcher(None, a, b) 272 | if debug: 273 | for block in s.get_matching_blocks(): 274 | print(block) 275 | # extract patterns 276 | patterns = [] 277 | # extract suggestions 278 | suggestions = [] 279 | wrong_example = [] 280 | marker_pos = [] 281 | correct_example = [] 282 | categories = [] 283 | for tag, i1, i2, j1, j2 in s.get_opcodes(): 284 | if debug: 285 | print('{:7} a[{}:{}] --> b[{}:{}] {!r:>8} --> {!r}'.format( 286 | tag, i1, i2, j1, j2, a[i1:i2], b[j1:j2])) 287 | if tag == "equal": 288 | wrong_example.extend(a[i1:i2]) 289 | elif tag in ("delete", "insert", "replace"): 290 | wrong_example.append(marker_begin) 291 | wrong_example.extend(a[i1:i2]) 292 | wrong_example.append(marker_end) 293 | suggestions.append(b[j1:j2]) 294 | patterns.append(a[i1:i2]) 295 | marker_pos.append((i1,i2)) 296 | #~ cat = self.guess_category(a[i1:i2], b[j1:j2]) 297 | #~ if cat : 298 | #~ categories.append(cat) 299 | else: 300 | wrong_example.extend(a[i1:i2]) 301 | result={"patterns": patterns, 302 | "suggestions": suggestions, 303 | "example_wrong": wrong_example, 304 | "context": a, 305 | "marker_pos":marker_pos, 306 | "example_correct": b, 307 | #~ "categories": list(set(categories)), 308 | } 309 | return result 310 | def main(args): 311 | return 0 312 | 313 | if __name__ == '__main__': 314 | import sys 315 | sys.exit(main(sys.argv)) 316 | -------------------------------------------------------------------------------- /scripts/rule_converter_replace.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # 4 | # rule_builder.py 5 | # 6 | # Copyright 2019 zerrouki 7 | # 8 | # This program is free software; you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation; either version 2 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # This program is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with this program; if not, write to the Free Software 20 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 21 | # MA 02110-1301, USA. 22 | # 23 | # 24 | import re 25 | import time 26 | import pyarabic.araby as araby 27 | 28 | 29 | import rule_builder_replace 30 | import rule_converter 31 | import builder_const 32 | # Convert a file which contains grammar rules into grammar xml format for LanguageTool 33 | # The text file contains linguistic rules from book of "Guide of Commons errors" n by Marwan Albawab 34 | # الملف معالج يدويا ومجهز للبرمجة 35 | # الملف فيه الأعمدة التالية: 36 | # * number الرقم 37 | # * rule id: رقم القاعدة 38 | # * status: الحالة 39 | # * error category: صنف الخطأ 40 | # * style pattern النمطة 41 | # * correction المستبدل 42 | # * note الملاحظة 43 | # * Error الخطأ 44 | # * Correction التصحيح 45 | 46 | class rule_converter_replace(rule_converter.rule_converter): 47 | """ a virtual converter of data from table to specific format 48 | the data is big, then every function print string """ 49 | def __init__(self, category, version="N/A"): 50 | """ 51 | initiate the dict 52 | """ 53 | rule_converter.rule_converter.__init__(self, category, version) 54 | self.builder = rule_builder_replace.replace_builder() 55 | 56 | def add_header(self,): 57 | """ 58 | add the header for new dict 59 | """ 60 | line = "" 61 | return line 62 | 63 | def add_footer(self,): 64 | """ 65 | add the footer for new dict 66 | """ 67 | line = """""" 68 | return line 69 | 70 | def add_record(self, noun_row): 71 | """ 72 | Add a new to the dict 73 | """ 74 | self.id += 1 75 | fields = self.treat_tuple(noun_row) 76 | 77 | status =fields.get("status", False) 78 | #~ if status == "done": 79 | if status: 80 | return "" 81 | # add only given category 82 | if self.category != "all" and fields.get("category","") != self.category: 83 | return "" 84 | 85 | 86 | rb = self.builder 87 | rb.reset() 88 | name = araby.strip_tashkeel(fields['context']) 89 | rb.set_category(fields.get("category","")) 90 | #~ rb.set_category_english(self.category_english) 91 | ruleid = fields["rule_id"] 92 | if not ruleid: 93 | ruleid = self.category_english+"_%04d"%(self.id) 94 | 95 | rb.add_rulename(ruleid, name) 96 | rb.add_context(fields["context"]) 97 | rb.add_message(fields['note']) 98 | #~ rb.add_pattern(fields["pattern"], mark_pos = fields["marker_pos"], inflected=fields["inflected"], regexp=fields["regexp"], postag=fields["postag"], skip= fields["skip"]) 99 | rb.add_pattern(fields["pattern"]) 100 | rb.add_suggestions(fields['suggestions']) 101 | rb.add_example(fields['wrong_example'], correction=fields['suggestions'], mark_pos = fields["example_marker_pos"], correct=False) 102 | rb.add_example(fields['correct_example'],correct=True) 103 | rule = rb.build() 104 | return rule 105 | 106 | def main(args): 107 | return 0 108 | 109 | if __name__ == '__main__': 110 | import sys 111 | sys.exit(main(sys.argv)) 112 | -------------------------------------------------------------------------------- /scripts/rule_converter_rule.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # 4 | # rule_builder.py 5 | # 6 | # Copyright 2019 zerrouki 7 | # 8 | # This program is free software; you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation; either version 2 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # This program is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with this program; if not, write to the Free Software 20 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 21 | # MA 02110-1301, USA. 22 | # 23 | # 24 | import re 25 | import time 26 | import pyarabic.araby as araby 27 | 28 | 29 | import rule_builder 30 | import rule_converter 31 | import builder_const 32 | # Convert a file which contains grammar rules into grammar xml format for LanguageTool 33 | # The text file contains linguistic rules from book of "Guide of Commons errors" n by Marwan Albawab 34 | # الملف معالج يدويا ومجهز للبرمجة 35 | # الملف فيه الأعمدة التالية: 36 | # * number الرقم 37 | # * rule id: رقم القاعدة 38 | # * status: الحالة 39 | # * error category: صنف الخطأ 40 | # * style pattern النمطة 41 | # * correction المستبدل 42 | # * note الملاحظة 43 | # * Error الخطأ 44 | # * Correction التصحيح 45 | 46 | class rule_converter_xml(rule_converter.rule_converter): 47 | """ a virtual converter of data from table to specific format 48 | the data is big, then every function print string """ 49 | def __init__(self, category, version="N/A"): 50 | """ 51 | initiate the dict 52 | """ 53 | rule_converter.rule_converter.__init__(self, category, version) 54 | self.builder = rule_builder.rule_builder() 55 | 56 | def add_header(self,): 57 | """ 58 | add the header for new dict 59 | """ 60 | line = """""" 61 | line += "\n" 62 | line += "\n" 63 | line += builder_const.DOCTYPE 64 | line += u"""""" 65 | return line 66 | 67 | def add_footer(self,): 68 | """ 69 | add the footer for new dict 70 | """ 71 | line = """""" 72 | return line 73 | 74 | def add_record(self, noun_row): 75 | """ 76 | Add a new to the dict 77 | """ 78 | self.id += 1 79 | fields = self.treat_tuple(noun_row) 80 | 81 | status =fields.get("status", False) 82 | if status == "done": 83 | return "" 84 | # add only given category 85 | if self.category != "all" and fields.get("category","") != self.category: 86 | return "" 87 | 88 | 89 | rb = self.builder 90 | rb.reset() 91 | name = araby.strip_tashkeel(fields['context']) 92 | rb.set_category(fields.get("category","")) 93 | #~ rb.set_category_english(self.category_english) 94 | ruleid = fields["rule_id"] 95 | if not ruleid: 96 | ruleid = self.category_english+"_%04d"%(self.id) 97 | 98 | rb.add_rulename(ruleid, name) 99 | rb.add_context(fields["context"]) 100 | rb.add_message(fields['note']) 101 | rb.add_pattern(fields["pattern"], mark_pos = fields["marker_pos"], inflected=fields["inflected"], regexp=fields["regexp"], postag=fields["postag"], skip= fields["skip"]) 102 | rb.add_suggestions(fields['suggestions']) 103 | rb.add_example(fields['wrong_example'], correction=fields['suggestions'], mark_pos = fields["example_marker_pos"], correct=False) 104 | rb.add_example(fields['correct_example'],correct=True) 105 | rule =rb.build() 106 | return rule 107 | 108 | def main(args): 109 | return 0 110 | 111 | if __name__ == '__main__': 112 | import sys 113 | sys.exit(main(sys.argv)) 114 | -------------------------------------------------------------------------------- /scripts/rule_converter_xml.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # 4 | # rule_builder.py 5 | # 6 | # Copyright 2019 zerrouki 7 | # 8 | # This program is free software; you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation; either version 2 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # This program is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with this program; if not, write to the Free Software 20 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 21 | # MA 02110-1301, USA. 22 | # 23 | # 24 | import re 25 | import time 26 | import pyarabic.araby as araby 27 | 28 | 29 | import rule_builder 30 | import rule_converter 31 | import builder_const 32 | # Convert a file which contains grammar rules into grammar xml format for LanguageTool 33 | # The text file contains linguistic rules from book of "Guide of Commons errors" n by Marwan Albawab 34 | # الملف معالج يدويا ومجهز للبرمجة 35 | # الملف فيه الأعمدة التالية: 36 | # * number الرقم 37 | # * rule id: رقم القاعدة 38 | # * status: الحالة 39 | # * error category: صنف الخطأ 40 | # * style pattern النمطة 41 | # * correction المستبدل 42 | # * note الملاحظة 43 | # * Error الخطأ 44 | # * Correction التصحيح 45 | 46 | class rule_converter_xml(rule_converter.rule_converter): 47 | """ a virtual converter of data from table to specific format 48 | the data is big, then every function print string """ 49 | def __init__(self, category, version="N/A"): 50 | """ 51 | initiate the dict 52 | """ 53 | rule_converter.rule_converter.__init__(self, category, version) 54 | self.builder = rule_builder.rule_builder() 55 | 56 | def add_header(self,): 57 | """ 58 | add the header for new dict 59 | """ 60 | line = """""" 61 | line += "\n" 62 | line += "\n" 63 | line += builder_const.DOCTYPE 64 | line += u"""""" 65 | return line 66 | 67 | def add_footer(self,): 68 | """ 69 | add the footer for new dict 70 | """ 71 | line = """""" 72 | return line 73 | 74 | def add_record(self, noun_row): 75 | """ 76 | Add a new to the dict 77 | """ 78 | self.id += 1 79 | fields = self.treat_tuple(noun_row) 80 | 81 | status =fields.get("status", False) 82 | if status == "done": 83 | return "" 84 | # add only given category 85 | if self.category != "all" and fields.get("category","") != self.category: 86 | return "" 87 | 88 | 89 | rb = self.builder 90 | rb.reset() 91 | name = araby.strip_tashkeel(fields['context']) 92 | rb.set_category(fields.get("category","")) 93 | #~ rb.set_category_english(self.category_english) 94 | ruleid = fields["rule_id"] 95 | if not ruleid: 96 | ruleid = self.category_english+"_%04d"%(self.id) 97 | 98 | rb.add_rulename(ruleid, name) 99 | rb.add_context(fields["context"]) 100 | rb.add_message(fields['note']) 101 | rb.add_pattern(fields["pattern"], mark_pos = fields["marker_pos"], inflected=fields["inflected"], regexp=fields["regexp"], postag=fields["postag"], skip= fields["skip"]) 102 | rb.add_suggestions(fields['suggestions']) 103 | rb.add_example(fields['wrong_example'], correction=fields['suggestions'], mark_pos = fields["example_marker_pos"], correct=False) 104 | rb.add_example(fields['correct_example'],correct=True) 105 | rule =rb.build() 106 | return rule 107 | 108 | def main(args): 109 | return 0 110 | 111 | if __name__ == '__main__': 112 | import sys 113 | sys.exit(main(sys.argv)) 114 | --------------------------------------------------------------------------------