python - 如何提取数字(以及比较形容词或范围)

标签 python regex nlp nltk spacy

我在 Python 中从事两个 NLP 项目,两者都有类似的任务,即从句子中提取数值和比较运算符,如下所示:

"... greater than $10 ... ",
"... weight not more than 200lbs ...",
"... height in 5-7 feets ...",
"... faster than 30 seconds ... "

我找到了两种不同的方法来解决这个问题:

如何从这些句子中解析出数值?我认为这是 NLP 中的常见任务。


所需的输出类似于:

输入:

"greater than $10"

输出:

{'value': 10, 'unit': 'dollar', 'relation': 'gt', 'position': 3}

最佳答案

我可能会将其作为分 block 任务来处理,并使用 nltk 的词性标注器及其正则表达式分 block 器。这将允许您根据句子中单词的词性而不是单词本身来定义正则表达式。对于给定的句子,您可以执行以下操作:

import nltk

# example sentence
sent = 'send me a table with a price greater than $100'

我要做的第一件事是稍微修改你的句子,这样你就不会过多地混淆词性标注器。以下是您可以进行的一些更改示例(使用非常简单的正则表达式),但您可以尝试看看是否还有其他更改:

$10 -> 10 dollars
200lbs -> 200 lbs
5-7 -> 5 - 7 OR 5 to 7

所以我们得到:

sent = 'send me a table with a price greater than 100 dollars'

现在你可以从你的句子中得到词性:

sent_pos = nltk.pos_tag(sent.split())
print(sent_pos)

[('send', 'VB'), ('me', 'PRP'), ('a', 'DT'), ('table', 'NN'), ('with', 'IN'), ('a', 'DT'), ('price', 'NN'), ('greater', 'JJR'), ('than', 'IN'), ('100', 'CD'), ('dollars', 'NNS')]

我们现在可以创建 chunker这将根据(相对)简单的正则表达式对您的 POS 标记文本进行分 block :

grammar = 'NumericalPhrase: {<NN|NNS>?<RB>?<JJR><IN><CD><NN|NNS>?}'
parser = nltk.RegexpParser(grammar)

这定义了一个语法分析器,该语法将数字短语(我们称之为短语类型)分 block 。它将您的数字短语定义为:可选名词,后跟可选副词,后跟比较形容词,介词,数字和可选名词。 这只是关于如何定义短语的建议,但我认为这比在单词本身上使用正则表达式要简单得多。

要获取您的短语,您可以:

print(parser.parse(sent_pos))
(S
  send/VB
  me/PRP
  a/DT
  table/NN
  with/IN
  a/DT
  (NumericalPhrase price/NN greater/JJR than/IN 100/CD dollars/NNS))  

或者只得到你可以做的短语:

print([tree.leaves() for tree in parser.parse(sent_pos).subtrees() if tree.label() == 'NumericalPhrase'])

[[('price', 'NN'),
  ('greater', 'JJR'),
  ('than', 'IN'),
  ('100', 'CD'),
  ('dollars', 'NNS')]]

关于python - 如何提取数字(以及比较形容词或范围),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45126071/

相关文章:

python - sys.maxsize 当前可能的值是多少?

java - 用于验证本地化字符串中的字母和数字的正则表达式

nlp - 计算文本字符串相似度的方法?

python - 为什么 python 在注释中使用非常规的三引号?

python - 手动安装python分发包出现IOError : CRC check failed

ruby-on-rails - Ruby:从字符串中提取单词

nlp - 来自 HuggingFace 的 BertWordPieceTokenizer 与 BertTokenizer

deep-learning - 训练损失根本没有改变(PyTorch)

python - 为什么连接两个数据帧时样本大小不同?

java - 在 Java 中删除反斜杠和换行符(一起出现)