2013-10-31 10 views
7

Dies ist meine erste Frage hier und ich bin neu in R, versuche, in meinen ersten Schritt, um herauszufinden, wie die Datenverarbeitung zu tun, bitte halten einfach:)Welche Funktion sollte ich verwenden, um unstrukturierte Textdateien in R zu lesen?

Ich frage mich, was wäre Sei die beste Funktion und eine nützliche Datenstruktur in R um unstrukturierte Textdaten zur Weiterverarbeitung zu laden. Nehmen wir an, ich habe ein Buch als Textdatei gespeichert, in dem keine neuen Zeilen enthalten sind.

Ist es eine gute Idee read.delim() zu nutzen und die Daten in einer Liste gespeichert werden? Oder ist ein Charaktervektor besser und wie würde ich ihn definieren?

Vielen Dank im Voraus.

PN

P.S. Wenn ich "." als mein Delimeter würde es Dinge wie "Mr." behandeln als separater Satz. Während dies nur ein Beispiel ist und ich mich nicht um diesen Fehler kümmere, nur für Bildungszwecke, wäre ich immer noch neugierig, wie Sie dieses Problem umgehen würden.

+3

Willkommen bei SO! Bitte lesen Sie [Fragen stellen] (http://stackoverflow.com/help/on-topic) und [gute R Fragen schreiben] (http://stackoverflow.com/questions/5963269/how-to-make-a) -groß-r-reproduzierbar-Beispiel). Ohne einen Blick auf die eigentliche Datei ist dies ein wenig zu weit gefasst. – Thomas

+0

Ich würde empfehlen, zuerst eine kleine Probe zu nehmen (vielleicht die erste Seite, einen Absatz oder paar Sätze) und ein paar der verfügbaren Methoden auszuprobieren. Dann erfahren Sie, was funktioniert und was nicht, und können mit spezifischen Fragen zurückkommen. –

+1

Schauen Sie sich das tm-Paket an, Vignette hier http://cran.r-project.org/web/packages/tm/vignettes/tm.pdf Der erste Abschnitt enthält Informationen zum Datenimport – sckott

Antwort

7

read.delim lesen Daten in Tabellenformat (mit Zeilen und Spalten, wie in Excel). Es ist nicht sehr nützlich für das Lesen einer Textzeichenfolge.

Um Text aus einer Textdatei in R lesen Sie readLines() verwenden können. readLines() erstellt einen Zeichenvektor mit so vielen Elementen wie Textzeilen. Eine Zeile für diese Art von Software ist eine Textzeichenfolge, die mit einer Zeilenumbrüche endet. (Lesen Sie über Wikipedia newline.) Wenn Sie Text schreiben, geben Sie Ihre systemspezifischen Newline-Zeichen ein, indem Sie Return drücken. In der Tat ist eine Textzeile nicht durch die Breite Ihres Softwarefensters definiert, sondern kann über viele visuelle Zeilen verlaufen. In der Tat ist eine Textzeile, was in einem Buch ein Absatz wäre. So readLines() teilt Ihren Text in den Abschnitten:

> readLines("/path/to/tom_sawyer.txt") 
[1] "\"TOM!\""                                                                                                                  
[2] "No answer."                                                                                                                  
[3] "\"TOM!\""                                                                                                                  
[4] "No answer."                                                                                                                  
[5] "\"What's gone with that boy, I wonder? You TOM!\""                                                                                                        
[6] "No answer."                                                                                                                  
[7] "The old lady pulled her spectacles down and looked over them about the room; then she put them up and looked out under them. She seldom or never looked through them for so small a thing as a boy; they were her state pair, the pride of her heart, and were built for \"style,\" not service—she could have seen through a pair of stove-lids just as well. She looked perplexed for a moment, and then said, not fiercely, but still loud enough for the furniture to hear:" 
[8] "\"Well, I lay if I get hold of you I'll—\" 

Beachten Sie, dass Sie lange Text nach links hier in Stackoverflow bewegen kann. Diese siebte Zeile ist länger als diese Spalte breit ist.

Wie Sie sehen können, lesen readLines() diesen langen siebten Absatz als eine Zeile. Und wie Sie auch sehen können, hat readLines() vor jedem Anführungszeichen einen umgekehrten Schrägstrich eingefügt. Da R die einzelnen Zeilen in Anführungszeichen hält, muss es diese von denen unterscheiden, die Teil des ursprünglichen Textes sind. Daher "entgeht" es den ursprünglichen Anführungszeichen. Lesen Sie über escaping auf Wikipedia.

readLines() Mai eine Warnung ausgeben, dass eine „unvollständige letzte Zeile“ wurde in der Datei gefunden. Das bedeutet nur, dass nach der letzten Zeile keine neue Zeile vorhanden war. Sie können diese Warnung mit readLines(..., warn = FALSE) unterdrücken, aber Sie müssen nicht, es ist kein Fehler, und das Unterdrücken der Warnung wird nur die Warnmeldung unterdrücken.

Wenn Sie nicht wollen, nur Ausgabe Ihren Text der R-Konsole, sondern weiter verarbeiten, erstellen Sie ein Objekt, das die Ausgabe von readLines() hält:

mytext <- readLines("textfile.txt") 

Neben readLines(), können Sie auch scan() verwenden, readBin() und andere Funktionen zum Lesen von Text aus Dateien. Blick in das Handbuch von ?scan usw. Schauen Sie sich ?connections Eingabe über viele verschiedene Methoden zu erlernen Dateien in R. lesen

Ich würde Ihnen dringend empfehlen, Ihren Text in einer .txt-Datei in einem Texteditor wie Vim, Notepad, TextWrangler usw. zu schreiben und nicht in einem Textverarbeitungsprogramm wie MS Word zu schreiben. Word-Dateien enthalten mehr als den auf dem Bildschirm angezeigten oder gedruckten Text, und diese werden von R gelesen. Sie können versuchen, zu sehen, was Sie erhalten, aber für gute Ergebnisse sollten Sie Ihre Datei als .txt-Datei aus Word speichern oder verfassen Sie es in einem Texteditor.

Sie können auch Ihren Text aus einer Textdatei öffnet in jeder anderen Software zu R oder legen Sie den Text in der R-Konsole copy-paste:

myothertext <- c("What did you do? 
+ I wrote some text. 
+ Ah, interesting.") 
> myothertext 
[1] "What did you do?\nI wrote some text.\nAh, interesting." 

Hinweis, wie Return Eingabe nicht R verursacht die auszuführen Befehl, bevor ich die Zeichenfolge mit ") geschlossen. R antwortet nur mit + und sagt mir, dass ich weiter bearbeiten kann. Ich habe diese Pluspunkte nicht eingegeben. Versuch es. Beachten Sie auch, dass die Zeilenumbrüche nun Teil Ihrer Textzeichenfolge sind. (Ich bin auf einem Mac, so dass mein Newline \n ist.)

Wenn Sie geben Sie Ihren Text manuell, ich den ganzen Text als eine Zeichenfolge in einen Vektor laden würden:

x <- c("The text of your book.") 

Sie konnten verschiedene laden Kapitel in verschiedene Elemente dieses Vektors:

y <- c("Chapter 1", "Chapter 2") 

Für eine bessere Referenz, können Sie die Elemente nennen:

z <- c(ch1 = "This is the text of the first chapter. It is not long! Why was the author so lazy?", ch2 = "This is the text of the second chapter. It is even shorter.") 

Jetzt können Sie die Elemente jeder dieser Vektoren aufgeteilt:

sentences <- strsplit(z, "[.!?] *") 

Geben Sie ?strsplit das Handbuch für diese Funktion zu lesen und es nimmt über die Attribute erfahren. Das zweite Attribut nimmt einen regulären Ausdruck an. In diesem Fall habe ich strsplit gesagt, um die Elemente des Vektors an jedem der drei Interpunktionszeichen aufzuteilen, gefolgt von einem optionalen Leerzeichen (wenn Sie hier keinen Raum definieren, wird den resultierenden "Sätzen" ein Leerzeichen vorangestellt).

sentences jetzt enthält:

> sentences 
$ch1 
[1] "This is the text of the first chapter" "It is not long"      
[3] "Why was the author so lazy"   

$ch2 
[1] "This is the text of the second chapter" "It is even shorter" 

Sie die einzelnen Sätze von Indizierungs zugreifen:

> sentences$ch1[2] 
[3] "It is not long" 

R wird nicht in der Lage zu wissen, dass es nicht nach "Mr." aufgeteilt werden soll. Sie müssen Ausnahmen in Ihrem regulären Ausdruck definieren. Dies zu erklären, sprengt den Rahmen dieser Frage.

Wie Sie R sagen würden, wie man Themen oder Objekte erkennt, habe ich keine Ahnung.

+0

Dies ist genau die Diskussion, auf die ich gehofft hatte. Vielen Dank! Großartiger Punkt über den Raum und mach dir keine Sorgen um "Mr." und Thema/Objekt. Das war nur ein Beispiel, um genau zu sein. Was ich vorhabe, ist eine unstrukturierte lange Textstrange mit einem Delimeter. Also sehe ich, dass du x von der Konsole lädst und du mag lese.delim nicht. Wie lade ich dann die Zeichenfolge aus einer Textdatei? Ich versuchte load ("text.txt"), aber ich bekomme einen Fehler: Fehler: schlechte Wiederherstellung Datei magische Zahl (Datei kann beschädigt sein) - keine Daten geladen Hilfe sagt, ich kann load() nur verwenden, wenn ich früher gespeichert habe Was würden Sie verwenden, um x von einer Datei oben zu laden? – user2942656

+0

Ich habe meine Antwort bearbeitet, um Ihre Fragen zu beantworten. –

+0

Ich habe Ihre Frage auch in der Hoffnung bearbeitet, dass sie wieder geöffnet wird. Hoffe, das ist in Ordnung. –

Verwandte Themen