Advertisement
oleh_korkh

Untitled

Jan 9th, 2018
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.73 KB | None | 0 0
  1. with open('input.txt') as income_data:
  2.     text_to_check = income_data.readlines();
  3. with  open('words.txt') as vocabulary_words:
  4.     vocabulary  = vocabulary_words.read().split();
  5.  
  6. def soundex(name, len=4):
  7.     """ Взагалі по цій функції у мене зауважень фактично немає.
  8.    Написано досить оригінально, але код абсолютно робочий. Це не
  9.    найкращий зразок читабельного коду можливо, але з допомогою
  10.    зрозумілих коментів все фікситься. Загалом в цьому коді
  11.    досить легко розібратися.
  12.    """
  13.  
  14.     # digits holds the soundex values for the alphabet
  15.     """ Цікавий підхід, написати коди в символьний рядок у тому ж порядку,
  16.    що літери в алфавіті. Втім, подібний код в реальних проектах необхідно
  17.    добре і в деталях коментувати, бо це не надто читабельно. Хоча можна
  18.    й так писати.
  19.    """
  20.     digits = '01230120022455012623010202'
  21.     sndx = ''
  22.     fc = ''
  23.  
  24.     # translate alpha chars in name to soundex digits
  25.     for c in name.upper():
  26.         if c.isalpha():
  27.             if not fc: fc = c   # remember first letter
  28.             d = digits[ord(c)-ord('A')]
  29.             # duplicate consecutive soundex digits are skipped
  30.             if not sndx or (d != sndx[-1]):
  31.                 sndx += d
  32.  
  33.     # replace first digit with first alpha character
  34.     sndx = fc + sndx[1:]
  35.  
  36.     # remove all 0s from the soundex code
  37.     sndx = sndx.replace('0','')
  38.  
  39.     # return soundex code padded to len characters
  40.     return (sndx + (len * '0'))[:len]
  41.  
  42.  
  43. def clear_string(string):
  44.     # Function to clean string
  45.     """ Цікавий підхід для видалення символів пунктуації з рядка. Для
  46.    таких ситуацій як тут, коли необхідно викинути лише одиночні
  47.    символи, а не підрядки - абсолютно адекватна заміна для replace."""
  48.     string = ''.join(c for c in string if c not in '/.,()\'\"')
  49.  
  50.     """ return - це оператор, а не функція, тому дужки тут не потрібні."""
  51.     return(string)
  52.  
  53. # Convert text to list of scentences and clean it
  54. for i, t in enumerate(text_to_check):
  55.     """ тут t.replace('\n', '') коректно спрацює для macOS та Linux, але не
  56.    коректно спрацює з файлами згенерованими в Windows. Краще використовувати
  57.    .strip(), крім того це буде швидше."""
  58.     text_to_check[i] = clear_string(t.replace('\n', ''))
  59.  
  60. def print_hints( text_to_check, vocabulary):
  61.     ''' creating a function that will show allt the hints'''
  62.    
  63.     for index, i  in enumerate(text_to_check):
  64.  
  65.         line = i.split() # separate paragraph to words
  66.  
  67.         # for every word from paragraph
  68.         for word in line:
  69.  
  70.             word = word.lower() # make it lowercase
  71.  
  72.             # iterate for every word in dictionary with right words
  73.             """ Код який йде далі має певні проблеми з оптимальністю. Перш за все,
  74.            достатньо зробити просту перевірку
  75.  
  76.                if word not in vocabulary:
  77.  
  78.            для того щоб визначити чи є в слові помилка. Не потрібно для кожного
  79.            слова з тексту проводити його порівняння з кожним словом зі словника.
  80.            Це - зайва робота.
  81.  
  82.            Не ефективно визначати коди для кожного елемента vocabulary заново при
  83.            проході через кожне окреме слово з текста. Всі коди можна порахувати
  84.            наперед один раз і потім просто вибирати з набору слова з відповідним
  85.            кодом.
  86.            """
  87.             for item in vocabulary:
  88.                 #check conditions if checked words were written right
  89.                 if soundex(word) == soundex(item) and word.lower() != item and word.lower() not in vocabulary:
  90.                      
  91.                     print('Found unknown word "', word, '" in line ', index+1, ' Suggestion:', item) # print right answer
  92.  
  93.  
  94. print_hints(text_to_check, vocabulary)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement