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

Posted

技术标签:

【中文标题】如何为 sklearn 的 CountVectorizer 编写自定义标记器以将所有 XML 标记以及打开和关闭标记之间的所有文本视为标记【英文标题】:How to write a custom tokenizer for sklearn's CountVectorizer to treat all XML tags and all text between open and closed tags as tokens 【发布时间】:2021-09-27 06:46:57 【问题描述】:

我有这种形式的数据:

<?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 标记,要么是开始标记和结束标记之间的文本。

例如,我希望函数获取&lt;m:math display="inline"&gt;&lt;m:semantics&gt;&lt;m:mrow&gt;,以及&lt;m:mi&gt;s&lt;/m:mi&gt; 之间的s(m:mi 标签也应该被视为标记)。该函数将作为参数传递给CountVectorizer sklearn 方法作为标记器参数。

此输入序列的预期标记将采用以下形式: ["&lt;m:math display="inline"&gt;", "&lt;m:semantics&gt;", "&lt;m:mrow&gt;", "&lt;m:mrow&gt;","&lt;m:mi&gt;", "s", "&lt;/m:mi&gt;", ..., "&lt;/m:math&gt;"]

我最初尝试使用正则表达式,但似乎必须有一种更简单的方法来使用方法来做到这一点,但我对这种方法的行为方式有点迷茫。任何帮助表示赞赏!

【问题讨论】:

我会use an XML parser。 我会使用 XML 解析器,但我需要在正则表达式中进行,因为我需要将模式作为参数传递给 scikit-learn 方法 看起来像XY problem。如果您将您真正想要实现的目标扩展为edit 到您的帖子,那么有人可能会向您展示一个更好的方法,因为您正在着手(使用正则表达式解析递归结构)很可能是一个世界疼痛。 好的,我已经编辑了帖子以明确我想要做什么 谢谢。你能显示你期望输出的确切标记吗?我不是 sklearn 的人,但 tokenizer 是一个函数,所以这意味着你不限于正则表达式,你可以使用 xml 解析器。顺便说一句,最好将您的正则表达式尝试留在那里,所以我会重新添加它以避免您的问题被关闭为“过于宽泛”,但也提供上下文,以便其他人可以展示更好的方法。 【参考方案1】:

通过使用 python 的string.split() 方法并通过右括号“>”拆分 XML 输入字符串(并将其添加回字符串),我设法在不使用正则表达式或 XML 解析器的情况下解决了这个问题。然后我只扫描列表,对于不以左括号“

【讨论】:

以上是关于如何为 sklearn 的 CountVectorizer 编写自定义标记器以将所有 XML 标记以及打开和关闭标记之间的所有文本视为标记的主要内容,如果未能解决你的问题,请参考以下文章

如何为 sklearn CountVectorizer 设置自定义停用词?

如何为多标签分类器/一对休息分类器腌制 sklearn 管道?

如何为 sklearn 聚类算法准备 pandas 字符串数据表?

Python sklearn 逻辑回归 K-hold 交叉验证:如何为 coef_ 创建一个框架

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

如何为XGBClassifier.fit()提供加权eval集?