我的建议是不要尝试将勾选符号与公司名称匹配,而是将文本中的公司名称与您在 CSV 中的公司名称匹配。你会得到MUCH更好的结果。
作为模糊匹配,我建议使用 Levenshtein 算法,示例如下:
T-SQL Get percentage 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"}