سؤال

لقد جربت طرق مختلفة لتجريد الترخيص من نصوص Project Gutenberg، لاستخدامها كإشارة لمشروع لتعلم اللغة، لكنني لا أستطيع أن أبدو نهج موثوق به. أفضل إرشادي جئت مع حتى الآن هو تجريد أول ثمانية وعشرين خطوطا وآخر 398، والتي عملت لعدد كبير من النصوص. أي اقتراحات فيما يتعلق بالطرق التي يمكنني فيها إجراء تخليص النص تلقائيا (مما يشبه إلى حد كبير الكثير من النصوص، ولكن مع وجود اختلافات طفيفة في كل حالة، وبعض القوالب المختلفة، كذلك)، بالإضافة إلى اقتراحات حول كيفية التحقق من كيفية التحقق من ذلك تم تجريد النص بدقة، سيكون مفيدا للغاية.

هل كانت مفيدة؟

المحلول

أنت لم تمزح. تقريبا كما لو كانوا يحاولون جعل المهمة AI-complete. أستطيع أن أفكر في نهجين فقط، أيا منهم مثالي.

1) قم بإعداد البرنامج النصي، على سبيل المثال، بيرل، لمعالجة الأنماط الأكثر شيوعا (على سبيل المثال، ابحث عن عبارة "التي تنتجها"، استمر في النزول إلى الخط الفارغ التالي وقطع هناك) ولكن وضعت في الكثير من التأكيدات حول ما المتوقع (مثل النص التالي يجب أن يكون العنوان أو المؤلف). بهذه الطريقة عندما يفشل النمط، ستعرف ذلك. في المرة الأولى التي يفشل فيها نمط، تفعل ذلك باليد. المرة الثانية، تعديل البرنامج النصي.

2) حاول تورك الأمازون الميكانيكية.

نصائح أخرى

لقد أردت أيضا أداة لإجراب رؤوس Project Gutenberg ورؤوس تذييلات لسنوات للعب مع معالجة اللغة الطبيعية دون تلوين التحليل باستخدام BoilerPlate مختلطة مع اكتمال. بعد قراءة هذا السؤال، قمت أخيرا بسحب إصبعي، وكتب مرشح بيرل الذي يمكنك أن تقوم بالأنابيب في أي أداة أخرى.

انها مصنوعة كآلة الدولة باستخدام Per-Line Regexes. من السهل أن تكون سهلة الفهم لأن السرعة ليست مشكلة مع الحجم النموذجي للتوسع. حتى الآن يعمل على الزوجين dezen etts لدي هنا ولكن في البرية هناك من المؤكد أن هناك الكثير من الاختلافات التي يجب إضافتها. نأمل أن يكون الرمز واضحا بما يكفي أن أي شخص يمكن أن يضيف إليه:


#!/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 "## $_";
    }
}

نجاح باهر، هذا السؤال قديم الآن. ومع ذلك، يبدو أن حزمة Gutenbergr في R قد تقوم بعمل موافق في إزالة الرؤوس، بما في ذلك غير المرغوب فيه بعد نهاية "الرسمية" للرأس.

أولا، ستحتاج إلى تثبيت r / rstudio، ثم

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

The Strip_Headers Arg هو T افتراضيا. سوف ترغب أيضا في إزالة الرسوم التوضيحية:

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 = ' '))
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top