2017-03-21 11 views
1

文書の構造を保持したまま、Word文書からテキストコンテンツを抽出します。 This questionは最も近くにあり、開始点を提供します。 Here is a dummy word document.私はそれを解凍して、以下のdocument.xmlを含めました:Wordから構造化コンテンツを抽出するXML

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<w:document xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" xmlns:mo="http://schemas.microsoft.com/office/mac/office/2008/main" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mv="urn:schemas-microsoft-com:mac:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape" mc:Ignorable="w14 w15 wp14"><w:body><w:p w14:paraId="09AE8A7D" w14:textId="338F199D" w:rsidR="00D8348A" w:rsidRPr="00987637" w:rsidRDefault="00987637" w:rsidP="00987637"><w:pPr><w:pStyle w:val="Title"/><w:rPr><w:sz w:val="40"/><w:szCs w:val="40"/></w:rPr></w:pPr><w:r w:rsidRPr="00987637"><w:rPr><w:sz w:val="40"/><w:szCs w:val="40"/></w:rPr><w:t xml:space="preserve">The </w:t></w:r><w:r w:rsidR="00A6772E"><w:rPr><w:sz w:val="40"/><w:szCs w:val="40"/></w:rPr><w:t>Example Docx</w:t></w:r><w:bookmarkStart w:id="0" w:name="_GoBack"/><w:bookmarkEnd w:id="0"/></w:p><w:p w14:paraId="0803A50C" w14:textId="77777777" w:rsidR="00987637" w:rsidRDefault="00987637"/><w:p w14:paraId="0EDF635A" w14:textId="77777777" w:rsidR="00987637" w:rsidRDefault="00987637" w:rsidP="00987637"><w:pPr><w:pStyle w:val="Heading2"/></w:pPr><w:r><w:t>Introduction</w:t></w:r></w:p><w:p w14:paraId="2AF32AB2" w14:textId="77777777" w:rsidR="00987637" w:rsidRDefault="00987637"/><w:p w14:paraId="4DB9AE94" w14:textId="6C08452A" w:rsidR="00987637" w:rsidRPr="00987637" w:rsidRDefault="00C52D6C" w:rsidP="00987637"><w:r><w:t>This is the introduction para.</w:t></w:r><w:r w:rsidR="00A6772E" w:rsidRPr="00A6772E"><w:t xml:space="preserve"> </w:t></w:r><w:r w:rsidR="00A6772E"><w:t>Awesome.</w:t></w:r></w:p><w:p w14:paraId="676B3B48" w14:textId="77777777" w:rsidR="00987637" w:rsidRPr="00987637" w:rsidRDefault="00987637" w:rsidP="00987637"/><w:p w14:paraId="17CE18FE" w14:textId="77777777" w:rsidR="00987637" w:rsidRDefault="00987637" w:rsidP="00987637"><w:pPr><w:pStyle w:val="Heading2"/></w:pPr><w:r><w:t>Chapter 1</w:t></w:r></w:p><w:p w14:paraId="58A187F6" w14:textId="77777777" w:rsidR="00987637" w:rsidRDefault="00987637"/><w:p w14:paraId="2815D3B5" w14:textId="58856A78" w:rsidR="00C52D6C" w:rsidRPr="00987637" w:rsidRDefault="00C52D6C" w:rsidP="00C52D6C"><w:r><w:t xml:space="preserve">This is the </w:t></w:r><w:r><w:t xml:space="preserve">chapter 1 intro </w:t></w:r><w:r><w:t>para.</w:t></w:r><w:r><w:t xml:space="preserve"> </w:t></w:r><w:r w:rsidR="00A6772E"><w:t>Awesome.</w:t></w:r></w:p><w:p w14:paraId="7010E2CD" w14:textId="77777777" w:rsidR="00987637" w:rsidRDefault="00987637" w:rsidP="00987637"/><w:p w14:paraId="52D9B766" w14:textId="77777777" w:rsidR="00987637" w:rsidRDefault="00987637" w:rsidP="00987637"><w:pPr><w:pStyle w:val="Heading3"/></w:pPr><w:r><w:t>Chapter 1.1</w:t></w:r></w:p><w:p w14:paraId="055DB7AC" w14:textId="77777777" w:rsidR="00987637" w:rsidRDefault="00987637" w:rsidP="00987637"/><w:p w14:paraId="22A2C473" w14:textId="1D3FE489" w:rsidR="00A6772E" w:rsidRPr="00987637" w:rsidRDefault="00A6772E" w:rsidP="00A6772E"><w:r><w:t xml:space="preserve">This is </w:t></w:r><w:r><w:t>section 1.1</w:t></w:r><w:r><w:t xml:space="preserve"> </w:t></w:r><w:r><w:t>text</w:t></w:r><w:r><w:t>. Awesome.</w:t></w:r></w:p><w:p w14:paraId="1F60E111" w14:textId="77777777" w:rsidR="00987637" w:rsidRDefault="00987637" w:rsidP="00987637"/><w:p w14:paraId="62A6FEE6" w14:textId="77777777" w:rsidR="00987637" w:rsidRDefault="00987637" w:rsidP="00987637"><w:pPr><w:pStyle w:val="Heading3"/></w:pPr><w:r><w:t xml:space="preserve">Chapter </w:t></w:r><w:r><w:t>1.2</w:t></w:r></w:p><w:p w14:paraId="3B8DA076" w14:textId="77777777" w:rsidR="00987637" w:rsidRPr="00987637" w:rsidRDefault="00987637" w:rsidP="00987637"/><w:p w14:paraId="43519FB7" w14:textId="311F726C" w:rsidR="00987637" w:rsidRDefault="00A6772E" w:rsidP="00987637"><w:r><w:t>This is section 1.</w:t></w:r><w:r><w:t>2</w:t></w:r><w:r><w:t xml:space="preserve"> text. Awesome.</w:t></w:r></w:p><w:p w14:paraId="2D6908F2" w14:textId="77777777" w:rsidR="00987637" w:rsidRDefault="00987637" w:rsidP="00987637"/><w:p w14:paraId="3189011C" w14:textId="77777777" w:rsidR="00987637" w:rsidRDefault="00987637" w:rsidP="00987637"><w:pPr><w:pStyle w:val="Heading2"/></w:pPr><w:r><w:t>Chapter 2</w:t></w:r></w:p><w:p w14:paraId="6FFC56CD" w14:textId="77777777" w:rsidR="00987637" w:rsidRDefault="00987637" w:rsidP="00987637"/><w:p w14:paraId="3E9AE930" w14:textId="329881E3" w:rsidR="00987637" w:rsidRPr="00987637" w:rsidRDefault="00A6772E" w:rsidP="00987637"><w:r><w:t xml:space="preserve">This is </w:t></w:r><w:r><w:t>the c</w:t></w:r><w:r><w:t xml:space="preserve">hapter </w:t></w:r><w:r><w:t>2</w:t></w:r><w:r><w:t xml:space="preserve"> </w:t></w:r><w:r><w:t xml:space="preserve">text. </w:t></w:r><w:r><w:t>Awesome.</w:t></w:r></w:p><w:p w14:paraId="57F0B3DF" w14:textId="77777777" w:rsidR="00987637" w:rsidRDefault="00987637"/><w:p w14:paraId="48315F42" w14:textId="77777777" w:rsidR="00987637" w:rsidRDefault="00987637"/><w:sectPr w:rsidR="00987637" w:rsidSect="00751697"><w:pgSz w:w="11900" w:h="16840"/><w:pgMar w:top="1440" w:right="1440" w:bottom="1440" w:left="1440" w:header="720" w:footer="720" w:gutter="0"/><w:cols w:space="720"/><w:docGrid w:linePitch="360"/></w:sectPr></w:body></w:document> 

