regex 如何提取数字(沿着比较形容词或范围)

r6hnlfcb  于 2022-11-18  发布在  其他
关注(0)|答案(2)|浏览(117)

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

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

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

我如何从这样的句子中解析出数值呢?我假设这是NLP中的一个常见任务。
所需的输出如下所示:

输入:

“大于$10”

输出:

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

ozxc1zmp1#

我可能会把这个作为一个分块任务来处理,并使用nltk的词性标记器和它的正则表达式分块器。这将允许你基于句子中单词的词性而不是单词本身来定义正则表达式。对于一个给定的句子,你可以做以下操作:

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标记文本进行分块:

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

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

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')]]
x759pob2

x759pob22#

https://spacy.io/universe/project/numerizer可能适合您的用例。
从链接:

from spacy import load
import numerizer
nlp = load('en_core_web_sm') # or any other model
doc = nlp('The Hogwarts Express is at platform nine and three quarters')
doc._.numerize()
# {nine and three quarters: '9.75'}

相关问题