我如何检测文本中的模式?

How would I detect a pattern in text?

我正在创建一个 Python 脚本,它能够理解人类输入的文本,以便在股市上采取行动。对于 示例 所有这些都表示同一件事:

我需要提取的组件:行情代码 ($EXAMPLE)、看涨期权价格 ($22.5)、到期日 (8/128月12日),均价($0.8)。问题是有时格式会有所不同,如上例所示。有时 'calls' 将表示为 22.5c 有时平均价格可能写为 Average Price = 0.8@0.8。还有一点需要注意:有时字符串可能有文本前缀或在我想提取的部分之后(如上一个示例所示)。

我应该如何处理这个问题?由于格式每次都不相同,机器学习在这种情况下是否有用?

使用正则表达式,您可以使用 re.search 找到所需单词的第一个实例。我将您所有的示例放入名为“question.txt”的 txt 文件中并进行了简单搜索。

import re

open_txt = open("question.txt", "r")
read = open_txt.read()
try:
    starts_with_example = re.search(r'[$]EXAMPLE.*', read).group()
    starts_with_lorem = re.search(r'Lorem.*', read).group()
except:
    print("No instance")

print(starts_with_example)
print(starts_with_lorem)

如果您想将每个实例都放在一个列表中,请将 re.search 替换为 re.findall。

这不是一个小问题,我假设会有两个人对同一文本给出不同答案的情况。特别是如果您不想指定允许的格式。

我建议采用类似于 PW1990 建议的方法,这是最可预测和可维护的解决方案。但是,不是每个语义结构只有一个正则表达式,您可以有一种方法,它会尽力使用一组正则表达式来提取 属性。

如果你有足够的数据,你也可以做机器学习。为此,您需要有一个数据集,其中包含每个“文本”到每个 {action} 的映射。根据我的经验,我将从 100k-1M 数据点(映射)开始。 您可以尝试一个双向 RNN,每个字符 returns 一个数字,将其分配给 类 [ticker、price、avg、date、type、other] 之一。然后您可以手动解析和验证每个子字符串。如果您知道要解析的内容,这很简单。 当然,您可以尝试一种端到端的方法,其中 RNN returns 您将重新格式化的字符串输入正则表达式。但是,它显着增加了模型的复杂性和您需要的数据量。

这里有一个类似的 Whosebug 线程:https://stats.stackexchange.com/questions/35249/machine-learning-techniques-for-parsing-strings

我个人的建议是,如果不是绝对需要,请避免使用机器学习。 ML 不是灵丹妙药,需要大量工作才能正确使用。所以这将是一个独立的项目。另一方面,对于这个问题,正则表达式是一个更直接的解决方案,尽管我知道对所有可能的正则表达式进行硬编码是乏味的。请记住,您的目标很可能是获得 99% 的案例。