2013-04-17 1 views
2

У меня есть смешанная коллекция файлов документов MS Word. Некоторые файлы являются * .doc, а некоторые - * .docx. Я учусь использовать tm и Я (более или менее *) успешно создан корпус, состоящий из * .doc файлов с помощью этого:Как создать корпус * .docx файлов с помощью tm?

ex_eng <- Corpus(DirSource('~/R/expertise/corpus/english'), 
       readerControl=list(reader=readDOC, 
            language='en_CA', 
            load=TRUE)); 

Эта команда не обрабатывает * .docx файлов. Я предполагаю, что мне нужен другой читатель. От this article, я понимаю, что я мог бы написать свои собственные (учитывая хорошее понимание формата .docx, которого у меня сейчас нет).

Чтение readDOC использует antiword для разбора * .doc файлов. Есть ли подобное приложение, которое будет анализировать файлы * .docx?

Или еще лучше, существует ли уже стандартный способ создания корпуса * .docx-файлов с помощью tm?


* больше или меньше, потому что, хотя файлы туда и читаемы, я получаю это предупреждение для каждого документа: In readLines(y, encoding = x$Encoding) : incomplete final line found on 'path/to/a/file.doc'

+0

@BrandonBertelsen: Хорошо, я могу попробовать это. Должен ли я использовать 'tm' или есть лучший пакет? – dnagirl

ответ

0

Я закончил с использованием docx2txt для преобразования .docx файлов в текст. Затем я создал корпус из них, как это:

ex_eng <- Corpus(DirSource('~/R/expertise/corpus/english'), 
       readerControl=list(reader=readPlain, 
            language='en_CA', 
            load=TRUE)); 

Я полагаю, что я мог бы, вероятно, взломать читатель readDOC так, что он будет использовать docx2txt или Antiword по мере необходимости, но это работает.

5

.docx файлы заархивированные файлы XML. Если выполнить это:

> uzfil <- unzip(file.choose()) 

А затем выбрать .docx файл в каталоге, вы получите:

> str(uzfil) 
chr [1:13] "./[Content_Types].xml" "./_rels/.rels" "./word/_rels/document.xml.rels" ... 
> uzfil 
[1] "./[Content_Types].xml"   "./_rels/.rels"     "./word/_rels/document.xml.rels" 
[4] "./word/document.xml"   "./word/theme/theme1.xml"  "./docProps/thumbnail.jpeg"  
[7] "./word/settings.xml"   "./word/webSettings.xml"   "./word/styles.xml"    
[10] "./docProps/core.xml"   "./word/numbering.xml"   "./word/fontTable.xml"   
[13] "./docProps/app.xml"  

Это также молча распаковывать все эти файлы в рабочем каталоге. В файле "./word/document.xml" есть слова, которые вы ищете, поэтому вы, вероятно, можете прочитать их с помощью одного из инструментов XML в пакете XML. Я предполагаю, что вы могли бы сделать что-то вдоль линий:

library(XML) 
xtext <- xmlTreeParse(unz(uzfil[4]), useInternalNodes = TRUE)) 

На самом деле вы, возможно, потребуется сохранить это во временный каталог-и добавить, что путь к имени файла,»./word/document.xml ».

Вы можете использовать дальнейшие шаги, предусмотренные @GaborGrothendieck в этом ответе: How to extract xml data from a CrossRef using R?

+1

Ответьте, пожалуйста. –

+0

Нет, ты прав. 'pandoc' не работает в этом направлении. –

+0

Оглядываясь назад на shell-скрипт, я вижу, что я использовал antiword для преобразования 'doc> txt' и docx2txt для преобразования' docx> txt'. –