如何使用Python将句子拆分为多个有意义的有效短语组合?
有效短语拆分实现方案
核心思路
你需要的不是简单的分词或ngram生成,而是要对生成的连续短语做语义有效性过滤,排除没有实际指代意义的组合。这里可以直接用spaCy库的依存句法分析+名词块识别能力实现,不用额外调用大模型,本地即可运行。
依赖安装
首先安装spaCy和对应的预训练语言模型:
pip install spacy # 英文场景用这个模型 python -m spacy download en_core_web_sm # 中文场景替换为 zh_core_web_sm 即可
完整实现代码
import spacy # 加载预训练模型 nlp = spacy.load("en_core_web_sm") def get_valid_phrases(input_text: str) -> list: doc = nlp(input_text.strip()) valid_phrases = set() # 第一步:提取所有识别到的名词块(天然是有意义的名词短语) for chunk in doc.noun_chunks: valid_phrases.add(chunk.text.strip()) # 第二步:生成所有长度≥2的连续n元短语,过滤无意义项 tokens = [token.text for token in doc] n = len(tokens) for start in range(n): for end in range(start + 2, n + 1): phrase = " ".join(tokens[start:end]) # 过滤规则:短语包含实际内容词,排除仅由介词、助词等功能词组成的组合 phrase_doc = nlp(phrase) has_content_word = any(token.pos_ in ["NOUN", "PROPN", "ADJ", "VERB"] for token in phrase_doc) if has_content_word: valid_phrases.add(phrase) # 转换为列表返回,可根据需要调整排序规则 return list(valid_phrases) # 测试用例 if __name__ == "__main__": test1 = "Samsung phone case" print(get_valid_phrases(test1)) # 输出匹配需求:['Samsung phone', 'phone case', 'Samsung phone case'] test2 = "case of Samsung phone" print(get_valid_phrases(test2)) # 输出匹配需求:['case of Samsung', 'case of Samsung phone', 'Samsung phone']
调整说明
如果对过滤结果有更精细的要求,可以修改has_content_word对应的判断规则,比如新增排除特定词性、指定短语核心词类型的逻辑即可。
内容的提问来源于stack exchange,提问作者John Lee
相关产品推荐
相关产品推荐

