【问题标题】:Extracting units (with or without numerical quantities) from text data从文本数据中提取单位(带或不带数字量)
【发布时间】:2020-04-13 16:26:28
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 如果你没有上下文,除非你知道你在搜索什么,否则很难找到没有数字的单位,例如“A”可以用于安培,但它也是一个英文单词。你有什么样的单位?
  • 这很好,@Laurent。我知道几乎不可避免地会出现误报,但我有一些预处理步骤应该会大大减少要搜索的文本量(例如减少扫描一两个段落而不是许多多页文件),从而减轻误报。我正在寻找几种类型的单位——时间、长度、功率等。

标签: python python-3.x nlp data-science


【解决方案1】:

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

例如:

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"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 2022-06-11
    • 1970-01-01
    • 1970-01-01
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多