Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- with open('input.txt') as income_data:
- text_to_check = income_data.readlines();
- with open('words.txt') as vocabulary_words:
- vocabulary = vocabulary_words.read().split();
- def soundex(name, len=4):
- """ Взагалі по цій функції у мене зауважень фактично немає.
- Написано досить оригінально, але код абсолютно робочий. Це не
- найкращий зразок читабельного коду можливо, але з допомогою
- зрозумілих коментів все фікситься. Загалом в цьому коді
- досить легко розібратися.
- """
- # digits holds the soundex values for the alphabet
- """ Цікавий підхід, написати коди в символьний рядок у тому ж порядку,
- що літери в алфавіті. Втім, подібний код в реальних проектах необхідно
- добре і в деталях коментувати, бо це не надто читабельно. Хоча можна
- й так писати.
- """
- digits = '01230120022455012623010202'
- sndx = ''
- fc = ''
- # translate alpha chars in name to soundex digits
- for c in name.upper():
- if c.isalpha():
- if not fc: fc = c # remember first letter
- d = digits[ord(c)-ord('A')]
- # duplicate consecutive soundex digits are skipped
- if not sndx or (d != sndx[-1]):
- sndx += d
- # replace first digit with first alpha character
- sndx = fc + sndx[1:]
- # remove all 0s from the soundex code
- sndx = sndx.replace('0','')
- # return soundex code padded to len characters
- return (sndx + (len * '0'))[:len]
- def clear_string(string):
- # Function to clean string
- """ Цікавий підхід для видалення символів пунктуації з рядка. Для
- таких ситуацій як тут, коли необхідно викинути лише одиночні
- символи, а не підрядки - абсолютно адекватна заміна для replace."""
- string = ''.join(c for c in string if c not in '/.,()\'\"')
- """ return - це оператор, а не функція, тому дужки тут не потрібні."""
- return(string)
- # Convert text to list of scentences and clean it
- for i, t in enumerate(text_to_check):
- """ тут t.replace('\n', '') коректно спрацює для macOS та Linux, але не
- коректно спрацює з файлами згенерованими в Windows. Краще використовувати
- .strip(), крім того це буде швидше."""
- text_to_check[i] = clear_string(t.replace('\n', ''))
- def print_hints( text_to_check, vocabulary):
- ''' creating a function that will show allt the hints'''
- for index, i in enumerate(text_to_check):
- line = i.split() # separate paragraph to words
- # for every word from paragraph
- for word in line:
- word = word.lower() # make it lowercase
- # iterate for every word in dictionary with right words
- """ Код який йде далі має певні проблеми з оптимальністю. Перш за все,
- достатньо зробити просту перевірку
- if word not in vocabulary:
- для того щоб визначити чи є в слові помилка. Не потрібно для кожного
- слова з тексту проводити його порівняння з кожним словом зі словника.
- Це - зайва робота.
- Не ефективно визначати коди для кожного елемента vocabulary заново при
- проході через кожне окреме слово з текста. Всі коди можна порахувати
- наперед один раз і потім просто вибирати з набору слова з відповідним
- кодом.
- """
- for item in vocabulary:
- #check conditions if checked words were written right
- if soundex(word) == soundex(item) and word.lower() != item and word.lower() not in vocabulary:
- print('Found unknown word "', word, '" in line ', index+1, ' Suggestion:', item) # print right answer
- print_hints(text_to_check, vocabulary)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement