How to... TXT-files in Python

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
SuumEnSe
User
Beiträge: 3
Registriert: Mittwoch 25. September 2019, 11:30

Hallo liebe Community,

ich - ein regelrechter Python-Vollnoob (Udemy hat mir versprochen, dass ich in 2 Wochen zum absoluten Python-Pro aufsteige... und sie haben eiskalt gelogen), habe ein sehr wichtiges und dringendes Anliegen. Ich möchte eine sehr große Zahl an TXT-Files in Pythnn einlesen, um sie anschließend via Topic Modeling auszuwerten. Das TM-Tutorial befolge ich nach Alice Zhao (GitHub-Link: https://github.com/adashofdata/nlp-in-python-tutorial). Alice zieht sich in diesem Beispiel Skripte von einer Seite und wertet diese aus. Ich aber habe meine ganzen txt-Files auf dem Rechner. Andere Tutorials im Netz verwenden MISC- oder auch CSV-Files. Keine dieser "Data Gathering"-Varianten lässt sich auf mein Beispiel adaptieren. Ich habe Interesse und Spaß an dieser Programmiersprache aber ich komme ums Verrecken nicht auf den richtigen Ansatz, was ich zu machen habe, um diese files fürs Topic Modeling "einzulesen". Weiß von euch jemand weiter und kann mir auf die Sprünge helfen, bitte? :cry:
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ohne zu wissen, wie deine Daten aussehen, kann man dir auch nicht erzaehlen, wie man die Daten so aufbereitet, dass sie deinem Ansatz genuegen. Und am besten waere, wenn du auch noch spezifizierst wie die Daten dann aussehen muessen, damit sie dem Lernverfahren vorgeworfen werden koennen. ZB indem du das Tutorial selbst ausfuehrst und die entsprechende Stelle so modifizierst, dass die du die Daten sichtbar machst. Denn sonst muss man sich da selbst durcharbeiten, und ich zumindest habe die Zeit nicht.
SuumEnSe
User
Beiträge: 3
Registriert: Mittwoch 25. September 2019, 11:30

__deets__ hat geschrieben: Mittwoch 25. September 2019, 13:29 Ohne zu wissen, wie deine Daten aussehen, kann man dir auch nicht erzaehlen, wie man die Daten so aufbereitet, dass sie deinem Ansatz genuegen. Und am besten waere, wenn du auch noch spezifizierst wie die Daten dann aussehen muessen, damit sie dem Lernverfahren vorgeworfen werden koennen. ZB indem du das Tutorial selbst ausfuehrst und die entsprechende Stelle so modifizierst, dass die du die Daten sichtbar machst. Denn sonst muss man sich da selbst durcharbeiten, und ich zumindest habe die Zeit nicht.
Lieber __deets__,

berechtigter Einwand. Ich versuche das mal mit meinem Udemy-Noobwissen rüber zu bringen:

Das Tutorial von Alice Zhao ist wie folgt aufgebaut:

1. Web scraping - ziehen von Skripten aus dem Netz via Requests und BeautifulSoup
2. Daten zusammenfügen/zwischenspeichern via pickles

Code: Alles auswählen

import requests
from bs4 import BeautifulSoup
import pickle

def url_to_transcript(url):
    '''Returns transcript data specifically from scrapsfromtheloft.com.'''
    page = requests.get(url).text
    soup = BeautifulSoup(page, "lxml")
    text = [p.text for p in soup.find(class_="post-content").find_all('p')]
    print(url)
    return text

urls = ['http://scrapsfromtheloft.com/2017/05/06/louis-ck-oh-my-god-full-transcript/',
        'http://scrapsfromtheloft.com/2017/04/11/dave-chappelle-age-spin-2017-full-transcript/',
        'http://scrapsfromtheloft.com/2018/03/15/ricky-gervais-humanity-transcript/',
        'http://scrapsfromtheloft.com/2017/08/07/bo-burnham-2013-full-transcript/',
        'http://scrapsfromtheloft.com/2017/05/24/bill-burr-im-sorry-feel-way-2014-full-transcript/',
        'http://scrapsfromtheloft.com/2017/04/21/jim-jefferies-bare-2014-full-transcript/',
        'http://scrapsfromtheloft.com/2017/08/02/john-mulaney-comeback-kid-2015-full-transcript/',
        'http://scrapsfromtheloft.com/2017/10/21/hasan-minhaj-homecoming-king-2017-full-transcript/',
        'http://scrapsfromtheloft.com/2017/09/19/ali-wong-baby-cobra-2016-full-transcript/',
        'http://scrapsfromtheloft.com/2017/08/03/anthony-jeselnik-thoughts-prayers-2015-full-transcript/',
        'http://scrapsfromtheloft.com/2018/03/03/mike-birbiglia-my-girlfriends-boyfriend-2013-full-transcript/',
        'http://scrapsfromtheloft.com/2017/08/19/joe-rogan-triggered-2016-full-transcript/']

comedians = ['louis', 'dave', 'ricky', 'bo', 'bill', 'jim', 'john', 'hasan', 'ali', 'anthony', 'mike', 'joe']

transcripts = [url_to_transcript(u) for u in urls]
So wie sie das händelt, fügt sie die Skripte zu einer großen Datei zusammen, sodass sie diese dann bereinigen und darauf das Topic Modeling anwenden kann.
Das ist der erste Schritt ihres Tutorials und da hänge ich bereits. Meine Dateien (> 4.000 txt-files) müssen nicht aus dem Netz gezogen werden, sondern sind lokal gespeichert. Ich habe keinerlei Ansatz im Netz gefunden, wie ich diese 4000 Files "einlesen" und ebenfalls via pickles zusammenfügen/zwischenspeichern kann.
Wenn ich das Tutorial 1:1 nachbaue funktioniert alles (logischerweise), auch die Datenbereinigung (Großbuchstaben, Interpunktion und Sonderzeichenbereinigung - alles was fürs Topic Modeling notwendig ist) funktioniert.

Meine Dateien sind abgelegt unter
C:\Users\xxxxxx\Desktop\transcripts
Die Dateien sind durchnummeriert, beginnend mit
01.txt
02.txt
03.txt

und beinhalten folgenden Beispieltext:
This will create a barrier to entry for start ups and inventors looking to create new services.
The proposal as written raises First Amendment concerns.
It’s premature to craft regulations for an industry that’s so new and still in flux. Bitcoin and similar virtual currencies are
still in their infancy, and we don’t yet know what new tools and services might be created. This regulatory proposal
could cut that innovation off at the knees, before we have a chance to see the potential societal benefits.
nezzcarth
User
Beiträge: 1643
Registriert: Samstag 16. April 2011, 12:47

Das klingt ein bisschen so, als würden dir noch Grundlagen fehlen. Hast du schon mal das offizielle Python Tutorial durchgearbeitet? Denn eigentlich musst du für deine Fragestellung "nur" wissen, wie man Dateien öffnet und wie man Ordner traversiert (z.B. mit glob oder der glob-Methode von pathlib.Path-Objekten). Außerdem splittet sie die Eingaben nach Absätzen. Falls das notwendig ist und du das auch machen möchtest, musst du schauen, ob diese konsistent in deinen Dateien vorhanden sind und dann entsprechend z.B. bei doppelten Leerzeilen splitten.

Das sieht dann z.B. so aus:

Code: Alles auswählen

#!/usr/bin/env python3
import pathlib

PARAGRAPH_MARKER = '\n\n'


def file_to_transcript(file, delimiter=PARAGRAPH_MARKER):
    # Path-Objekte haben auch eine open-Methode, die man verwenden kann,
    # wenn nur Pathobjekte übergeben werden.
    with open(file, 'r') as fh:
        content = fh.read()
    return [
        item.rstrip() for item in content.split(delimiter)
    ]


def main():
    base_dir = pathlib.Path('/tmp/textfiles')
    transcripts = [
        file_to_transcript(file) for file in base_dir.glob('*.txt')
    ]
    print(transcripts)


if __name__ == '__main__':
    main()
SuumEnSe
User
Beiträge: 3
Registriert: Mittwoch 25. September 2019, 11:30

Tausend Dank für den Ansatz!
Ja, mir fehlen tatsächlich Grundlagen. Und das nicht zu knapp :?
Dennoch habe ich wirklich Lust, Python zu erlernen. Danke für den Verweis aufs Tutorial - ich werde das anpacken und dann berichten, ob ich mit deinem Ansatz klar komme. Nun wird aber erst einmal gearbeitet.... :roll: :lol:
Sirius3
User
Beiträge: 17793
Registriert: Sonntag 21. Oktober 2012, 17:20

@nezzcarth: Text-Dateien sollten immer mit dem korrekten Encoding geöffnet werden, also z.B.:

Code: Alles auswählen

def file_to_transcript(filename, delimiter=PARAGRAPH_MARKER, encoding="UTF8"):
    # Path-Objekte haben auch eine open-Methode, die man verwenden kann,
    # wenn nur Pathobjekte übergeben werden.
    with open(filename, encoding=encoding) as fh:
        return fh.read().split(delimiter)
nezzcarth
User
Beiträge: 1643
Registriert: Samstag 16. April 2011, 12:47

@Sirius3: Ja, das stimmt. Ich wollte halt (für den Einstieg) nicht noch zusätzlich dieses komplizierte Feld aufmachen. Wenn die Dateien auf demselben System erstellt wurden, auf dem das Skript läuft, ist die Chance relativ hoch, dass das funktioniert, denke ich. UTF-8 ist, nach meinem Kenntnisstand, zumindest unter Windows nicht zwangsläufig das Standardencoding. Und wenn der Fragesteller das Skript mit dem voreingestellten UTF-8 Encoding laufen lässt und es funktioniert nicht, muss er sich sofort mit diesem Thema befassen und dafür sorgen, dass die ~4000 txt-Dateien alle einheitlich in demselben, bekannten Encoding vorliegen. Das lenkt vielleicht erst einmal von der eigentlichen Frage ab. Aber ich kann natürlich verstehen, dass man sich vielleicht gleich an 'Best Practices' gewöhnen und mit dem Thema Encoding relativ schnell befassen sollte.
Benutzeravatar
__blackjack__
User
Beiträge: 13199
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@nezzcarth: Wenn UTF-8 nicht funktioniert, dann muss SuumEnSe halt die richtige Kodierung verwenden. Falls die ~4000 Texte nicht in einer einheitlichen Kodierung vorliegen, wird es sowieso lustig. :-)

Jemand der sich mit Sprache beschäftigt, muss sich IMHO auch mit Kodierungen beschäftigen.
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
Antworten