【问题标题】:What tool in spaCy to use for recognising company name from ticker symbol?spaCy 中使用什么工具从股票代码中识别公司名称?
【发布时间】:2019-06-07 07:04:41
【问题描述】:

我正在尝试对财经新闻进行情绪分析,我希望能够根据股票代码识别公司。例如。从 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 的文档,一些工具包括使用 PhraseMatcherEntityRulerRule-based matching、令牌匹配器。哪一个最适合这个用例?

【问题讨论】:

    标签: python spacy


    【解决方案1】:

    我的建议是不要尝试将勾选符号与公司名称匹配,而是将文本中的公司名称与您在 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"}
    

    【讨论】:

    • 嘿,我可能听起来很愚蠢,但我正在尝试做同样的事情,但我无法将这段代码转换为 spacy v3(刚开始使用 python)。您可以发布 v3 的变体吗?谢谢!
    • 对不起,我也是Python初学者。试着自己让它工作,如果它不起作用,用你拥有的代码和你尝试过的代码来发表一篇关于它的帖子。
    • 你能不能把它添加到现有的管道中 - 'ner' ?现有的组织名称可能很少?不是更有效率吗?我是 NLP / Spacy 的新手......才几天,如果我的问题不好,请原谅我......
    • @Tushar 我也是初学者,Python,NLP 不是我的主要语言。你可以尝试看看你得到了什么结果。 :)
    【解决方案2】:

    您可以训练 sense2vec 模型,然后将它们与 spaCy 结合使用。他们齐头并进。 https://github.com/explosion/sense2vec

    sense2vec 将帮助您确定 SPOT 在上下文中类似于 Spotify。

    【讨论】:

      【解决方案3】:

      我建议尝试使用fuzzywuzzy 库..它很容易使用,我认为它可以在您的情况下做得很好。可以在这里找到很好的例子:https://towardsdatascience.com/natural-language-processing-for-fuzzy-string-matching-with-python-6632b7824c49

      【讨论】:

        【解决方案4】:

        我成功地使用了实体标尺。

        您可以为公司名称和股票代码创建多个模式,并为两者创建一个 id,以便它们相互关联。

        对于股票代码,我使用了正则表达式模式的组合来计算,例如,3 个大写字母后跟一个 .或:

        【讨论】:

          猜你喜欢
          • 2020-10-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-01-04
          • 1970-01-01
          • 1970-01-01
          • 2016-12-22
          • 1970-01-01
          相关资源
          最近更新 更多