spaCy中的哪种工具可用于从股票代码中识别公司名称?

时间:2019-06-07 07:04:41

标签: python spacy

我正在尝试对财经新闻进行情感分析,并且希望能够基于股票代码识别公司。例如。从SPOT识别Spotify。最终目标是生成每个公司的情绪模型。 spaCy非常擅长于即用即命名实体识别,但是在比较股票代号和公司时就显得不足。我有csv格式的股票代码和公司名称(来自纳斯达克,纽约证券交易所,美国证券交易所)的列表。

基于在spaCy中使用相似性()函数的结果,到目前为止效果不佳。下表显示了一些相似性评分较低的公司的样本,即使名称在外观上相似。我想使用公司名称/交易代码的列表来训练模型,并且在此训练过程之后具有更高的相似性得分。

+------------+-------------------------+------------+
|   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,令牌匹配器。哪一个最适合此用例?

4 个答案:

答案 0 :(得分:0)

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

sense2vec将帮助您确定上下文中的SPOT与Spotify相似。

答案 1 :(得分:0)

我建议尝试使用Fuzzywuzzy库。它非常易于使用,并且我认为它可以在您遇到的情况中起到很好的作用。可以在这里找到一个很好的例子:https://towardsdatascience.com/natural-language-processing-for-fuzzy-string-matching-with-python-6632b7824c49

答案 2 :(得分:0)

我的建议是不要将打勾符号与公司名称匹配,而是将文本中的公司名称与CSV中的公司名称匹配。您会得到很多更好的结果。

作为模糊匹配,我建议使用Levenshtein算法,例如: T-SQL Get percentage of character match of 2 strings

对于Python Levenshtein,我建议这样做: https://github.com/ztane/python-Levenshtein/#documentation

我个人已经将 <LinearLayout android:layout_width="match_parent" android:layout_height="80dp" android:background="#ccc" android:orientation="horizontal" android:gravity="center_vertical"> <TextView android:layout_width="wrap_content" android:layout_height="match_parent" android:gravity="center" android:text="S1" android:background="#110faa"> </TextView> <EditText android:layout_width="wrap_content" android:layout_height="match_parent" android:gravity="center_vertical" android:background="#102df2" android:inputType="numberDecimal" android:importantForAutofill="no"/> </LinearLayout> 与jsonl规则集结合使用

但是您将不得不携带自己的数据。 您需要一个带有代码符号和公司名称的数据库。

EntityRuler

文件是使用SQL生成的

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)

答案 3 :(得分:0)

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

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

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