Advertisement
zakharovafm

Стеммер Портера для русского языка

Sep 22nd, 2020
1,619
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.82 KB | None | 0 0
  1. g = ['а', 'е', 'и', 'о', 'у', 'ы', 'э', 'ю', 'я']
  2. x = input("Введите слово: ")
  3. x = list(x)
  4. rv = []
  5. r1 = []
  6. r2 = []
  7.  
  8. # массив индексов гласных букв
  9. vowel = []
  10. refl = []
  11.  
  12.  
  13. # проверка гласная ли буква
  14. def gl(i):
  15.     t = "false"
  16.     for j in g:
  17.         if (i == j):
  18.             t = "true"
  19.     return t
  20.  
  21.  
  22. index = 0
  23. for i in x:
  24.     if (gl(i) == "true"):
  25.         vowel.append(index)
  26.     index = index + 1
  27.  
  28. rv = x[vowel[0] + 1:]
  29.  
  30. index = 0
  31. for j in vowel:
  32.     if ((j != len(x) - 1) and (gl(x[j + 1]) == "false") and (index < 2)):
  33.         refl.append(j)
  34.         index = index + 1
  35. print(refl)
  36.  
  37. if (len(refl) == 2):
  38.     r1 = x[refl[0] + 2:]
  39.     r2 = x[refl[1] + 2:]
  40. elif (len(refl) == 1):
  41.     r1 = x[refl[0] + 2:]
  42.  
  43. print(x)
  44. print(rv)
  45. print(r1)
  46. print(r2)
  47.  
  48. # массивы окончаний
  49. # Окончаниям из групп 1 должна предшествовать буква а или я
  50. perf_gerund1 = ["вшись", "вши", "вш"]
  51. perf_gerund2 = ["ившись", "ивши", "ив", "ывшись", "ывши", "ыв"]
  52. pg = [perf_gerund1, perf_gerund2]
  53. adj = ["ее", "ие", "ые", "ое", "ими", "ыми", "ей", "ий", "ый", "ой", "ем", "им", "ым", "ом", "его", "ого", "ему", "ому",
  54.      "их", "ых", "ую", "юю", "ая", "яя", "ою", "ею"]
  55. partic1 = ["ем", "нн", "вш", "ющ", "щ"]
  56. partic2 = ["ивш", "ывш", "ующ"]
  57. partic = [partic1, partic2]
  58. refl = ["ся", "сь"]
  59. v1 = ["ла", "на", "ете", "йте", "ли", "й", "ло", "ем", "нно", "ет", "ют", "ны", "ть", "ешь", "но", "л", "н"]
  60. v2 = ["ила", "ыла", "ена", "ейте", "уйте", "ите", "или", "ыли", "ей", "уй", "ило", "ыло", "им", "ым", "ено", "ил", "ыл",
  61.       "ены", "ят", "ует", "уют", "ить", "ыть", "ен", "ит", "ыт", "ишь", "ую", "ю"]
  62. v = [v1, v2]
  63. noun = ["ев", "ов", "ией", "ье", "иями", "ями", "ами", "еи", "ии", "ием", "ей", "ой", "ий", "й", "иям", "ям", "ие", "ем",
  64.      "ам", "ом", "о", "у", "ах", "иях", "ях", "ы", "ью", "ию", "ья", "ю", "ия", "ь", "я", "а", "и", "е"]
  65. superl = ["ейше", "ейш"]
  66. deriv = ["ость", "ост"]
  67.  
  68.  
  69. # adjectival = adjective or participle + adjective
  70.  
  71. def ending(end, word):  # есть ли это окончание в конце слова
  72.     b = True
  73.     word = list(word)
  74.     end = list(end)
  75.     l = len(end) - 1
  76.     s1 = len(word) - 1
  77.     j = 0
  78.     if (l > s1):
  79.         b = False
  80.     while (j <= l and b == True):
  81.         if (word[s1 - j] != end[l - j]):
  82.             b = False
  83.         j = j + 1
  84.     return b
  85.  
  86.  
  87. def ending_k(word, k, end):  # есть ли в слове word морфемы k массива
  88.     if (k != v and k != partic and k != pg):
  89.         for i in k:
  90.             if (ending(i, word)):
  91.                 end.append(i)
  92.     else:
  93.         for i in k[1]:
  94.             if (ending(i, word)):
  95.                 end.append(i)
  96.         for i in k[0]:
  97.             if (ending('a' + i, word)):
  98.                 end.append(i)
  99.     return (end)
  100.  
  101.  
  102. x1 = ''.join(rv)  # rv часть
  103. x0 = ''.join(''.join(x).replace(x1, ''))  # до rv
  104.  
  105. print(x1)
  106. # шаг 1
  107. en = []
  108. en = ending_k(x1, pg, en)
  109. if (len(en) != 0):
  110.     x1 = x1.replace(max(en), '')
  111. else:
  112.     en = ending_k(x1, refl, en)
  113.     if (len(en) != 0):
  114.         x1 = x1.replace(max(en), '')
  115.  
  116. en = []
  117.  
  118. b = 0
  119. for i in partic1:
  120.     for j in adj:
  121.         if (i + j in x1):
  122.             en.append(i + j)
  123.             b = 1
  124. if (len(en) != 0):
  125.     x1 = x1.replace(max(en), '')
  126. en = []
  127.  
  128. if (b == 0):
  129.     for i in partic2:
  130.         for j in adj:
  131.             if (i + j in x1):
  132.                 en.append(i + j)
  133.                 b = 1
  134. if (len(en) != 0):
  135.     x1 = x1.replace(max(en), '')
  136. en = []
  137.  
  138. if (b == 0):
  139.     en = ending_k(x1, adj, en)
  140.     if (len(en) != 0):
  141.         x1 = x1.replace(max(en), '')
  142. en = []
  143.  
  144. adj = 0
  145. c = [noun, v]
  146. while (b != 1 and adj < len(c)):
  147.  
  148.     en = ending_k(x1, c[adj], en)
  149.     print(len(x1), adj)
  150.     if (len(en) != 0):
  151.         x1 = x1.replace(max(en), '')
  152.         b = 1
  153.     adj = adj + 1
  154. en = []
  155.  
  156. print(x1, " -  1 step")
  157.  
  158. x1 = list(x1)
  159. # шаг 2
  160. if (x1[len(x1) - 1] == 'и'):
  161.     del x1[len(x1) - 1]
  162. print(x1, " - 2 step")
  163.  
  164. # шаг 3
  165.  
  166. r2 = ''.join(r2)
  167. x1 = ''.join(x1)
  168. en = ending_k(r2, deriv, en)
  169. if (len(en) != 0):
  170.     x1 = x1.replace(max(en), '')
  171.     en = []
  172. print(x1, " - 3 step")
  173.  
  174. # шаг 4
  175. en = ending_k(r2, superl, en)
  176. if (len(en) != 0):
  177.     x1 = x1.replace(max(en), '')
  178.  
  179. x1 = list(x1)
  180. if (x1[len(x1) - 1] == 'н' and x1[len(x1) - 2] == 'н'):
  181.     del x1[len(x1) - 1]
  182. elif (x1[len(x1) - 1] == 'ь'):
  183.     del x1[len(x1) - 1]
  184. x1 = ''.join(x1)
  185. print(" - 4 step")
  186. print(x0 + x1)
  187.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement