求助:如何用SpaCy从银行短信中识别含缩写的商户名称?
银行短信商户名称识别的解决方向
自定义规则匹配
SpaCy自带的Matcher和PhraseMatcher可以针对性定义商户名的匹配规则,专门处理银行短信里的缩写、截断式商户名。比如针对"AMZN MKTP"这类大写多段缩写,可以写规则匹配连续的大写字母组;也可以把日常常见的银行商户缩写整理成短语库,用PhraseMatcher批量匹配,精准度更高。
示例代码:from spacy.matcher import Matcher nlp = spacy.load("en_core_web_trf") matcher = Matcher(nlp.vocab) # 匹配两段大写字母组成的商户缩写(如AMZN MKTP) pattern = [{"IS_UPPER": True, "LENGTH": {">": 2}}, {"IS_SPACE": True}, {"IS_UPPER": True, "LENGTH": {">": 2}}] matcher.add("MERCHANT_ABBR", [pattern]) doc = nlp("Paid €3.77 at AMZN MKTP Spent today: €3.77") matches = matcher(doc) for match_id, start, end in matches: span = doc[start:end] print(f"识别到商户: {span.text}")微调预训练模型
预训练的en_core_web_trf是通用领域模型,对银行短信这种垂直场景的实体识别效果有限。你可以收集一批标注好的银行短信数据(给每条短信里的商户名打上自定义实体标签,比如MERCHANT),用这些数据微调SpaCy模型,让模型学习到这类场景下商户名的特征,包括缩写、截断形式。
核心步骤就是准备标注数据(符合SpaCy的JSONL格式),然后用spacy train命令或者Python API完成微调,之后用微调后的模型替换默认模型即可。利用上下文定位
银行短信里的商户名通常有固定的上下文规律,比如紧跟在"at"、"in"、"to"这类介词之后,且在金额信息之后。可以先定位这些关键词,再提取后面符合格式的文本作为商户名候选,比如连续的大写字母、带特定后缀的字符串。
示例代码:doc = nlp("Paid €3.77 at AMZN MKTP Spent today: €3.77") for token in doc: if token.text.lower() in ["at", "in", "to"]: merchant_tokens = [] next_token = token.next # 提取后续连续的大写非标点词 while next_token and next_token.is_upper and not next_token.is_punct: merchant_tokens.append(next_token.text) next_token = next_token.next if merchant_tokens: print(f"识别到商户: {' '.join(merchant_tokens)}")
内容的提问来源于stack exchange,提问作者Andrii Artemenko
相关产品推荐
相关产品推荐

