python - 从文本数据中提取单位(带或不带数字量)
问题描述
我正在尝试处理包含技术数据的文本并提取文本中使用的任何单位。
为此,我调查了几个 Python 库,但是当没有关联的数字时,大多数库似乎都无法提取单位。例如,我想从句子“所有频率将以 Hz 报告”中找到“Hz”(或某种形式)。
Quantulum 和 grobid-quantities 不是为处理此类情况而设计的,并且测试表明,当没有关联的数字量或限定符时,它们找不到单位。像 pint 这样的其他软件包似乎是为计算而不是 NLP 而设计的。
还有其他可以使用的软件包吗?
我也可以使用查找解决方案;只是匹配一些广泛的单位列表及其各种缩写,但我无法找到这样的列表。如果它存在,将不胜感激。现有的单位管理包必须有这样的列表,但我不知道如何获得它们。
解决方案
一个起点:您可以使用正则表达式。
例如:
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"