pjn-2024-cw/examples.ipynb
2024-10-23 15:13:08 +02:00

6.5 KiB

nie robimy 2 nowych linii w bloku funkcji. sentences[::2] oraz sentences[1::2] powinny być przypisane do osobnych zmiennych

import re
tekst =  "Pies ten pochodzi z południowych Chin, z terenów prowincji Guangdong! Został rozpropagowany i hodowany w celach wystawowych przez hodowców w USA. Nazwa psa, pochodząca z chińskiego, oznacza dosłownie piaszczysta skóra. Chart polski  polska rasa psa myśliwskiego, znana prawdopodobnie od czasów Galla Anonima, zaliczana do grupy chartów."
def split_sentences(text):
    sentences = re.split(r'([.!?]\s+)(?=[A-Z])', text)


    full_sentences = [''.join(pair) for pair in zip(sentences[::2], sentences[1::2])]


    for sentence in full_sentences:
        print(sentence)
    print(full_sentences)
split_sentences(tekst)
Pies ten pochodzi z południowych Chin, z terenów prowincji Guangdong! 
Został rozpropagowany i hodowany w celach wystawowych przez hodowców w USA. 
Nazwa psa, pochodząca z chińskiego, oznacza dosłownie piaszczysta skóra. 
['Pies ten pochodzi z południowych Chin, z terenów prowincji Guangdong! ', 'Został rozpropagowany i hodowany w celach wystawowych przez hodowców w USA. ', 'Nazwa psa, pochodząca z chińskiego, oznacza dosłownie piaszczysta skóra. ']

Niewłaściwa nazwa funkcji switch_letter (robi coś innego, niż nazwa na to wskazuje). Linijka z sum jest nieczytelna.

text = "kurde faja."

vulgar_words_base = ["kurd", "choler"]

def switch_letter(word, vulgar_word_list):
    word = word.lower()
    for bad_word in vulgar_word_list:
        switched_letters = sum(1 for a, b in zip(word, bad_word) if a != b)
        if switched_letters == 1:
            return True
    return False

def censor_text(text):
    pattern = re.compile(r'[^\s]*(' + '|'.join([f'{word}' for word in vulgar_words_base]) + r')[^\s]*', re.IGNORECASE)
    censored_text = pattern.sub("---", text)

    censored_text_list = censored_text.split()
    
    for i, word in enumerate(censored_text_list):
        if switch_letter(word, vulgar_words_base):
            censored_text_list[i] = "---"
    final_censored_text = " ".join(censored_text_list)

    return final_censored_text

print(censor_text(text))
--- faja.
switch_letter("kurcze", ["kurzce"])
False

Jeżeli nie ma takiej konieczności nie iterujemy po rozdzielonym na słowa tekście, tylko na całym tekście.

# Solution 2
text = 'Siała baba mak. Czy wiedziała jak? Dziadek wiedział, nie powiedział, a to było tak!'
sentences = []

def split_sentences(text):
    sentence = ''
    for word in text.split():
        x = re.search(r'[a-zA-Z0-9]+[.?!]', word)
        if x is None:
            sentence += f'{word} '
        else:
            sentence += word
            sentences.append(sentence)
            sentence = ''
    for result in sentences:
        print(result)


split_sentences(text)
Siała baba mak.
Czy wiedziała jak?
Dziadek wiedział, nie powiedział, a to było tak!

Nie stosujemy zapisu if {zmienna}, tylko if {zmienna} is True/False. Kod dla danego warunku przenosimy do nowej linii

import re

def validate_name(name):
    valid = re.match(r'^[A-Z][a-z]{1,}',name)
    if valid: return True
    else:  return False

Przykład właściwego zastosowania komentarza

def censor_text(text):
    prefixes = r'(do|na|o|od|pod|po|prze|przy|roz|s|u|w|y|za|z|u)*'

    # profanities according to prof. Jerzy Bralczyk
    profanities = [ 
        rf'\b{prefixes}(kurw[aąeęyi]\w*)|(ku(z|ź)w\w*)|(kurew\w*)\b',
        rf'\b{prefixes}(pierd\w*)\b',
        rf'\b{prefixes}(chuj\w*)\b',
        rf'\b{prefixes}(pizd\w*)\b',
        rf'\b{prefixes}(jeb\w*)\b',
    ]

    profanity_pattern = re.compile('|'.join(profanities), re.IGNORECASE)

    return profanity_pattern.sub('---', text)