gpt4 book ai didi

python - 如何使用 NLTK 正则表达式模式用 UP/DOWN 指标注释财经新闻?

转载 作者:行者123 更新时间:2023-12-03 21:14:25 25 4
gpt4 key购买 nike

我正在复制本文中描述的算法:https://arxiv.org/pdf/1811.11008.pdf

在最后一页,它使用以下示例描述了提取在标记为“NP JJ”的语法中定义的叶: 营业利润率为 8.3%,而一年前为 11.8%。

我期待看到一片标有“NP JJ”的叶子,但我没有。我正在纠结为什么(对正则表达式来说相对较新。)

def split_sentence(sentence_as_string):
''' function to split sentence into list of words
'''
words = word_tokenize(sentence_as_string)

return words

def pos_tagging(sentence_as_list):

words = nltk.pos_tag(sentence_as_list)

return words

def get_regex(sentence, grammar):

sentence = pos_tagging(split_sentence(sentence));

cp = nltk.RegexpParser(grammar)

result = cp.parse(sentence)

return result


example_sentence = "Operating profit margin was 8.3%, compared to 11.8% a year earlier."

grammar = """JJ : {< JJ.∗ > ∗}
V B : {< V B.∗ >}
NP : {(< NNS|NN >)∗}
NP P : {< NNP|NNP S >}
RB : {< RB.∗ >}
CD : {< CD >}
NP JJ : : {< NP|NP P > +(< (>< .∗ > ∗ <) >) ∗ (< IN >< DT > ∗ < RB > ∗ < JJ > ∗ < NP|NP P >) ∗ < RB > ∗(< V B >< JJ >< NP >)∗ < V B > (< DT >< CD >< NP >) ∗ < NP|NP P > ∗ < CD > ∗ < .∗ > ∗ < CD > ∗| < NP|NP P >< IN >< NP|NP P >< CD >< .∗ > ∗ <, >< V B > < IN >< NP|NP P >< CD >}"""

grammar = grammar.replace('∗','*')

tree = get_regex(example_sentence, grammar)

print(tree)

最佳答案

首先看How to use nltk regex pattern to extract a specific phrase chunk?

让我们看看句子的 POS 标签是什么:

from nltk import word_tokenize, pos_tag

text = "Operating profit margin was 8.3%, compared to 11.8% a year earlier."
pos_tag(word_tokenize(text))

[出去]:
[('Operating', 'NN'),
('profit', 'NN'),
('margin', 'NN'),
('was', 'VBD'),
('8.3', 'CD'),
('%', 'NN'),
(',', ','),
('compared', 'VBN'),
('to', 'TO'),
('11.8', 'CD'),
('%', 'NN'),
('a', 'DT'),
('year', 'NN'),
('earlier', 'RBR'),
('.', '.')]

第一个陷阱!否 JJ在任何标签中

没有 JJ在该句子中的任何 POS 中标记。

让我们回到论文 https://arxiv.org/pdf/1811.11008.pdf

enter image description here

尽管如此, NP JJ不是最终目标;最终目标是生产 UPDOWN基于一些启发式的标签。