これはXMLで読み取ります

library(xml2) 
library(magrittr) 
doc = read_xml('document.xml') 

私はこれからコンテンツを抽出するための次のステップについて不明確です。私は試しました:

xml_find_all(doc, "/w:body/w:p/w:hyperlink/w:r/w:t") %>% xml_text() 

しかし、これは何も返しません。援助に感謝します。私の目標は、文書構造を保存する何らかの形式でテキスト内容をエクスポートすることです。おそらく、木を反映する列を持つcsvは、からHeading 1などのTitleなどです。

---------------------------------------- \

編集:私はそれを見るよう

例ドキュメント構造は次のとおりです。

Title 
-- Heading 2 
-- -- para 
-- -- Chapter 1 
-- -- -- para 
-- -- -- Chapter 1.1 
-- -- -- -- para 
-- -- -- Chapter 1.2 
-- -- -- -- para 
-- -- Chapter 2 
-- -- -- para 

正直に言うと私は出力に柔軟だ(JSONで結構です)、それは、この程度のドキュメントの構造を反映する必要があります。

+0

文書構造*を保持する*何らかの形式が何を意味するかについては、より具体的に説明する必要があります。すでに構造化された形式(OOXML)になっています。テーブル/ CSVは基本的に木構造をよく表していません。おそらく、真の最終目標を述べるなら、私たちはよりよく助けることができるかもしれません。 – kjhughes

