如何为 sklearn 的 CountVectorizer 编写自定义分词器,以将所有 XML 标签以及开放和关闭标签之间的所有文本视为标记



我有这种形式的数据:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/TR/MathML2/dtd/xhtml-math11-f.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:svg="http://www.w3.org/2000/svg">
<m:math display="inline"><m:semantics><m:mrow><m:mrow><m:mi>s</m:mi><m:mo>⁢</m:mo><m:mfenced close=")" open="("><m:mrow><m:mn>1</m:mn><m:mo>,</m:mo><m:mn>1</m:mn></m:mrow></m:mfenced></m:mrow><m:mo>=</m:mo><m:mrow><m:mi>S</m:mi><m:mo>⁢</m:mo><m:mfenced close=")" open="("><m:mrow><m:mn>1</m:mn><m:mo>,</m:mo><m:mn>1</m:mn></m:mrow></m:mfenced></m:mrow><m:mo>=</m:mo><m:mn>1</m:mn></m:mrow><m:annotation-xml encoding="MathML-Content"><m:apply><m:ci></m:ci><m:apply><m:times></m:times><m:ci>s</m:ci><m:apply><m:interval closure="open"></m:interval><m:cn>1</m:cn><m:cn>1</m:cn></m:apply></m:apply><m:eq></m:eq><m:apply><m:times></m:times><m:ci>S</m:ci><m:apply><m:interval closure="open"></m:interval><m:cn>1</m:cn><m:cn>1</m:cn></m:apply></m:apply><m:eq></m:eq><m:cn>1</m:cn></m:apply></m:annotation-xml></m:semantics></m:math>
</html>

我要做的是编写一个函数,将这些数据标记到标记列表中,其中每个标记要么是XML标记,要么是开始标记和结束标记之间的文本。

例如,我希望函数获得<m:math display="inline"><m:semantics><m:mrow>,以及<m:mi>s</m:mi>之间的s(m:mi标记也应被视为标记(。此函数将作为参数传递给CountVectorizer sklearn方法作为标记化器参数。

此输入序列的预期令牌的形式如下:["<m:math display="inline">", "<m:semantics>", "<m:mrow>", "<m:mrow>","<m:mi>", "s", "</m:mi>", ..., "</m:math>"]

我最初试图使用regex,但似乎必须有一种更简单的方法来使用方法,但我有点不知道这个方法应该如何表现。感谢您的帮助!

我通过使用python的string.split()方法并通过右括号分割XML输入字符串,在不使用regex或XML解析器的情况下解决了这个问题"gt"(并将其添加回字符串(。然后我只需扫描列表,并查找每一个不以左括号"开头的字符串<";,我将左括号上的字符串拆分为单词和标记,然后将它们添加到正确索引处的主标记列表中。

最新更新