让我们重新表述这些步骤:
  • 解析句子解析器 (在这种情况下,正则表达式解析器使用某种语法)
  • 识别句子有 的信号一个图案可以说明最终标签的用途。

    2a.遍历解析树提取另一种模式这告诉我们性能指标和数值。

    2b.使用提取的提取数值来确定方向性 UP/DOWN使用 一些启发式方法

    2c。用 UP 标记句子/Down在 (2b)
  • 中确定

    让我们看看我们可以先构建哪个组件。

    2b. extract another pattern that tells us about the performance indicator and numeric values.



    我们知道某个百分比的输出总是 CD NN
    ('8.3', 'CD'), ('%', 'NN')
    ('11.8', 'CD'), ('%', 'NN')

    所以让我们尝试在语法中捕捉它。
    patterns = """
    PERCENT: {<CD><NN>}
    """

    PChunker = RegexpParser(patterns)
    PChunker.parse(pos_tag(word_tokenize(text)))

    [出去]:
    Tree('S', [('Operating', 'NN'), ('profit', 'NN'), ('margin', 'NN'), ('was', 'VBD'), 
    Tree('PERCENT', [('8.3', 'CD'), ('%', 'NN')]),
    (',', ','), ('compared', 'VBN'), ('to', 'TO'),
    Tree('PERCENT', [('11.8', 'CD'), ('%', 'NN')]),
    ('a', 'DT'), ('year', 'NN'), ('earlier', 'RBR'), ('.', '.')])

    现在,我们如何得到这个:

    1. Identify signal that the sentence has a pattern that can tell use about the ultimate label.


    我们知道 <PERCENT> compared to <PERCENT>是一个很好的模式,所以让我们尝试对其进行编码。

    我们知道 compared to有标签 VBN TO
     ('8.3', 'CD'),
    ('%', 'NN'),
    (',', ','),
    ('compared', 'VBN'),
    ('to', 'TO'),
    ('11.8', 'CD'),
    ('%', 'NN'),

    这个怎么样:
    patterns = """
    PERCENT: {<CD><NN>}
    P2P: {<PERCENT><.*>?<VB.*><TO><PERCENT>}
    """

    PChunker = RegexpParser(patterns)
    PChunker.parse(pos_tag(word_tokenize(text)))

    [出去]:
    Tree('S', [('Operating', 'NN'), ('profit', 'NN'), ('margin', 'NN'), ('was', 'VBD'), 
    Tree('P2P', [
    Tree('PERCENT', [('8.3', 'CD'), ('%', 'NN')]),
    (',', ','), ('compared', 'VBN'), ('to', 'TO'),
    Tree('PERCENT', [('11.8', 'CD'), ('%', 'NN')])]
    ),
    ('a', 'DT'), ('year', 'NN'), ('earlier', 'RBR'), ('.', '.')]
    )

    但这种模式可以是任意数字。我们需要 performance indicator 的信号

    由于我不是金融领域的领域专家,所以简单地利用 operating profit margin 的存在可能是一个很好的信号,即
    from nltk import word_tokenize, pos_tag, RegexpParser

    patterns = """
    PERCENT: {<CD><NN>}
    P2P: {<PERCENT><.*>?<VB.*><TO><PERCENT>}
    """

    PChunker = RegexpParser(patterns)


    text = "Operating profit margin was 8.3%, compared to 11.8% a year earlier."

    indicators = ['operating profit margin']
    for i in indicators:
    if i in text.lower():
    print(PChunker.parse(pos_tag(word_tokenize(text))))

    [出去]:
    (S
    Operating/NN
    profit/NN
    margin/NN
    was/VBD
    (P2P
    (PERCENT 8.3/CD %/NN)
    ,/,
    compared/VBN
    to/TO
    (PERCENT 11.8/CD %/NN))
    a/DT
    year/NN
    earlier/RBR
    ./.)

    现在我们如何获得 UP/ DOWN ?

    2b. Use the extracted extracted numeric values to determine the directionality UP / DOWN using some heuristics



    仅从例句来看,除了“更早”之外,没有其他任何东西可以告诉我们数字的先行性。

    所以让我们假设这一点,如果我们有模式 PERCENT VBN TO PERCENT earlier ,我们说第二个百分比是一个较旧的数字。
    import nltk
    from nltk import word_tokenize, pos_tag, RegexpParser

    patterns = """
    PERCENT: {<CD><NN>}
    P2P: {<PERCENT><.*>?<VB.*><TO><PERCENT><.*>*<RBR>}
    """

    def traverse_tree(tree, label=None):
    # print("tree:", tree)
    for subtree in tree:
    if type(subtree) == nltk.tree.Tree and subtree.label() == label:
    yield subtree

    PChunker = RegexpParser(patterns)

    parsed_text = PChunker.parse(pos_tag(word_tokenize(text)))
    for p2p in traverse_tree(parsed_text, 'P2P'):
    print(p2p)

    [出去]:
    (P2P
    (PERCENT 8.3/CD %/NN)
    ,/,
    compared/VBN
    to/TO
    (PERCENT 11.8/CD %/NN)
    a/DT
    year/NN
    earlier/RBR)

    UP/ DOWN标签?
    import nltk
    from nltk import word_tokenize, pos_tag, RegexpParser

    patterns = """
    PERCENT: {<CD><NN>}
    P2P: {<PERCENT><.*>?<VB.*><TO><PERCENT><.*>*<RBR>}
    """

    PChunker = RegexpParser(patterns)


    def traverse_tree(tree, label=None):
    # print("tree:", tree)
    for subtree in tree:
    if type(subtree) == nltk.tree.Tree and subtree.label() == label:
    yield subtree

    def labelme(text):
    parsed_text = PChunker.parse(pos_tag(word_tokenize(text)))
    for p2p in traverse_tree(parsed_text, 'P2P'):
    # Check if the subtree ends with "earlier".
    if p2p.leaves()[-1] == ('earlier', 'RBR'):
    # Check if which percentage is larger.
    percentages = [float(num[0]) for num in p2p.leaves() if num[1] == 'CD']
    # Sanity check that there's only 2 numbers from our pattern.
    assert len(percentages) == 2
    if percentages[0] > percentages[1]:
    return 'DOWN'
    else:
    return 'UP'

    text = "Operating profit margin was 8.3%, compared to 11.8% a year earlier."

    labelme(text)

    现在问题引...

    **你想写这么多规则并使用 labelme()来捕捉它们吗?以上? **

    你写的模式是万无一失的吗?

    例如。是否存在使用指标和“较早”比较百分比的模式不会如预期那样“向上”或“向下”的情况

    为什么我们要在 AI 时代编写规则?

    您是否已经有人工注释的数据,其中有句子及其相应的 UP/DOWN 标签? 如果是这样,让我建议类似 https://allennlp.org/tutorialshttps://github.com/huggingface/transformers/blob/master/notebooks/03-pipelines.ipynb

    关于python - 如何使用 NLTK 正则表达式模式用 UP/DOWN 指标注释财经新闻?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61756189/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com