首页 > 解决方案 > 从文本数据中提取单位(带或不带数字量)

问题描述

我正在尝试处理包含技术数据的文本并提取文本中使用的任何单位。

为此,我调查了几个 Python 库,但是当没有关联的数字时,大多数库似乎都无法提取单位。例如,我想从句子“所有频率将以 Hz 报告”中找到“Hz”(或某种形式)。

Quantulum 和 grobid-quantities 不是为处理此类情况而设计的,并且测试表明,当没有关联的数字量或限定符时,它们找不到单位。像 pint 这样的其他软件包似乎是为计算而不是 NLP 而设计的。

还有其他可以使用的软件包吗?

我也可以使用查找解决方案;只是匹配一些广泛的单位列表及其各种缩写,但我无法找到这样的列表。如果它存在,将不胜感激。现有的单位管理包必须有这样的列表,但我不知道如何获得它们。

标签: pythonpython-3.xnlpdata-science

解决方案


一个起点:您可以使用正则表达式。

例如:

import re

para = """
This long text may contains units like kg, W, s, m.
"""

print(
    re.findall(
        r"\b(?:dag|dam|daL|min|sec|rad|deg|bar|mol|kg|hg|dg|cg|mg|\xb5g"
        r"|km|hm|dm|cm|mm|\xb5m|kL|hL|dL|cL|mL|\xb5L|ms|\xb0C|\xb0F"
        r"|sr|Pa|dB|eV|Bq|Ci|Gy|rd|Sv|cd|lm|lx|Gs|Mx|Wb|F|g|m|L|s|h"
        r"|K|B|N|W|J|A|V|H|C|T)\b",
        para,
        flags=re.DOTALL,
    )
)

你得到:

['kg', 'W', 's', 'm']

但你可能有误报。

例如,需要一个更复杂的正则表达式来匹配“kW.m^{-1}”。

编辑

“更复杂的正则表达式”的一个示例可以是 GPS 位置:

GPS_COORD_REGEX = (
    r"(?:"
    r"(\d+(?:[.,]\d+)?)\s*°"  # group 1
    r"\s*"
    r"(\d+(?:[.,]\d+)?)\s*['’\u2032]"  # group 2
    r"(?:\s*"
    r"(\d+(?:[.,]\d+)?)\s*(?:[»«“”\u2033]|['’\u2032]{2}))?"  # group 3
    r")"
)

另一个例子:匹配 m^2、cm^2 等:

regex=r"\b(km|hm|dam|m|dm|cm|mm|µm)([23])\b"

推荐阅读