Frage

Ich habe verschiedene Methoden versucht, die Lizenz von Project Gutenberg Texte strippen, für die Verwendung als Korpus für eine Sprachlern-Projekt, aber ich kann nicht mit einer unüberwachten, zuverlässig Ansatz zu kommen scheinen. Die beste Heuristik ich mit so habe kommen weit abgetrieben die ersten zwanzig acht Zeilen und die letzte 398, die für eine große Anzahl von Texten gearbeitet. Irgendwelche Vorschläge, Möglichkeiten, wie ich den Text automatisch abstreifen kann (was für viele der Texte sehr ähnlich ist, aber mit geringen Unterschieden in jedem Fall und ein paar verschiedenen Vorlagen, auch), sowie Vorschläge, wie zu überprüfen, ob die Text wurde genau ausgezogen, wäre sehr nützlich.

War es hilfreich?

Lösung

Sie haben kein Scherz. Es ist fast, als ob sie versuchten, den Job KI-komplett zu machen. Ich kann nur zwei Ansätze denken, keiner von ihnen perfekt.

1) ein Skript in, sagen wir, Perl einrichten, die am häufigsten verwendeten Muster zu bewältigen (zB suchen Sie nach dem Begriff „durch produziert“, halten auf die nächste leere Zeile gehen und schneiden dort), sondern setzen in vielen Behauptungen über das, was (zB der nächste Text sollte der Titel oder Autor sein) erwartet wird. Auf diese Weise, wenn das Muster nicht, wissen Sie es. Das erste Mal, wenn ein Muster nicht, tun Sie es mit der Hand. Das zweite Mal, ändern Sie das Skript.

2) Versuchen Sie Amazon Mechanical Turk .

Andere Tipps

Ich wollte auch ein Tool Project Gutenberg Kopf- und Fußzeilen für Jahre strippen für das Spiel mit der Verarbeitung natürlicher Sprache ohne Kontaminierung die Analyse mit vorformulierten mit dem etxt mischten. Nachdem diese Frage zu lesen zog ich meine Finger endlich aus und schrieb ein Perl-Filter, wo Du Rohr durch in ein beliebiges anderes Werkzeug.

Es ist, als eine Zustandsmaschine pro-line reguläre Ausdrücke verwenden gemacht. Es steht geschrieben, um einfach zu verstehen, da die Geschwindigkeit nicht ein Problem mit der typischen Größe von ETexts ist. Bisher funktioniert es auf die paar Dutzend ETexts habe ich hier aber in der freien Natur gibt es sicher viele weitere Variationen sein, die hinzugefügt werden müssen. Hoffentlich wird der Code ist klar genug, dass jemand ihn hinzufügen:


#!/usr/bin/perl

# stripgutenberg.pl < in.txt > out.txt
#
# designed for piping
# Written by Andrew Dunbar (hippietrail), released into the public domain, Dec 2010

use strict;

my $debug = 0;

my $state = 'beginning';
my $print = 0;
my $printed = 0;

