Jakiś czas temu poruszałam temat słowników frekwencyjnych, które mogą się Tobie przydać do nauki języka obcego. Jako że obiecałam wrócić do tego tematu, poniżej znajdziesz krótki program w Pythonie. Realizuje on, jak się pewnie domyślasz, funkcję wypisywania najczęściej występujących słów w danym tekście.
Aby było ciekawiej, program wyszukuje tekst w plikach pdf, czyli w najpopularniejszym formacie stosowanym przy publikacjach naukowych. Dzięki temu szybko zorientujesz się, jakie słownictwo przyda się najbardziej przy czytaniu danego tekstu i które braki warto uzupełnić. Myślę, że program, po niewielkich modyfikacjach znalazłby wiele innych zastosowań, swoje propozycje możesz wpisać w komentarzu.
Już na początku spotkałam się z problemem braku jakiejkolwiek biblioteki do Pythona jeśli chodzi o odczyt z plików pdf. Niestety nie ma aktualnie żadnej opensource’owej biblioteki, jedyna dostępna – ReportLab, w wersji bezpłatnej może jedynie generować pdf-y, bez możliwości czytania ich zawartości.
Znalazłam inne rozwiązanie: pakiet xpdf
Zainstaluj pakiet xpdf (Ubuntu) wpisując w konsoli
sudo apt-get install xpdf
Dla pozostałych systemów jest również dostępny: http://www.foolabs.com/xpdf/download.html – pod precompiled binaries, z tym że zastrzegam, iż nie testowałam programu pod innym systemem poza Ubuntu.
Zakładam, że Pythona (ver. 2.6 +) już masz
Sercem skryptu jest słownik, którego kluczem jest znalezione słowo a wartością – jego liczba wystąpień w tekście.
Użycie xpdf-a nasŧepuje w linii 18, który tworzy plik txt, który następnie trzeba przetworzyć.
TopWords = 1000 definiuje liczbę słów, które chcesz zobaczyć w top.
Jak wywołać ten skrypt? jako parametr musisz podać ścieżkę katalogu, w którym masz swoje pliki pdf. Jako, że wyszukiwanie jest rekurencyjne, przetworzone zostaną również pliki w podkatalogach.
Przykładowe wywołanie:
python freq.py /home/justi/Pulpit/pdf
Rezultat działania znajdziesz w pliku result.txt w tym samym katalogu, z którego uruchomiono skrypt. Miłej zabawy
import subprocess
import sys
import re
import os
try:
p1 = subprocess.Popen(
['find', sys.argv[1], '-type', 'f', '-name', '*.pdf'],
stdout=subprocess.PIPE)
output_str = p1.communicate()[0]
output_str = output_str.split('\n')
output_str.pop() #pozbywamy się zbędnego ostatniego wiersza
dict = {}
for file in output_str:
try:
p = subprocess.Popen(
['pdftotext', '-q', file, "temp.txt"],
stdout = subprocess.PIPE).wait() #czekamy na koniec procesu
f = open("temp.txt", 'r')
words = re.split('\W+', f.read().lower())
for w in words:
if (len(w) > 3):
if dict.has_key(w):
dict[w] += 1
else:
dict[w] = 1
f.close()
except IOError as (errno, strerror):
print "I/O error({0}): {1}".format(errno, strerror)
os.remove(os.path.join(os.getcwd(), "temp.txt"))
f = open("result.txt", 'w')
TopWords = 1000
for index, w in enumerate(sorted(dict, key=dict.get, reverse=True)):
if index < TopWords:
f.write(w + " " + str(dict[w]) + "\n")
f.close()
except IOError as (errno, strerror):
print "I/O error({0}): {1}".format(errno, strerror)
Ściągnij plik:
freq.py (1,4 KiB, 1 065 hits)


Najnowsze komentarze