Menu Zamknij

Porównaj styl pisarzy część 13 – Dopracowane zliczanie 3-gramów

Wróćmy do naszego programu zaopatrzeni w umiejętności z części 12. Usunięcie z naszego tekstu ciągu znaków „przypisek t d m” nie sprawi nam kłopotu, użyjemy po prostu metody .replace():

tekst = "Tutaj pojawi sie przypisek t d m i chcemy się go pozbyć. \
Nawet jeśli przypisek t d m pojawi się po raz drugi."
tekst = tekst.replace("przypisek t d m ", "")
print(tekst)

Spójrzmy na efekt:

======================== RESTART: F:/python38/wpis 13.py =======================
Tutaj pojawi się i chcemy się go pozbyć. Nawet jeśli pojawi się po raz drugi.
>>> 

A jak pozbyć się wszystkiego, co jest przypisami? Na to też poznaliśmy sposób. Zastosujemy metodę .split(). Zobaczmy przykład:

tekst = """Pan Józef sięgnął do portfela, wydobył banknot dwudziestozłotowy i podał chłopcu.

— To masz na cukierki. Za każde dobre świadectwo będziesz dostawał tyle. Idź z Bogiem, chłopcze, a pamiętaj, co ci powiedziałem.

Podał mu rękę do pocałowania, Natce skinął głową. Audiencja była skończona.

Teraz wyjął grube cygaro i zostawszy sam, zapalił, patrząc przez misterne kółka dymu na dwa posążki chińskie kiwające mu z aprobatą porcelanowymi głowami.





Przypisy:


1. cztoż prikażetie (ros.) — cóż pan powie. [przypis edytorski]

2. goworitie, pożałujsta, ja ponimaju (ros.) — niech pan mówi, proszę, ja rozumiem. [przypis edytorski]

3. nu, konieczno radujetieś, cztoż dalsze — więc oczywiście cieszy się pan, cóż dalej. [przypis edytorski]
"""
podzielony_tekst = tekst.split("Przypisy:")

print(f"interesująca cześć książki: \n{podzielony_tekst[0]}")
print(f"reszta z przypisami: {podzielony_tekst[1]}")

W 22 linijce dzielimy string na listę a w linijkach 24 i 25 drukujemy efekt podziału celem sprawdzenia skuteczności. Zobaczmy efekt:

======================== RESTART: F:\python38\wpis 13.py =======================
interesująca cześć książki: 
Pan Józef sięgnął do portfela, wydobył banknot dwudziestozłotowy i podał chłopcu.

— To masz na cukierki. Za każde dobre świadectwo będziesz dostawał tyle. Idź z Bogiem, chłopcze, a pamiętaj, co ci powiedziałem.

Podał mu rękę do pocałowania, Natce skinął głową. Audiencja była skończona.

Teraz wyjął grube cygaro i zostawszy sam, zapalił, patrząc przez misterne kółka dymu na dwa posążki chińskie kiwające mu z aprobatą porcelanowymi głowami.






reszta z przypisami: 


1. cztoż prikażetie (ros.) — cóż pan powie. [przypis edytorski]

2. goworitie, pożałujsta, ja ponimaju (ros.) — niech pan mówi, proszę, ja rozumiem. [przypis edytorski]

3. nu, konieczno radujetieś, cztoż dalsze — więc oczywiście cieszy się pan, cóż dalej. [przypis edytorski]

>>> 

Upewnijmy się, czy na pewno w naszych książkach string „Przypisy:” występuje tylko raz. Użyjemy do tego kawałka kodu naszego głównego programu:

from os import listdir

sciezka = "F:\\python\\ids\\"
pliki = listdir(sciezka)

