2014-09-26 75 views
1

我想提取帶刪除線的單詞,即<w:delText>標籤。我已經使用了一個表達式,並且成功地將其提取出來,除了某些單詞出現中斷。例如,單詞"They"顯示爲'T''hey'。下面給出的是哪裏的問題仍然存在一個xml樣本:文本提取中的單詞分隔符,Lxml Xpath

<w:delText 
    xml:space="preserve">. 
    </w:delText></w:r><w:r 
    w:rsidR="0020338C" 
    w:rsidDel="00147CFE"><w:rPr><w:rFonts 
    w:ascii="Times 
    New 
    Roman" 
    w:hAnsi="Times 
    New 
    Roman"/><w:sz 
    w:val="24"/></w:rPr><w:delText>T</w:delText></w:r><w:r 
    w:rsidR="00DF6A7D" 
    w:rsidDel="00147CFE"><w:rPr><w:rFonts 
    w:ascii="Times 
    New 
    Roman" 
    w:hAnsi="Times 
    New 
    Roman"/><w:sz 
    w:val="24"/></w:rPr><w:delText>hey</w:delText></w:r></w:del><w:ins 
    w:id="5" 
    w:author="Author" 
    w:date="2014-08-13T10:08:00Z"><w:r 
    w:rsidR="00147CFE"><w:rPr><w:rFonts 
    w:ascii="Times 
    New 
    Roman" 
    w:hAnsi="Times 
    New 
    Roman"/><w:sz 
    w:val="24"/></w:rPr><w:t 
    xml:space="preserve"> 
    that 
    helps 
    them</w:t></w:r></w:ins> 

我用下面的代碼:

find = etree.XPath("//w:p//.//*[local-name() = 'delText']//text()" ,namespaces={'w':"http://schemas.openxmlformats.org/wordprocessingml/2006/main"}) 
list_of_deleted_words = (find(lxml_tree)) 

我怎麼可能解決這一問題?

編輯

我意識到這個問題是隻用言語是在他們大寫字母,如「她」的話,「他」還可以獲得分裂。

+1

那麼,'delText'在概念上並不知道「單詞」。您可以刪除任何一段文本,包括空格。所以,試圖找到提取的單詞實際上是沒有意義的。除非你確信只有完整的單詞被刪除? – 2014-09-26 11:29:46

+0

單詞的部分也可以被刪除,並且提取得很好。但在上述情況下,已刪除單詞「他們」。它爲什麼單獨出現標記是另一個OOXML神祕-_- – 2014-09-26 11:34:48

+0

您的目標是提取**單詞**(不管用戶是否一次刪除它們一個整個單詞),還是您的目標是提取大塊該用戶刪除? – LarsH 2014-09-26 14:33:30

回答

2

這就是「他們」應該算作一個字而不是兩個(我的代碼目前正在這樣做)。

問題出現是因爲文本的延伸被任意地放入了幾個所謂的「運行」中。在OOXML,文字在w:p元素(段)像這樣(簡化結構)主辦:

<w:p> 
    <w:r> 
    <w:t>Simpli</w:t> 
    </w:r> 
    <w:r> 
    <w:t>fied structures</w:t> 
    </w:r> 
</w:p> 

正如你所看到的,實際的文本里面w:t元素依次一個w:r元素中或「運行」。不幸的是,這種在單獨運行中的分工非常隨意,它可能只是任意的。據我所知,沒有人知道如何選擇開始新的跑步。

現在,轉向您的問題,w:delText也在裏面運行。而且,在那裏,進入奔跑的碎片似乎純粹是無用的。

用你目前的方法,沒有辦法知道一個特定的w:delText的文本內容是否是一個完整的單詞。爲此,您必須考慮整個運行順序,包括正常文本和包含已刪除文本的順序。

很可能這是行得通的,因爲刪除的文本仍處於刪除位置的運行狀態。顯示的OpenXML 2003年,略有不同,但它並不重要:

<w:r> 
    <w:t>Normal Text before deletion </w:t> 
</w:r> 
<aml:annotation aml:id="0" 
       w:type="Word.Deletion" 
       aml:author="Mathias Müller" 
       aml:createdate="2014-09-26T22:25:00Z"> 
    <aml:content> 
    <w:r wsp:rsidDel="00F647B7"> 
     <w:delText>T</w:delText> 
    </w:r> 
    </aml:content> 
</aml:annotation> 
<aml:annotation aml:id="1" 
       w:type="Word.Deletion" 
       aml:author="Mathias Müller" 
       aml:createdate="2014-09-26T22:24:00Z"> 
    <aml:content> 
    <w:r wsp:rsidDel="00F647B7"> 
     <w:delText>hey </w:delText> 
    </w:r> 
    </aml:content> 
</aml:annotation> 
<w:r> 
    <w:t>Normal Text after deletion </w:t> 
</w:r> 

換句話說,

  • 如果有兩個「刪除奔跑」在一排(或更多),在沒有空格他們中的任何一個,那麼你就知道他們只是一個詞的部分。

至於字邊界,

  • 如果被刪除的運行是由一正常運行之前,它們之間具有空白(無論是在正常運行結束或刪除的運行的開始)您知道刪除的運行開始了一個新單詞
  • 如果刪除的運行前面是沒有任何空格的正常運行,那麼您應該斷定該單詞只有一部分被刪除,並且該刪除的運行不是整個單詞
  • 上述所有情況對於已刪除的運行是一回事之後是正常運行,兩者之間有或沒有空白。

當然,我們都知道,依靠空格來區分單詞是一種粗糙的方法,但在這種情況下它可能就足夠了。

+0

是的,現在我正在考慮在連續運行實例上使用類似於正則表達式的東西..任何建議從你的角度出發? – 2014-09-27 04:15:21

+0

@Swordy XSLT將非常適合這項任務(複雜的XML操作)。但是如果你對XSLT感到不舒服,我相信lxml和Python也是一個不錯的選擇。我認爲正則表達式不會做到這一點,它必須是幾個XPath表達式和條件(以我描述的方式)。但評論部分並不是真正的答案。嘗試寫一個新版本,併發佈一個新問題,如果它不起作用。 – 2014-09-27 14:01:01

+0

ohk我會試試,可以發佈鏈接,其中有xslt的例子,除了正式的lxml網站。我準備好學習xslt,如果這是一個更好的選擇做上述.. – 2014-09-28 09:18:30

相關問題