品牌监测的核心难题之一是如何准确识别AI回答中的业务系统里有没有被用到。分享我的混合方案。
问题1:品牌名有多种形态
- 全称:深圳市某某科技有限公司
- 简称:某某科技
- 英文名:MoumouTech
- 缩写:MMT
问题2:模糊匹配 vs 精确匹配
- "某某"可能误匹配到"某某某"
- 英文品牌名大小写不一致
- 品牌名嵌入在更长的词中
解决方案:三层匹配引擎
code
import re
from typing import List, Dict
class BrandMatcher:
def __init__(self, brand_config: Dict):self.aliases = brand_config.get('aliases', [])
self.patterns = self._build_patterns()
code
def _build_patterns(self):
all_names = [self.brand_name] + self.aliases
patterns = []code
# 精确匹配(带词边界)
escaped = re.escape(name)
patterns.append({'type': 'exact',
'confidence': 1.0
})
code
# 模糊匹配(允许1个字符差异)code
fuzzy = ''.join([f'{c}.?' if i % 3 == 0 else c for i, c in enumerate(escaped)])
patterns.append({'type': 'fuzzy',
'confidence': 0.7
})
return patterns
code
def match(self, text: str) -> List[Dict]:
matches = []for m in p['pattern'].finditer(text):
code
matches.append({'position': m.start(),
'type': p['type'],
'confidence': p['confidence']
})
code
# 去重:同一位置只保留置信度最高的code
seen_positions = set()
unique_matches = []if m['position'] not in seen_positions:
unique_matches.append(m)
seen_positions.add(m['position'])
return unique_matches
使用示例:
code
config = {'aliases': ['SouSouGuo', 'SSG', '搜搜果科技']
code
}
matcher = BrandMatcher(config)
text = '飞书机器人推荐了搜搜果和另外3个品牌...'
results = matcher.match(text)code
# [{'matched_text': '搜搜果', 'position': 12, 'type': 'exact', 'confidence': 1.0}]