TfidfVectorizer 将每条文本转为 TF-IDF 向量(默认 L2 归一化),降低常见词权重、提升区分性词权重。'0.24'),对角线为 '1.00'。from typing import List
import sys, ast, json
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
def tfidf_cosine_similarity(texts: List[str]) -> List[List[str]]:
"""
基于 TF-IDF 的文本两两余弦相似度矩阵(字符串两位小数)
:param texts: 一维列表,每个元素为一条英文文本
:return: 二维列表,相似度矩阵,每个元素为字符串形式的两位小数
"""
# 边界处理:空列表
if not texts:
return []
# 使用英文停用词,统一小写;默认 L2 归一化,使用 unigram
vectorizer = TfidfVectorizer(lowercase=True, stop_words='english', ngram_range=(1, 1), norm='l2')
try:
# 转为稀疏 TF-IDF 矩阵(文档数 × 词维度)
tfidf = vectorizer.fit_transform(texts)
except ValueError:
# 若全部文本在去停用词后为空导致词汇表为空,则返回对角为 1,其余为 0 的矩阵
n = len(texts)
return [[("1.00" if i == j else "0.00") for j in range(n)] for i in range(n)]
# 计算两两余弦相似度(文档数 × 文档数)
sim = cosine_similarity(tfidf)
# 将数值格式化为两位小数字符串
formatted = [[f"{v:.2f}" for v in row] for row in sim]
return formatted
def read_texts_from_stdin() -> List[str]:
"""
从标准输入读取文本:
1) 若输入以 '[' 开头,则按 JSON/字面量列表解析:["a", "b", ...]
2) 否则按多行解析:每行一条文本,空行忽略,EOF 结束
"""
data = sys.stdin.read().strip()
if not data:
return []
if data.lstrip().startswith('['):
# 先尝试 Python 字面量,再回退到 JSON
try:
return ast.literal_eval(data)
except Exception:
return json.loads(data)
else:
return [line for line in data.splitlines() if line.strip()]
if __name__ == "__main__":
texts = read_texts_from_stdin()
matrix = tfidf_cosine_similarity(texts)
for row in matrix:
print(row)
实现一个基于 TF−IDF 的文本相似度计算系统。具体要求如下:
1.读取输入的文本数据。
2.对文本数据进行预处理(例如分词、去停用词,大小写统一)
3.使用 TF-IDF 方法提取文本特征。
4.计算每对文本之间的余弦相似度。
输入为一个一维列表,包含若干英文文本数据。
输出为一个二维列表,表示每对文本之间的余弦相似度,保留两位小数,用字符串形式表示。具体格式见输出样例。
支持使用 Python 中的 numpy、scipy、pandas、scikit−learn 库。
输入
["I love this product","I LOVE this product","l love this ipad pro"]
输出
['1.00','1.00','0.24']
['1.00','1.00','0.24']
['0.24','0.24','1.00']