while (1) {
    $_ = <>;

    last unless $_;

    # strip UTF-8 BOM
    if ($. == 1 && index($_, "\xef\xbb\xbf") == 0) {
        $_ = substr($_, 3);
    }

    if ($state eq 'beginning') {
        if (/^(The Project Gutenberg [Ee]Book( of|,)|Project Gutenberg's )/) {
            $state = 'normal pg header';
            $debug && print "state: beginning -> normal pg header\n";
            $print = 0;
        } elsif (/^$/) {
            $state = 'beginning blanks';
            $debug && print "state: beginning -> beginning blanks\n";
        } else {
            die "unrecognized beginning: $_";
        }
    } elsif ($state eq 'normal pg header') {
        if (/^\*\*\*\ ?START OF TH(IS|E) PROJECT GUTENBERG EBOOK,? /) {
            $state = 'end of normal header';
            $debug && print "state: normal pg header -> end of normal pg header\n";
        } else {
            # body of normal pg header
        }
    } elsif ($state eq 'end of normal header') {
        if (/^(Produced by|Transcribed from)/) {
            $state = 'post header';
            $debug && print "state: end of normal pg header -> post header\n";
        } elsif (/^$/) {
            # blank lines
        } else {
            $state = 'etext body';
            $debug && print "state: end of normal header -> etext body\n";
            $print = 1;
        }
    } elsif ($state eq 'post header') {
        if (/^$/) {
            $state = 'blanks after post header';
            $debug && print "state: post header -> blanks after post header\n";
        } else {
            # multiline Produced / Transcribed
        }
    } elsif ($state eq 'blanks after post header') {
        if (/^$/) {
            # more blank lines
        } else {
            $state = 'etext body';
            $debug && print "state: blanks after post header -> etext body\n";
            $print = 1;
        }
    } elsif ($state eq 'beginning blanks') {
        if (/<!-- #INCLUDE virtual=\"\/include\/ga-books-texth\.html\" -->/) {
            $state = 'header include';
            $debug && print "state: beginning blanks -> header include\n";
        } elsif (/^Title: /) {
            $state = 'aus header';
            $debug && print "state: beginning blanks -> aus header\n";
        } elsif (/^$/) {
            # more blanks
        } else {
            die "unexpected stuff after beginning blanks: $_";
        }
    } elsif ($state eq 'header include') {
        if (/^$/) {
            # blanks after header include
        } else {
            $state = 'aus header';
            $debug && print "state: header include -> aus header\n";
        }
    } elsif ($state eq 'aus header') {
        if (/^To contact Project Gutenberg of Australia go to http:\/\/gutenberg\.net\.au$/) {
            $state = 'end of aus header';
            $debug && print "state: aus header -> end of aus header\n";
        } elsif (/^A Project Gutenberg of Australia eBook$/) {
            $state = 'end of aus header';
            $debug && print "state: aus header -> end of aus header\n";
        }
    } elsif ($state eq 'end of aus header') {
        if (/^((Title|Author): .*)?$/) {
            # title, author, or blank line
        } else {
            $state = 'etext body';
            $debug && print "state: end of aus header -> etext body\n";
            $print = 1;
        }
    } elsif ($state eq 'etext body') {
        # here's the stuff
        if (/^<!-- #INCLUDE virtual="\/include\/ga-books-textf\.html" -->$/) {
            $state = 'footer';
            $debug && print "state: etext body -> footer\n";
            $print = 0;
        } elsif (/^(\*\*\* ?)?end of (the )?project/i) {
            $state = 'footer';
            $debug && print "state: etext body -> footer\n";
            $print = 0;
        }
    } elsif ($state eq 'footer') {
        # nothing more of interest
    } else {
        die "unknown state '$state'";
    }

    if ($print) {
        print;
        ++$printed;
    } else {
        $debug && print "## $_";
    }
}

Wow, ist diese Frage so alt. Dennoch in R das gutenbergr Paket scheint einen oken Job zu entfernen Header zu tun, einschließlich Müll nach dem ‚offiziellen‘ Ende des Headers.

Zuerst müssen Sie R / Rstudio, dann

installieren
install.packages('gutenbergr')
library(gutenbergr)
t <- gutenberg_download('25519')  # give it the id number of the text

Die strip_headers arg ist T standardmäßig. Sie werden auch wahrscheinlich wollen Illustrationen entfernen:

library(data.table)
t <- as.data.table(t)  # I hate tibbles -- datatables are easier to work with
head(t)  # get the column names

# filter out lines that are illustrations and joins all lines with a space
# the \\[ searches for the [ character, the \\ are used to 'escape' the special [ character
# the !like() means find rows where the text column is not like the search string
no_il <- t[!like(text, '\\[Illustration'), 'text']
# collapse the text into a single character string
t_cln <- do.call(paste, c(no_il, collapse = ' '))
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top