python - 文本提取中的断词, Lxml Xpath

标签 python xml xpath lxml openxml

我想提取带删除线的单词,即 <w:delText>标签。我使用了一个表达式,它成功提取了它,只是有些单词出现了损坏。例如单词"They"显示为 'T''hey' 。下面给出的是问题仍然存在的 xml 示例:

<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))  

我怎样才能解决这个问题?

编辑:

我意识到问题只出在包含大写字母的单词上,像“She”、“He”这样的单词也会被拆分。

最佳答案

It is the words.." They" should be counted as one word rather than two (that my code is doing currently).

问题的出现是因为文本片段被任意地放入多个所谓的“运行”中。在 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 元素(即“run”)内。不幸的是,这种单独运行的划分是如此随意,以至于它只能是任意的。据我所知,没有人知道如何选择开始新的运行。

现在,转向你的问题,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>

换句话来说,

  • 如果连续有两个“已删除的运行”(或更多),并且其中任何一个都没有空格,那么您就知道它们只是一个单词的一部分。

至于单词边界,

  • 如果已删除的运行前面有一个正常的运行,并且它们之间有空格(无论是在正常运行的末尾还是已删除的运行的开头),您就知道已删除的运行开始了一个新单词
  • 如果删除的词组前面有一个没有任何空格的正常词组,那么您应该得出结论,仅删除了单词的一部分,并且此删除的词组不是整个单词
  • 对于紧随其后的正常运行的已删除运行,上述所有情况反之亦然,无论它们之间有或没有空格。

当然,我们都知道依靠空格来区分单词是一种粗略的方法,但在这种情况下可能就足够了。

关于python - 文本提取中的断词, Lxml Xpath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26057180/

相关文章:

java - 在 xpath 中按文本查找元素不起作用 - selenium webdriver

python - Pandas :将行值设置为与索引号对应的字母表中的字母?

java - 如何使用 httpClient 对 Java 中的 xml 文件的部分文件进行归档

c# - XmlSerializer。保留空字符串属性?

android - Styleable无法解析

xslt - 每个路径的xpath多个条件

java - 在 Java 中从 XPath 填充 XML 文件

python - Flask 数据库问题

python - 使用不断变化的 Xpath 查找元素

python - 在执行一些额外操作的同时将数据帧重新采样为新数据帧