如何用TfidfVectorizer同时识别单字术语与Artificial Intelligence复合名词
调整方案说明
方案1:通过n-gram参数快速支持短语识别
这是实现成本最低的方案,仅需修改TfidfVectorizer的初始化参数即可完成适配:
- 新增
ngram_range=(1,2)参数:表示同时生成1元(单个词)、2元(连续两个词)的特征单元,既可以保留ai的识别能力,也能生成artificial intelligence的短语特征 - 可选新增
min_df=2参数:过滤仅在极少数文档中出现的特征,减少无效二元短语带来的噪音
修改后的向量化器初始化代码如下:
tfidf_vectorizer = TfidfVectorizer( input='filename', stop_words='english', ngram_range=(1, 2), # 支持1-2个词的特征单元 min_df=2 # 可选配置,可根据语料规模调整阈值 )
后续查询对应术语时,调整筛选规则即可同时匹配两类术语:
top_tfidf = tfidf_df.sort_values(by=['document','tfidf'], ascending=[True,False]).groupby(['document']).head(10) # 同时匹配AI缩写和全拼短语 target_terms = (top_tfidf['term'] == 'ai') | (top_tfidf['term'] == 'artificial intelligence') top_tfidf[target_terms]
另外注意你原代码中存在一处笔误:tfidf_df.stack().reset_index()没有赋值给变量,会导致后续重命名列时报错,需要调整为:
tfidf_df = tfidf_df.stack().reset_index()
方案2:自定义分词规则识别首字母大写专有名词
如果需要精准识别连续首字母大写的专有名词(比如仅把Artificial Intelligence这种首字母大写的组合识别为短语,忽略小写的artificial intelligence),可以自定义分词器提前合并符合规则的词组:
import re from sklearn.feature_extraction.text import TfidfVectorizer def custom_tokenizer(text): # 匹配连续首字母大写的词组,临时替换为下划线连接的单个单元 pattern = r'([A-Z][a-z]+(?=\s[A-Z])(?:\s[A-Z][a-z]+)+)' processed_text = re.sub(pattern, lambda m: m.group(0).replace(' ', '_'), text) # 分词后还原空格,保持特征名可读性 tokens = processed_text.split() return [token.replace('_', ' ') for token in tokens] # 向量化器指定自定义分词器 tfidf_vectorizer = TfidfVectorizer( input='filename', stop_words='english', tokenizer=custom_tokenizer, token_pattern=None # 关闭默认分词规则,优先使用自定义分词逻辑 )
这种方式可以精准捕获你提到的连续首字母大写的专有名词,不会生成多余的无关二元短语,适配更精细化的专有名词识别需求。
内容的提问来源于stack exchange,提问作者Taruth
相关产品推荐
相关产品推荐

