【问题标题】:Count word occurrences inside elements in XML directory计算 XML 目录中元素内的单词出现次数
【发布时间】:2021-09-10 13:53:50
【问题描述】:

我有一个包含 XML 文件的文件夹,我正在尝试计算一个元素中特定单词的出现次数。更具体地说,我想计算文件夹中所有 XML 中的出现次数,例如单词“Impfstoff”(位于元素“mpeg7text:Keyword”中)。 XML 如下所示:


<?xml version="1.0" encoding="UTF-8" standalone="true"?>

-<Description xsi:type="ContentEntityType">

   -<MultimediaContent xsi:type="mpeg7text:TextType">

      -<mpeg7text:Text>

         -<mpeg7text:ModelMetadata>
             <mpeg7text:Version>tfidf_newmodel</mpeg7text:Version>
         </mpeg7text:ModelMetadata>

         -<mpeg7text:TextDescriptor xsi:type="mpeg7text:KeywordExtractionType">

         -<mpeg7text:Keyword>

           <mpeg7text:Keyword>Impfstoff</mpeg7text:Keyword>
           <mpeg7text:Relevance>121.58288081128799</mpeg7text:Relevance>
           <mpeg7text:Frequency>22</mpeg7text:Frequency>
           <mpeg7text:Confidence>1.0</mpeg7text:Confidence>

         </mpeg7text:Keyword>

我目前的代码是:

import os
import lxml.etree as et
for filename in os.listdir(path):
    if not filename.endswith('.xml'): continue
    if filename.endswith('.xml'):
        fullname = os.path.join(path, filename)
        root = et.parse(fullname)
        root.xpath('count(.//mpeg7text:Keyword/mpeg7text:Keyword[.=Corona])')

但我收到此错误:

XPathEvalError                            Traceback (most recent call last)
<ipython-input-11-0ca6983bfdd7> in <module>
      7         #root = tree.getroot(tree)
      8         root = et.parse(fullname)
----> 9         root.xpath('count(.//mpeg7text:Keyword/mpeg7text:Keyword[.=Corona])')

src/lxml/etree.pyx in lxml.etree._ElementTree.xpath()

src/lxml/xpath.pxi in lxml.etree.XPathDocumentEvaluator.__call__()

src/lxml/xpath.pxi in lxml.etree._XPathEvaluatorBase._handle_result()

XPathEvalError: Undefined namespace prefix

我有点迷失了现在该怎么做才能计算元素 mpeg7text:Keyword 中的单词 以前有没有人做过这样的事情并且可以在这里提供帮助?那太棒了!

干杯!

【问题讨论】:

    标签: python xml nlp find-occurrences


    【解决方案1】:

    如果您切换到 XPath 2.0+(在 Python 中使用 Saxon/C 库提供),那么您可以使用单个 XPath 表达式搜索整个目录:

    count(collection('my/folder?select=*.xml')//*:Keyword[.='Impfstoff'])
    

    【讨论】:

    • 听起来很有趣,我该如何使用这个表达式?我试过: out = count(collection('C:/my/directory/path?select=*.xml')//*:Keyword[.='Impfstoff']) 但这不起作用。对不起,如果这听起来很奇怪,但我对编码很陌生。
    • 它必须是 URI 而不是文件名,所以是“file:///C:/my/directory”。但您也有可能在 API 级别出错。最好提出一个新问题,详细说明你在做什么以及它是如何失败的。
    【解决方案2】:

    要在 python 中使用命名空间,请参阅this answer

    您可以使用替代 XPath:

    root.xpath("count(.//*[local-name()='Keyword']/*[local-name()='Keyword'][text()='Corona'])")
    

    查看“Corona”周围引号的用法。

    但由于您已经使用 // 并因此找到所有关键字元素,您也可以使用:

    root.xpath("count(.//*[local-name()='Keyword'][text()='Corona'])")
    

    【讨论】:

    • 谢谢,我用你的编辑试过了,它确实做了一些事情,但我认为脚本不会遍历整个 XML 文件夹。当我这样做时:` for filename in files: if not filename.endswith('.xml'): continue if filename.endswith('.xml'): fullname = os.path.join(dirpath, filename) root = et. parse(fullname) tree= root.getroot() out = tree.xpath("count(.//*[local-name()='Keyword']/*[local-name()='Keyword'][text ()='Eigentum'])") ` 虽然这个词出现了几次,但我得到了 0.0...
    猜你喜欢
    • 1970-01-01
    • 2012-08-09
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    相关资源
    最近更新 更多