+0

ところで、あなたのXPathは、 'w:document'ルート要素を無視し、文書に何も存在しないときは' w:hyperlink'要素を参照する以外の理由がないと成功することはありません。 – kjhughes

+0

@kjhughesドキュメントの構造と出力についてお答えしたいと思います。 – geotheory

答えて

1

あなたは、タスクの複雑さを厳しく過小評価している可能性があります。

XPathは選択用です。 OOXMLドキュメントからノードのセットを抽出するXPath式を記述するのは簡単なことです。たとえば、このXPath 2.0の表現、

//w:p[w:pPr/w:pStyle/@w:val='Heading2']/string() 

は、ドキュメントのために返されます:あなたは以上を行いたい場合は

Introduction 
Chapter 1 
Chapter 2 

あなたがにしたい場合は、その後、変換、を選択XSLTに足を踏み入れたいと思うでしょう。また、Word文書で行うことができるすべてを処理するには、OOXML仕様の5K +ページを掘り下げなければなりません。インデントレベルはスタイルから来る可能性があるため、一般的にカバーするのは特に難しいことに注意してください。

XPathは、の選択で驚くほど強力です。私は、1つの以上のXPath 2.0の式を使ってドキュメントに戻ります

//w:p[normalize-space()]/normalize-space() 

The Example Docx 
Introduction 
This is the introduction para. Awesome. 
Chapter 1 
This is the chapter 1 intro para. Awesome. 
Chapter 1.1 
This is section 1.1 text . Awesome. 
Chapter 1.2 
This is section 1. 2 text. Awesome. 
Chapter 2 
This is the c hapter 2 text. Awesome. 

あなたを残しておきますそして、それはあなたがほとんど無い、開発作業のために欲しいものをじらすように近いようです。入力スペースを制限すると、通常の場合よりも少ない労力で階層を回復できますが、一般的なケースは非常に複雑です。

+0

ありがとうございます。代わりに簡単に抽出できるxmlには、より自然な階層がありますか?この後の転送処理は比較的開いています。 – geotheory

+0

OOXMLはフォーマット/プレゼンテーション指向であるため、通常はXMLで自然に包含される階層は、インデントレベルやスタイル定義のいずれかでエンコードされます。入力DOCXを完全に制御できる場合は、タスクを簡略化するために入力を制限することがあります。たとえば、スタイルとその名前に規則を課す場合があります。 – kjhughes

1

私は最後にpandocを使用して別のアプローチをとりました - pandoc -s example.docx -o example.htmlでhtmlに変換しました。これにより、書式設定やリンクなどが保持され、よりクリーンな出力が得られます。

関連する問題