1# Generated by Snowball 2.2.0 - https://snowballstem.org/ 2 3from .basestemmer import BaseStemmer 4from .among import Among 5 6 7class ArabicStemmer(BaseStemmer): 8 ''' 9 This class implements the stemming algorithm defined by a snowball script. 10 Generated by Snowball 2.2.0 - https://snowballstem.org/ 11 ''' 12 13 a_0 = [ 14 Among(u"\u0640", -1, 1), 15 Among(u"\u064B", -1, 1), 16 Among(u"\u064C", -1, 1), 17 Among(u"\u064D", -1, 1), 18 Among(u"\u064E", -1, 1), 19 Among(u"\u064F", -1, 1), 20 Among(u"\u0650", -1, 1), 21 Among(u"\u0651", -1, 1), 22 Among(u"\u0652", -1, 1), 23 Among(u"\u0660", -1, 2), 24 Among(u"\u0661", -1, 3), 25 Among(u"\u0662", -1, 4), 26 Among(u"\u0663", -1, 5), 27 Among(u"\u0664", -1, 6), 28 Among(u"\u0665", -1, 7), 29 Among(u"\u0666", -1, 8), 30 Among(u"\u0667", -1, 9), 31 Among(u"\u0668", -1, 10), 32 Among(u"\u0669", -1, 11), 33 Among(u"\uFE80", -1, 12), 34 Among(u"\uFE81", -1, 16), 35 Among(u"\uFE82", -1, 16), 36 Among(u"\uFE83", -1, 13), 37 Among(u"\uFE84", -1, 13), 38 Among(u"\uFE85", -1, 17), 39 Among(u"\uFE86", -1, 17), 40 Among(u"\uFE87", -1, 14), 41 Among(u"\uFE88", -1, 14), 42 Among(u"\uFE89", -1, 15), 43 Among(u"\uFE8A", -1, 15), 44 Among(u"\uFE8B", -1, 15), 45 Among(u"\uFE8C", -1, 15), 46 Among(u"\uFE8D", -1, 18), 47 Among(u"\uFE8E", -1, 18), 48 Among(u"\uFE8F", -1, 19), 49 Among(u"\uFE90", -1, 19), 50 Among(u"\uFE91", -1, 19), 51 Among(u"\uFE92", -1, 19), 52 Among(u"\uFE93", -1, 20), 53 Among(u"\uFE94", -1, 20), 54 Among(u"\uFE95", -1, 21), 55 Among(u"\uFE96", -1, 21), 56 Among(u"\uFE97", -1, 21), 57 Among(u"\uFE98", -1, 21), 58 Among(u"\uFE99", -1, 22), 59 Among(u"\uFE9A", -1, 22), 60 Among(u"\uFE9B", -1, 22), 61 Among(u"\uFE9C", -1, 22), 62 Among(u"\uFE9D", -1, 23), 63 Among(u"\uFE9E", -1, 23), 64 Among(u"\uFE9F", -1, 23), 65 Among(u"\uFEA0", -1, 23), 66 Among(u"\uFEA1", -1, 24), 67 Among(u"\uFEA2", -1, 24), 68 Among(u"\uFEA3", -1, 24), 69 Among(u"\uFEA4", -1, 24), 70 Among(u"\uFEA5", -1, 25), 71 Among(u"\uFEA6", -1, 25), 72 Among(u"\uFEA7", -1, 25), 73 Among(u"\uFEA8", -1, 25), 74 Among(u"\uFEA9", -1, 26), 75 Among(u"\uFEAA", -1, 26), 76 Among(u"\uFEAB", -1, 27), 77 Among(u"\uFEAC", -1, 27), 78 Among(u"\uFEAD", -1, 28), 79 Among(u"\uFEAE", -1, 28), 80 Among(u"\uFEAF", -1, 29), 81 Among(u"\uFEB0", -1, 29), 82 Among(u"\uFEB1", -1, 30), 83 Among(u"\uFEB2", -1, 30), 84 Among(u"\uFEB3", -1, 30), 85 Among(u"\uFEB4", -1, 30), 86 Among(u"\uFEB5", -1, 31), 87 Among(u"\uFEB6", -1, 31), 88 Among(u"\uFEB7", -1, 31), 89 Among(u"\uFEB8", -1, 31), 90 Among(u"\uFEB9", -1, 32), 91 Among(u"\uFEBA", -1, 32), 92 Among(u"\uFEBB", -1, 32), 93 Among(u"\uFEBC", -1, 32), 94 Among(u"\uFEBD", -1, 33), 95 Among(u"\uFEBE", -1, 33), 96 Among(u"\uFEBF", -1, 33), 97 Among(u"\uFEC0", -1, 33), 98 Among(u"\uFEC1", -1, 34), 99 Among(u"\uFEC2", -1, 34), 100 Among(u"\uFEC3", -1, 34), 101 Among(u"\uFEC4", -1, 34), 102 Among(u"\uFEC5", -1, 35), 103 Among(u"\uFEC6", -1, 35), 104 Among(u"\uFEC7", -1, 35), 105 Among(u"\uFEC8", -1, 35), 106 Among(u"\uFEC9", -1, 36), 107 Among(u"\uFECA", -1, 36), 108 Among(u"\uFECB", -1, 36), 109 Among(u"\uFECC", -1, 36), 110 Among(u"\uFECD", -1, 37), 111 Among(u"\uFECE", -1, 37), 112 Among(u"\uFECF", -1, 37), 113 Among(u"\uFED0", -1, 37), 114 Among(u"\uFED1", -1, 38), 115 Among(u"\uFED2", -1, 38), 116 Among(u"\uFED3", -1, 38), 117 Among(u"\uFED4", -1, 38), 118 Among(u"\uFED5", -1, 39), 119 Among(u"\uFED6", -1, 39), 120 Among(u"\uFED7", -1, 39), 121 Among(u"\uFED8", -1, 39), 122 Among(u"\uFED9", -1, 40), 123 Among(u"\uFEDA", -1, 40), 124 Among(u"\uFEDB", -1, 40), 125 Among(u"\uFEDC", -1, 40), 126 Among(u"\uFEDD", -1, 41), 127 Among(u"\uFEDE", -1, 41), 128 Among(u"\uFEDF", -1, 41), 129 Among(u"\uFEE0", -1, 41), 130 Among(u"\uFEE1", -1, 42), 131 Among(u"\uFEE2", -1, 42), 132 Among(u"\uFEE3", -1, 42), 133 Among(u"\uFEE4", -1, 42), 134 Among(u"\uFEE5", -1, 43), 135 Among(u"\uFEE6", -1, 43), 136 Among(u"\uFEE7", -1, 43), 137 Among(u"\uFEE8", -1, 43), 138 Among(u"\uFEE9", -1, 44), 139 Among(u"\uFEEA", -1, 44), 140 Among(u"\uFEEB", -1, 44), 141 Among(u"\uFEEC", -1, 44), 142 Among(u"\uFEED", -1, 45), 143 Among(u"\uFEEE", -1, 45), 144 Among(u"\uFEEF", -1, 46), 145 Among(u"\uFEF0", -1, 46), 146 Among(u"\uFEF1", -1, 47), 147 Among(u"\uFEF2", -1, 47), 148 Among(u"\uFEF3", -1, 47), 149 Among(u"\uFEF4", -1, 47), 150 Among(u"\uFEF5", -1, 51), 151 Among(u"\uFEF6", -1, 51), 152 Among(u"\uFEF7", -1, 49), 153 Among(u"\uFEF8", -1, 49), 154 Among(u"\uFEF9", -1, 50), 155 Among(u"\uFEFA", -1, 50), 156 Among(u"\uFEFB", -1, 48), 157 Among(u"\uFEFC", -1, 48) 158 ] 159 160 a_1 = [ 161 Among(u"\u0622", -1, 1), 162 Among(u"\u0623", -1, 1), 163 Among(u"\u0624", -1, 1), 164 Among(u"\u0625", -1, 1), 165 Among(u"\u0626", -1, 1) 166 ] 167 168 a_2 = [ 169 Among(u"\u0622", -1, 1), 170 Among(u"\u0623", -1, 1), 171 Among(u"\u0624", -1, 2), 172 Among(u"\u0625", -1, 1), 173 Among(u"\u0626", -1, 3) 174 ] 175 176 a_3 = [ 177 Among(u"\u0627\u0644", -1, 2), 178 Among(u"\u0628\u0627\u0644", -1, 1), 179 Among(u"\u0643\u0627\u0644", -1, 1), 180 Among(u"\u0644\u0644", -1, 2) 181 ] 182 183 a_4 = [ 184 Among(u"\u0623\u0622", -1, 2), 185 Among(u"\u0623\u0623", -1, 1), 186 Among(u"\u0623\u0624", -1, 1), 187 Among(u"\u0623\u0625", -1, 4), 188 Among(u"\u0623\u0627", -1, 3) 189 ] 190 191 a_5 = [ 192 Among(u"\u0641", -1, 1), 193 Among(u"\u0648", -1, 1) 194 ] 195 196 a_6 = [ 197 Among(u"\u0627\u0644", -1, 2), 198 Among(u"\u0628\u0627\u0644", -1, 1), 199 Among(u"\u0643\u0627\u0644", -1, 1), 200 Among(u"\u0644\u0644", -1, 2) 201 ] 202 203 a_7 = [ 204 Among(u"\u0628", -1, 1), 205 Among(u"\u0628\u0627", 0, -1), 206 Among(u"\u0628\u0628", 0, 2), 207 Among(u"\u0643\u0643", -1, 3) 208 ] 209 210 a_8 = [ 211 Among(u"\u0633\u0623", -1, 4), 212 Among(u"\u0633\u062A", -1, 2), 213 Among(u"\u0633\u0646", -1, 3), 214 Among(u"\u0633\u064A", -1, 1) 215 ] 216 217 a_9 = [ 218 Among(u"\u062A\u0633\u062A", -1, 1), 219 Among(u"\u0646\u0633\u062A", -1, 1), 220 Among(u"\u064A\u0633\u062A", -1, 1) 221 ] 222 223 a_10 = [ 224 Among(u"\u0643\u0645\u0627", -1, 3), 225 Among(u"\u0647\u0645\u0627", -1, 3), 226 Among(u"\u0646\u0627", -1, 2), 227 Among(u"\u0647\u0627", -1, 2), 228 Among(u"\u0643", -1, 1), 229 Among(u"\u0643\u0645", -1, 2), 230 Among(u"\u0647\u0645", -1, 2), 231 Among(u"\u0647\u0646", -1, 2), 232 Among(u"\u0647", -1, 1), 233 Among(u"\u064A", -1, 1) 234 ] 235 236 a_11 = [ 237 Among(u"\u0646", -1, 1) 238 ] 239 240 a_12 = [ 241 Among(u"\u0627", -1, 1), 242 Among(u"\u0648", -1, 1), 243 Among(u"\u064A", -1, 1) 244 ] 245 246 a_13 = [ 247 Among(u"\u0627\u062A", -1, 1) 248 ] 249 250 a_14 = [ 251 Among(u"\u062A", -1, 1) 252 ] 253 254 a_15 = [ 255 Among(u"\u0629", -1, 1) 256 ] 257 258 a_16 = [ 259 Among(u"\u064A", -1, 1) 260 ] 261 262 a_17 = [ 263 Among(u"\u0643\u0645\u0627", -1, 3), 264 Among(u"\u0647\u0645\u0627", -1, 3), 265 Among(u"\u0646\u0627", -1, 2), 266 Among(u"\u0647\u0627", -1, 2), 267 Among(u"\u0643", -1, 1), 268 Among(u"\u0643\u0645", -1, 2), 269 Among(u"\u0647\u0645", -1, 2), 270 Among(u"\u0643\u0646", -1, 2), 271 Among(u"\u0647\u0646", -1, 2), 272 Among(u"\u0647", -1, 1), 273 Among(u"\u0643\u0645\u0648", -1, 3), 274 Among(u"\u0646\u064A", -1, 2) 275 ] 276 277 a_18 = [ 278 Among(u"\u0627", -1, 1), 279 Among(u"\u062A\u0627", 0, 2), 280 Among(u"\u062A\u0645\u0627", 0, 4), 281 Among(u"\u0646\u0627", 0, 2), 282 Among(u"\u062A", -1, 1), 283 Among(u"\u0646", -1, 1), 284 Among(u"\u0627\u0646", 5, 3), 285 Among(u"\u062A\u0646", 5, 2), 286 Among(u"\u0648\u0646", 5, 3), 287 Among(u"\u064A\u0646", 5, 3), 288 Among(u"\u064A", -1, 1) 289 ] 290 291 a_19 = [ 292 Among(u"\u0648\u0627", -1, 1), 293 Among(u"\u062A\u0645", -1, 1) 294 ] 295 296 a_20 = [ 297 Among(u"\u0648", -1, 1), 298 Among(u"\u062A\u0645\u0648", 0, 2) 299 ] 300 301 a_21 = [ 302 Among(u"\u0649", -1, 1) 303 ] 304 305 B_is_defined = False 306 B_is_verb = False 307 B_is_noun = False 308 309 def __r_Normalize_pre(self): 310 v_1 = self.cursor 311 try: 312 while True: 313 v_2 = self.cursor 314 try: 315 try: 316 v_3 = self.cursor 317 try: 318 self.bra = self.cursor 319 among_var = self.find_among(ArabicStemmer.a_0) 320 if among_var == 0: 321 raise lab3() 322 self.ket = self.cursor 323 if among_var == 1: 324 if not self.slice_del(): 325 return False 326 327 elif among_var == 2: 328 if not self.slice_from(u"0"): 329 return False 330 elif among_var == 3: 331 if not self.slice_from(u"1"): 332 return False 333 elif among_var == 4: 334 if not self.slice_from(u"2"): 335 return False 336 elif among_var == 5: 337 if not self.slice_from(u"3"): 338 return False 339 elif among_var == 6: 340 if not self.slice_from(u"4"): 341 return False 342 elif among_var == 7: 343 if not self.slice_from(u"5"): 344 return False 345 elif among_var == 8: 346 if not self.slice_from(u"6"): 347 return False 348 elif among_var == 9: 349 if not self.slice_from(u"7"): 350 return False 351 elif among_var == 10: 352 if not self.slice_from(u"8"): 353 return False 354 elif among_var == 11: 355 if not self.slice_from(u"9"): 356 return False 357 elif among_var == 12: 358 if not self.slice_from(u"\u0621"): 359 return False 360 elif among_var == 13: 361 if not self.slice_from(u"\u0623"): 362 return False 363 elif among_var == 14: 364 if not self.slice_from(u"\u0625"): 365 return False 366 elif among_var == 15: 367 if not self.slice_from(u"\u0626"): 368 return False 369 elif among_var == 16: 370 if not self.slice_from(u"\u0622"): 371 return False 372 elif among_var == 17: 373 if not self.slice_from(u"\u0624"): 374 return False 375 elif among_var == 18: 376 if not self.slice_from(u"\u0627"): 377 return False 378 elif among_var == 19: 379 if not self.slice_from(u"\u0628"): 380 return False 381 elif among_var == 20: 382 if not self.slice_from(u"\u0629"): 383 return False 384 elif among_var == 21: 385 if not self.slice_from(u"\u062A"): 386 return False 387 elif among_var == 22: 388 if not self.slice_from(u"\u062B"): 389 return False 390 elif among_var == 23: 391 if not self.slice_from(u"\u062C"): 392 return False 393 elif among_var == 24: 394 if not self.slice_from(u"\u062D"): 395 return False 396 elif among_var == 25: 397 if not self.slice_from(u"\u062E"): 398 return False 399 elif among_var == 26: 400 if not self.slice_from(u"\u062F"): 401 return False 402 elif among_var == 27: 403 if not self.slice_from(u"\u0630"): 404 return False 405 elif among_var == 28: 406 if not self.slice_from(u"\u0631"): 407 return False 408 elif among_var == 29: 409 if not self.slice_from(u"\u0632"): 410 return False 411 elif among_var == 30: 412 if not self.slice_from(u"\u0633"): 413 return False 414 elif among_var == 31: 415 if not self.slice_from(u"\u0634"): 416 return False 417 elif among_var == 32: 418 if not self.slice_from(u"\u0635"): 419 return False 420 elif among_var == 33: 421 if not self.slice_from(u"\u0636"): 422 return False 423 elif among_var == 34: 424 if not self.slice_from(u"\u0637"): 425 return False 426 elif among_var == 35: 427 if not self.slice_from(u"\u0638"): 428 return False 429 elif among_var == 36: 430 if not self.slice_from(u"\u0639"): 431 return False 432 elif among_var == 37: 433 if not self.slice_from(u"\u063A"): 434 return False 435 elif among_var == 38: 436 if not self.slice_from(u"\u0641"): 437 return False 438 elif among_var == 39: 439 if not self.slice_from(u"\u0642"): 440 return False 441 elif among_var == 40: 442 if not self.slice_from(u"\u0643"): 443 return False 444 elif among_var == 41: 445 if not self.slice_from(u"\u0644"): 446 return False 447 elif among_var == 42: 448 if not self.slice_from(u"\u0645"): 449 return False 450 elif among_var == 43: 451 if not self.slice_from(u"\u0646"): 452 return False 453 elif among_var == 44: 454 if not self.slice_from(u"\u0647"): 455 return False 456 elif among_var == 45: 457 if not self.slice_from(u"\u0648"): 458 return False 459 elif among_var == 46: 460 if not self.slice_from(u"\u0649"): 461 return False 462 elif among_var == 47: 463 if not self.slice_from(u"\u064A"): 464 return False 465 elif among_var == 48: 466 if not self.slice_from(u"\u0644\u0627"): 467 return False 468 elif among_var == 49: 469 if not self.slice_from(u"\u0644\u0623"): 470 return False 471 elif among_var == 50: 472 if not self.slice_from(u"\u0644\u0625"): 473 return False 474 else: 475 if not self.slice_from(u"\u0644\u0622"): 476 return False 477 raise lab2() 478 except lab3: pass 479 self.cursor = v_3 480 if self.cursor >= self.limit: 481 raise lab1() 482 self.cursor += 1 483 except lab2: pass 484 continue 485 except lab1: pass 486 self.cursor = v_2 487 break 488 except lab0: pass 489 self.cursor = v_1 490 return True 491 492 def __r_Normalize_post(self): 493 v_1 = self.cursor 494 try: 495 self.limit_backward = self.cursor 496 self.cursor = self.limit 497 self.ket = self.cursor 498 if self.find_among_b(ArabicStemmer.a_1) == 0: 499 raise lab0() 500 self.bra = self.cursor 501 if not self.slice_from(u"\u0621"): 502 return False 503 self.cursor = self.limit_backward 504 except lab0: pass 505 self.cursor = v_1 506 v_2 = self.cursor 507 try: 508 while True: 509 v_3 = self.cursor 510 try: 511 try: 512 v_4 = self.cursor 513 try: 514 self.bra = self.cursor 515 among_var = self.find_among(ArabicStemmer.a_2) 516 if among_var == 0: 517 raise lab4() 518 self.ket = self.cursor 519 if among_var == 1: 520 if not self.slice_from(u"\u0627"): 521 return False 522 elif among_var == 2: 523 if not self.slice_from(u"\u0648"): 524 return False 525 else: 526 if not self.slice_from(u"\u064A"): 527 return False 528 raise lab3() 529 except lab4: pass 530 self.cursor = v_4 531 if self.cursor >= self.limit: 532 raise lab2() 533 self.cursor += 1 534 except lab3: pass 535 continue 536 except lab2: pass 537 self.cursor = v_3 538 break 539 except lab1: pass 540 self.cursor = v_2 541 return True 542 543 def __r_Checks1(self): 544 self.bra = self.cursor 545 among_var = self.find_among(ArabicStemmer.a_3) 546 if among_var == 0: 547 return False 548 self.ket = self.cursor 549 if among_var == 1: 550 if not len(self.current) > 4: 551 return False 552 self.B_is_noun = True 553 self.B_is_verb = False 554 self.B_is_defined = True 555 else: 556 if not len(self.current) > 3: 557 return False 558 self.B_is_noun = True 559 self.B_is_verb = False 560 self.B_is_defined = True 561 return True 562 563 def __r_Prefix_Step1(self): 564 self.bra = self.cursor 565 among_var = self.find_among(ArabicStemmer.a_4) 566 if among_var == 0: 567 return False 568 self.ket = self.cursor 569 if among_var == 1: 570 if not len(self.current) > 3: 571 return False 572 if not self.slice_from(u"\u0623"): 573 return False 574 elif among_var == 2: 575 if not len(self.current) > 3: 576 return False 577 if not self.slice_from(u"\u0622"): 578 return False 579 elif among_var == 3: 580 if not len(self.current) > 3: 581 return False 582 if not self.slice_from(u"\u0627"): 583 return False 584 else: 585 if not len(self.current) > 3: 586 return False 587 if not self.slice_from(u"\u0625"): 588 return False 589 return True 590 591 def __r_Prefix_Step2(self): 592 self.bra = self.cursor 593 if self.find_among(ArabicStemmer.a_5) == 0: 594 return False 595 self.ket = self.cursor 596 if not len(self.current) > 3: 597 return False 598 v_1 = self.cursor 599 try: 600 if not self.eq_s(u"\u0627"): 601 raise lab0() 602 return False 603 except lab0: pass 604 self.cursor = v_1 605 if not self.slice_del(): 606 return False 607 608 return True 609 610 def __r_Prefix_Step3a_Noun(self): 611 self.bra = self.cursor 612 among_var = self.find_among(ArabicStemmer.a_6) 613 if among_var == 0: 614 return False 615 self.ket = self.cursor 616 if among_var == 1: 617 if not len(self.current) > 5: 618 return False 619 if not self.slice_del(): 620 return False 621 622 else: 623 if not len(self.current) > 4: 624 return False 625 if not self.slice_del(): 626 return False 627 628 return True 629 630 def __r_Prefix_Step3b_Noun(self): 631 self.bra = self.cursor 632 among_var = self.find_among(ArabicStemmer.a_7) 633 if among_var == 0: 634 return False 635 self.ket = self.cursor 636 if among_var == 1: 637 if not len(self.current) > 3: 638 return False 639 if not self.slice_del(): 640 return False 641 642 elif among_var == 2: 643 if not len(self.current) > 3: 644 return False 645 if not self.slice_from(u"\u0628"): 646 return False 647 elif among_var == 3: 648 if not len(self.current) > 3: 649 return False 650 if not self.slice_from(u"\u0643"): 651 return False 652 return True 653 654 def __r_Prefix_Step3_Verb(self): 655 self.bra = self.cursor 656 among_var = self.find_among(ArabicStemmer.a_8) 657 if among_var == 0: 658 return False 659 self.ket = self.cursor 660 if among_var == 1: 661 if not len(self.current) > 4: 662 return False 663 if not self.slice_from(u"\u064A"): 664 return False 665 elif among_var == 2: 666 if not len(self.current) > 4: 667 return False 668 if not self.slice_from(u"\u062A"): 669 return False 670 elif among_var == 3: 671 if not len(self.current) > 4: 672 return False 673 if not self.slice_from(u"\u0646"): 674 return False 675 else: 676 if not len(self.current) > 4: 677 return False 678 if not self.slice_from(u"\u0623"): 679 return False 680 return True 681 682 def __r_Prefix_Step4_Verb(self): 683 self.bra = self.cursor 684 if self.find_among(ArabicStemmer.a_9) == 0: 685 return False 686 self.ket = self.cursor 687 if not len(self.current) > 4: 688 return False 689 self.B_is_verb = True 690 self.B_is_noun = False 691 if not self.slice_from(u"\u0627\u0633\u062A"): 692 return False 693 return True 694 695 def __r_Suffix_Noun_Step1a(self): 696 self.ket = self.cursor 697 among_var = self.find_among_b(ArabicStemmer.a_10) 698 if among_var == 0: 699 return False 700 self.bra = self.cursor 701 if among_var == 1: 702 if not len(self.current) >= 4: 703 return False 704 if not self.slice_del(): 705 return False 706 707 elif among_var == 2: 708 if not len(self.current) >= 5: 709 return False 710 if not self.slice_del(): 711 return False 712 713 else: 714 if not len(self.current) >= 6: 715 return False 716 if not self.slice_del(): 717 return False 718 719 return True 720 721 def __r_Suffix_Noun_Step1b(self): 722 self.ket = self.cursor 723 if self.find_among_b(ArabicStemmer.a_11) == 0: 724 return False 725 self.bra = self.cursor 726 if not len(self.current) > 5: 727 return False 728 if not self.slice_del(): 729 return False 730 731 return True 732 733 def __r_Suffix_Noun_Step2a(self): 734 self.ket = self.cursor 735 if self.find_among_b(ArabicStemmer.a_12) == 0: 736 return False 737 self.bra = self.cursor 738 if not len(self.current) > 4: 739 return False 740 if not self.slice_del(): 741 return False 742 743 return True 744 745 def __r_Suffix_Noun_Step2b(self): 746 self.ket = self.cursor 747 if self.find_among_b(ArabicStemmer.a_13) == 0: 748 return False 749 self.bra = self.cursor 750 if not len(self.current) >= 5: 751 return False 752 if not self.slice_del(): 753 return False 754 755 return True 756 757 def __r_Suffix_Noun_Step2c1(self): 758 self.ket = self.cursor 759 if self.find_among_b(ArabicStemmer.a_14) == 0: 760 return False 761 self.bra = self.cursor 762 if not len(self.current) >= 4: 763 return False 764 if not self.slice_del(): 765 return False 766 767 return True 768 769 def __r_Suffix_Noun_Step2c2(self): 770 self.ket = self.cursor 771 if self.find_among_b(ArabicStemmer.a_15) == 0: 772 return False 773 self.bra = self.cursor 774 if not len(self.current) >= 4: 775 return False 776 if not self.slice_del(): 777 return False 778 779 return True 780 781 def __r_Suffix_Noun_Step3(self): 782 self.ket = self.cursor 783 if self.find_among_b(ArabicStemmer.a_16) == 0: 784 return False 785 self.bra = self.cursor 786 if not len(self.current) >= 3: 787 return False 788 if not self.slice_del(): 789 return False 790 791 return True 792 793 def __r_Suffix_Verb_Step1(self): 794 self.ket = self.cursor 795 among_var = self.find_among_b(ArabicStemmer.a_17) 796 if among_var == 0: 797 return False 798 self.bra = self.cursor 799 if among_var == 1: 800 if not len(self.current) >= 4: 801 return False 802 if not self.slice_del(): 803 return False 804 805 elif among_var == 2: 806 if not len(self.current) >= 5: 807 return False 808 if not self.slice_del(): 809 return False 810 811 else: 812 if not len(self.current) >= 6: 813 return False 814 if not self.slice_del(): 815 return False 816 817 return True 818 819 def __r_Suffix_Verb_Step2a(self): 820 self.ket = self.cursor 821 among_var = self.find_among_b(ArabicStemmer.a_18) 822 if among_var == 0: 823 return False 824 self.bra = self.cursor 825 if among_var == 1: 826 if not len(self.current) >= 4: 827 return False 828 if not self.slice_del(): 829 return False 830 831 elif among_var == 2: 832 if not len(self.current) >= 5: 833 return False 834 if not self.slice_del(): 835 return False 836 837 elif among_var == 3: 838 if not len(self.current) > 5: 839 return False 840 if not self.slice_del(): 841 return False 842 843 else: 844 if not len(self.current) >= 6: 845 return False 846 if not self.slice_del(): 847 return False 848 849 return True 850 851 def __r_Suffix_Verb_Step2b(self): 852 self.ket = self.cursor 853 if self.find_among_b(ArabicStemmer.a_19) == 0: 854 return False 855 self.bra = self.cursor 856 if not len(self.current) >= 5: 857 return False 858 if not self.slice_del(): 859 return False 860 861 return True 862 863 def __r_Suffix_Verb_Step2c(self): 864 self.ket = self.cursor 865 among_var = self.find_among_b(ArabicStemmer.a_20) 866 if among_var == 0: 867 return False 868 self.bra = self.cursor 869 if among_var == 1: 870 if not len(self.current) >= 4: 871 return False 872 if not self.slice_del(): 873 return False 874 875 else: 876 if not len(self.current) >= 6: 877 return False 878 if not self.slice_del(): 879 return False 880 881 return True 882 883 def __r_Suffix_All_alef_maqsura(self): 884 self.ket = self.cursor 885 if self.find_among_b(ArabicStemmer.a_21) == 0: 886 return False 887 self.bra = self.cursor 888 if not self.slice_from(u"\u064A"): 889 return False 890 return True 891 892 def _stem(self): 893 self.B_is_noun = True 894 self.B_is_verb = True 895 self.B_is_defined = False 896 v_1 = self.cursor 897 self.__r_Checks1() 898 self.cursor = v_1 899 self.__r_Normalize_pre() 900 self.limit_backward = self.cursor 901 self.cursor = self.limit 902 v_3 = self.limit - self.cursor 903 try: 904 try: 905 v_4 = self.limit - self.cursor 906 try: 907 if not self.B_is_verb: 908 raise lab2() 909 try: 910 v_5 = self.limit - self.cursor 911 try: 912 v_6 = 1 913 while True: 914 v_7 = self.limit - self.cursor 915 try: 916 if not self.__r_Suffix_Verb_Step1(): 917 raise lab5() 918 v_6 -= 1 919 continue 920 except lab5: pass 921 self.cursor = self.limit - v_7 922 break 923 if v_6 > 0: 924 raise lab4() 925 try: 926 v_8 = self.limit - self.cursor 927 try: 928 if not self.__r_Suffix_Verb_Step2a(): 929 raise lab7() 930 raise lab6() 931 except lab7: pass 932 self.cursor = self.limit - v_8 933 try: 934 if not self.__r_Suffix_Verb_Step2c(): 935 raise lab8() 936 raise lab6() 937 except lab8: pass 938 self.cursor = self.limit - v_8 939 if self.cursor <= self.limit_backward: 940 raise lab4() 941 self.cursor -= 1 942 except lab6: pass 943 raise lab3() 944 except lab4: pass 945 self.cursor = self.limit - v_5 946 try: 947 if not self.__r_Suffix_Verb_Step2b(): 948 raise lab9() 949 raise lab3() 950 except lab9: pass 951 self.cursor = self.limit - v_5 952 if not self.__r_Suffix_Verb_Step2a(): 953 raise lab2() 954 except lab3: pass 955 raise lab1() 956 except lab2: pass 957 self.cursor = self.limit - v_4 958 try: 959 if not self.B_is_noun: 960 raise lab10() 961 v_9 = self.limit - self.cursor 962 try: 963 try: 964 v_10 = self.limit - self.cursor 965 try: 966 if not self.__r_Suffix_Noun_Step2c2(): 967 raise lab13() 968 raise lab12() 969 except lab13: pass 970 self.cursor = self.limit - v_10 971 try: 972 try: 973 if not self.B_is_defined: 974 raise lab15() 975 raise lab14() 976 except lab15: pass 977 if not self.__r_Suffix_Noun_Step1a(): 978 raise lab14() 979 try: 980 v_12 = self.limit - self.cursor 981 try: 982 if not self.__r_Suffix_Noun_Step2a(): 983 raise lab17() 984 raise lab16() 985 except lab17: pass 986 self.cursor = self.limit - v_12 987 try: 988 if not self.__r_Suffix_Noun_Step2b(): 989 raise lab18() 990 raise lab16() 991 except lab18: pass 992 self.cursor = self.limit - v_12 993 try: 994 if not self.__r_Suffix_Noun_Step2c1(): 995 raise lab19() 996 raise lab16() 997 except lab19: pass 998 self.cursor = self.limit - v_12 999 if self.cursor <= self.limit_backward: 1000 raise lab14() 1001 self.cursor -= 1 1002 except lab16: pass 1003 raise lab12() 1004 except lab14: pass 1005 self.cursor = self.limit - v_10 1006 try: 1007 if not self.__r_Suffix_Noun_Step1b(): 1008 raise lab20() 1009 try: 1010 v_13 = self.limit - self.cursor 1011 try: 1012 if not self.__r_Suffix_Noun_Step2a(): 1013 raise lab22() 1014 raise lab21() 1015 except lab22: pass 1016 self.cursor = self.limit - v_13 1017 try: 1018 if not self.__r_Suffix_Noun_Step2b(): 1019 raise lab23() 1020 raise lab21() 1021 except lab23: pass 1022 self.cursor = self.limit - v_13 1023 if not self.__r_Suffix_Noun_Step2c1(): 1024 raise lab20() 1025 except lab21: pass 1026 raise lab12() 1027 except lab20: pass 1028 self.cursor = self.limit - v_10 1029 try: 1030 try: 1031 if not self.B_is_defined: 1032 raise lab25() 1033 raise lab24() 1034 except lab25: pass 1035 if not self.__r_Suffix_Noun_Step2a(): 1036 raise lab24() 1037 raise lab12() 1038 except lab24: pass 1039 self.cursor = self.limit - v_10 1040 if not self.__r_Suffix_Noun_Step2b(): 1041 self.cursor = self.limit - v_9 1042 raise lab11() 1043 except lab12: pass 1044 except lab11: pass 1045 if not self.__r_Suffix_Noun_Step3(): 1046 raise lab10() 1047 raise lab1() 1048 except lab10: pass 1049 self.cursor = self.limit - v_4 1050 if not self.__r_Suffix_All_alef_maqsura(): 1051 raise lab0() 1052 except lab1: pass 1053 except lab0: pass 1054 self.cursor = self.limit - v_3 1055 self.cursor = self.limit_backward 1056 v_15 = self.cursor 1057 try: 1058 v_16 = self.cursor 1059 try: 1060 if not self.__r_Prefix_Step1(): 1061 self.cursor = v_16 1062 raise lab27() 1063 except lab27: pass 1064 v_17 = self.cursor 1065 try: 1066 if not self.__r_Prefix_Step2(): 1067 self.cursor = v_17 1068 raise lab28() 1069 except lab28: pass 1070 try: 1071 v_18 = self.cursor 1072 try: 1073 if not self.__r_Prefix_Step3a_Noun(): 1074 raise lab30() 1075 raise lab29() 1076 except lab30: pass 1077 self.cursor = v_18 1078 try: 1079 if not self.B_is_noun: 1080 raise lab31() 1081 if not self.__r_Prefix_Step3b_Noun(): 1082 raise lab31() 1083 raise lab29() 1084 except lab31: pass 1085 self.cursor = v_18 1086 if not self.B_is_verb: 1087 raise lab26() 1088 v_19 = self.cursor 1089 try: 1090 if not self.__r_Prefix_Step3_Verb(): 1091 self.cursor = v_19 1092 raise lab32() 1093 except lab32: pass 1094 if not self.__r_Prefix_Step4_Verb(): 1095 raise lab26() 1096 except lab29: pass 1097 except lab26: pass 1098 self.cursor = v_15 1099 self.__r_Normalize_post() 1100 return True 1101 1102 1103class lab0(BaseException): pass 1104 1105 1106class lab1(BaseException): pass 1107 1108 1109class lab2(BaseException): pass 1110 1111 1112class lab3(BaseException): pass 1113 1114 1115class lab4(BaseException): pass 1116 1117 1118class lab5(BaseException): pass 1119 1120 1121class lab6(BaseException): pass 1122 1123 1124class lab7(BaseException): pass 1125 1126 1127class lab8(BaseException): pass 1128 1129 1130class lab9(BaseException): pass 1131 1132 1133class lab10(BaseException): pass 1134 1135 1136class lab11(BaseException): pass 1137 1138 1139class lab12(BaseException): pass 1140 1141 1142class lab13(BaseException): pass 1143 1144 1145class lab14(BaseException): pass 1146 1147 1148class lab15(BaseException): pass 1149 1150 1151class lab16(BaseException): pass 1152 1153 1154class lab17(BaseException): pass 1155 1156 1157class lab18(BaseException): pass 1158 1159 1160class lab19(BaseException): pass 1161 1162 1163class lab20(BaseException): pass 1164 1165 1166class lab21(BaseException): pass 1167 1168 1169class lab22(BaseException): pass 1170 1171 1172class lab23(BaseException): pass 1173 1174 1175class lab24(BaseException): pass 1176 1177 1178class lab25(BaseException): pass 1179 1180 1181class lab26(BaseException): pass 1182 1183 1184class lab27(BaseException): pass 1185 1186 1187class lab28(BaseException): pass 1188 1189 1190class lab29(BaseException): pass 1191 1192 1193class lab30(BaseException): pass 1194 1195 1196class lab31(BaseException): pass 1197 1198 1199class lab32(BaseException): pass 1200