python - spaCy 中使用什么工具从股票代码中识别公司名称?
问题描述
我正在尝试对财经新闻进行情绪分析,我希望能够根据股票代码识别公司。例如。从 SPOT 识别 Spotify。最终目标是生成每家公司的情绪模型。spaCy 在开箱即用的命名实体识别方面非常出色,但在比较股票代码和公司时却不足。我有一个 csv 格式的股票代码和公司名称列表(来自 NASDAQ、NYSE、AMEX)。
基于使用 spaCy 中的similarity() 函数,目前结果并不好。下表显示了一些相似性得分较低的公司的样本,即使名称在视觉上相似。我想使用公司名称/股票代码列表来训练模型,并且在这个训练过程之后有更高的相似度分数。
+------------+-------------------------+------------+
| Stock | Name | Similarity |
+------------+-------------------------+------------+
| CSPI stock | CSP Inc. | 0.072 |
| CHGG stock | Chegg, Inc. | 0.071 |
| QADA stock | QAD Inc. | 0.065 |
| SPOT stock | Spotify Technology S.A. | 0.064 |
+------------+-------------------------+------------+
根据 spaCy 的文档,一些工具包括使用PhraseMatcher、EntityRuler、Rule-based matching、 Token Matcher。哪一个最适合这个用例?
解决方案
我的建议是不要尝试将勾选符号与公司名称匹配,而是将文本中的公司名称与您在 te CSV 中的公司名称匹配。你会得到更好的结果。
作为模糊匹配,我建议使用 Levenshtein 算法,例如: T-SQL Get percent of character match of 2 strings
对于 Python Levenshtein,我会推荐这个: https ://github.com/ztane/python-Levenshtein/#documentation
我个人使用EntityRuler
过 jsonl 规则集的组合
但是您必须携带自己的数据。您需要一个带有股票代码和公司名称的数据库。
nlp = spacy.load('en_core_web_lg')
stock_symbol_shapes_ruler = EntityRuler(nlp)
stock_symbol_shapes_ruler.name="stock_symbol_shapes_ruler"
patterns_stock_symbol_shapes = [
{"label": "ORG", "pattern": "NASDAQ"},
{"label": "STOCK_SYMBOL", "pattern": [{"SHAPE": "XXX.X"}]},
{"label": "STOCK_SYMBOL", "pattern": [{"SHAPE": "XXXX.X"}]},
]
stock_symbol_shapes_ruler.add_patterns(patterns_stock_symbol_shapes)
nlp.add_pipe(stock_symbol_shapes_ruler, before='ner')
stock_symbol_ruler = EntityRuler(nlp).from_disk("./stock_symbol_pattern.jsonl")
stock_symbol_ruler.name = 'stock_symbol_ruler'
nlp.add_pipe(stock_symbol_ruler, before='ner')
company_name_ruler = EntityRuler(nlp).from_disk("./company_name_patterns.jsonl")
company_name_ruler.name="company_name_ruler"
nlp.add_pipe(company_name_ruler, before='ner')
doc = nlp(test_text)
这些文件是使用 SQL 生成的
{"label": "STOCK_SYMBOL", "pattern": "AAON"}
{"label": "STOCK_SYMBOL", "pattern": "AAP"}
{"label": "STOCK_SYMBOL", "pattern": "AAPL"}
{"label": "STOCK_SYMBOL", "pattern": "AAVL"}
{"label": "STOCK_SYMBOL", "pattern": "AAWW"}
{"label": "ORG", "pattern": "AMAG Pharmaceuticals"}
{"label": "ORG", "pattern": "AMAG Pharmaceuticals Inc"}
{"label": "ORG", "pattern": "AMAG Pharmaceuticals Inc."}
{"label": "ORG", "pattern": "AMAG Pharmaceuticals, Inc."}
{"label": "ORG", "pattern": "Amarin"}
{"label": "ORG", "pattern": "Amarin Corporation plc"}
{"label": "ORG", "pattern": "Amazon.com Inc."}
{"label": "ORG", "pattern": "Amazon Inc"}
{"label": "ORG", "pattern": "Amazonm"}
推荐阅读
- javascript - 如何使用 javascript 创建数字猜谜游戏并做出反应?
- redux - 存储逆关系时如何在redux中合并规范化状态?
- asp.net-core - 如何从密钥库中获取证书?
- java - 如何将消息直接发送到 azure 服务总线(java)中的死信队列?
- python - 如何使用单个 POST 请求从两个不同的模型创建两个对象实例?
- python - 在数据框与列表上使用 numpy.median 时结果不一致
- android - 无法将 Context 导入我的 android 库
- sql - 使用 BigQuery sql 转置行中的列
- swiftui - SwiftUI 导航前触发函数
- javascript - 点击时反应 axios 编辑文本