Spacy词向量检查与Python列表推导式语法的技术咨询
嗨,我来帮你梳理这两个问题,顺便修正下代码里的小问题:
问题1:列表推导式的语法是否正确?
你写的if if else语法是完全不正确的,列表推导式并不支持这种写法。
列表推导式的常见结构只有两种:
- 过滤型:
[表达式 for 元素 in 可迭代对象 if 条件1 if 条件2]—— 多个if是逻辑AND关系,用来筛选要处理的元素,这部分不能加else - 条件表达式型:
[表达式 if 条件 else 其他表达式 for 元素 in 可迭代对象]——else要放在生成元素的表达式部分,用来根据条件生成不同结果
你的需求是:如果两个词都有向量就计算相似度、否则往newlist里加标记,这种涉及同时生成两个列表(排序用的相似度列表+无匹配标记列表)的逻辑,用普通for循环实现会更清晰、可读性更强,强行用列表推导式反而会把代码搞乱,还容易出语法错误。
问题2:检查词汇向量的方式是否正确?
你调用doc.vocab的方式是错误的——代码里根本没定义doc这个变量啊!正确的做法是用你加载的模型实例nlp的词汇表,也就是nlp.vocab。
另外补充两个关键点:
- 检查单个词的向量是否存在,应该先获取对应的Lexeme对象,再判断
has_vector属性,比如:lexeme = nlp.vocab["crank"] print(lexeme.has_vector) # 输出True/False - 像
403 (b)这种多词短语,Spacy的词汇表里不会有对应的条目(词汇表是基于单个token的),所以你需要把短语拆成token,检查每个token是否都有向量,才能确保后续的相似度计算是有效的——如果某个token没有向量,Doc的相似度计算会自动用零向量补全,结果会不准确。
修正后的代码示例
我把你的代码重构了一下,解决了上述问题,同时保留了你的核心需求:
import en_vectors_web_lg from operator import itemgetter nlp = en_vectors_web_lg.load() mylist_x = ['crank', 'spindle', '403 (b)', 'education'] mylist_y = ['engine', 'Blockchain', 'data', 'husk'] newlist = [] for token1 in mylist_x: # 检查当前x的词/短语是否所有token都有向量 doc_x = nlp(token1) x_has_valid_vectors = all(token.has_vector for token in doc_x) similarity_pairs = [] for token2 in mylist_y: # 检查当前y的词/短语是否所有token都有向量 doc_y = nlp(token2) y_has_valid_vectors = all(token.has_vector for token in doc_y) if x_has_valid_vectors and y_has_valid_vectors: sim_score = doc_x.similarity(doc_y) similarity_pairs.append((token1, token2, sim_score)) else: newlist.append(f"无匹配:'{token1}' 和 '{token2}'") # 取相似度最高的前1个结果 top_similar = sorted(similarity_pairs, key=itemgetter(2), reverse=True)[:1] print(f"针对'{token1}'的相似度结果:{top_similar}") print("\n所有无匹配的词对:", newlist)
内容的提问来源于stack exchange,提问作者antara risqu
相关产品推荐
相关产品推荐