#dla każdego pliu w katalogu
for plik in pliki:
    #otwórz książki z przypisami
    if plik == "Dziecko salonu - Janusz Korczak.txt" or \
       plik == "Kiedy znow bede maly - Janusz Korczak.txt" or \
       plik == "Bankructwo malego Dzeka - Janusz Korczak.txt":
        #otwórz plik
        ksiazka = open(sciezka + plik, mode="r", encoding = "utf-8")
        tekst = ksiazka.read()
        #podziel tekst na książkę i przypisy
        podzielony_tekst = tekst.split("Przypisy:")
        #potwierdź, że string podzielił się na tylko 2 listy
        print(len(podzielony_tekst))
        

Zobaczmy efekt:

======================== RESTART: F:\python38\wpis 13.py =======================
2
2
2
>>> 

Świetnie, zbierzmy teraz wszystko razem i przygotujmy ostateczne wersje naszych 3-gramów!

from os import listdir
import re
from collections import Counter

sciezka = "F:\\python\\ids\\"
pliki = listdir(sciezka)

#dla każdego pliu w katalogu
for plik in pliki:
    #otwórz plik
    ksiazka = open(sciezka + plik, mode="r", encoding = "utf-8")
    tekst = ksiazka.read()
    #usuń kłopotliwe przypisek T. D. M. i przypisy
    if plik == "Pamietnik pani Hanki - Tadeusz Dolega-Mostowicz.txt":
        tekst = tekst.replace("(Przypisek T. D. M.)","")
    elif plik == "Dziecko salonu - Janusz Korczak.txt" or \
         plik == "Kiedy znow bede maly - Janusz Korczak.txt" or \
         plik == "Bankructwo malego Dzeka - Janusz Korczak.txt":
        tekst = tekst.split("Przypisy:")[0]
    #przygotuj tekst do zliczania powtórzeń słów
    tekst = tekst.replace("\n", " ")
    tekst = tekst.lower()
    tekst = re.sub("[^a-z ąćęłńóśóżź]", "", tekst)
    tekst = re.sub(" +", " ", tekst)
    wyrazy = tekst.split()
    lista_trzech_wyrazow = []
    #utwórz listę trzech kolejnych wyrazów
    for indeks in range(len(wyrazy) - 2):
        trzy_wyrazy = " ".join(wyrazy[indeks:indeks + 3])
        lista_trzech_wyrazow.append(trzy_wyrazy)
    #utwórz słownik zliczający liczbę powtórzeń trzech kolejnych wyrazów
    liczba_trzygramow = Counter(lista_trzech_wyrazow)
    #zapisz słowniki do pliku
    trzygramy_txt = open(f"{sciezka}trzygramy{plik}", mode="w", encoding = "utf-8")
    trzygramy_txt.write(str(liczba_trzygramow))
    trzygramy_txt.close()

Uruchom program i sprawdź, czy jesteś zadowolony z jego działania.

Udało się nam zrobić coś bardzo fajnego, a to jeszcze nie koniec! W następnej części nauczysz się, jak zapisać zliczone 3-gramy w bardziej przyjaznym formacie. Formacie, który pozwoli na dalszą obróbkę i wizualizację wyników.

Zadanie domowe

Podążanie za instrukcjami, nawet jeśli je wszystkie wykonujesz samodzielnie, nie zrobi z ciebie programisty. Zadania domowe mogą wydawać się na początku trudne. Tu nie ma rozwiązania podanego na talerzu, użyj dowolnych źródeł, by znaleźć odpowiedź.

  1. Skopiuj do pliku tekstowego 5 pierwszych artykułów z pudelek.pl, do drugiego pliku tekstowego skopiuj 5 pierwszych artykułów z polityka.pl. Użyj swoich umiejętności, by policzyć średnią liczbę słów w zdaniu w jednym i drugim pliku. Pamiętaj, że zdania kończą się nie tylko kropką!
  2. Wyciągnij wnioski z zadania 1.

0 0 votes
Ocena artykułu

0 komentarzy
Most Voted
Newest Oldest
Inline Feedbacks
View all comments
0
Chcesz podzielić się komentarzem?x