中文短文本语义相似度
时间: 2025-05-05 10:19:29 浏览: 14
### 中文短文本语义相似度计算
#### 使用潜在语义分析(LSA)
对于中文短文本的语义相似度计算,可以采用潜在语义分析(Latent Semantic Analysis, LSA)。LSA 是一种用于挖掘文档集合中的隐藏模式的技术。通过降维技术,如奇异值分解(SVD),可以从原始的高维度空间映射到低纬度的空间,在这个过程中保留了重要的特征并减少了噪音的影响。
为了应用 LSA 计算两个句子间的相似度,首先需要对输入数据进行预处理,这通常涉及分词、去除停用词等操作[^1]:
```python
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.decomposition import TruncatedSVD
import numpy as np
def preprocess(texts):
vectorizer = TfidfVectorizer(token_pattern=r"(?u)\b\w+\b", stop_words='english')
X_tfidf = vectorizer.fit_transform(texts)
svd_model = TruncatedSVD(n_components=2, algorithm='randomized', n_iter=100, random_state=42)
lsa_features = svd_model.fit_transform(X_tfidf)
return lsa_features, vectorizer.get_feature_names_out(), svd_model.explained_variance_ratio_
texts = ["今天天气真好适合去逛街也适合晒太阳",
"今天天气不错适合出去玩也适合去晒太阳"]
lsa_result, feature_names, variance_ratios = preprocess(texts)
print(f"Explained Variance Ratios: {variance_ratios}")
```
接着利用余弦相似度来衡量两篇文档在转换后的向量表示下的接近程度:
```python
from sklearn.metrics.pairwise import cosine_similarity
similarity_matrix = cosine_similarity(lsa_result)
for i in range(len(similarity_matrix)):
for j in range(i+1, len(similarity_matrix[i])):
print(f"Cosine Similarity between sentence {i} and {j}: ", similarity_matrix[i][j])
```
上述代码展示了如何使用 `TfidfVectorizer` 来提取 TF-IDF 特征,并进一步运用 SVD 进行降维得到 LSA 表示形式;最后借助 `cosine_similarity()` 函数求得不同样本间基于此模型下表达方式的距离大小关系。
#### 利用TF-IDF与余弦相似性
另一种常见的做法就是直接依赖于 TF-IDF 加权方案配合余弦距离来进行比较。这种方法不需要额外引入复杂的矩阵运算过程,而是简单地依靠词语频率统计特性完成任务。具体来说,当给定一组待测字符串时,先将其转化为对应的稀疏矩阵结构,再据此构建出各自的权重分布图谱,最终依据这些图形之间的夹角差异评估彼此之间可能存在的关联强度[^2]:
```python
vectorizer = TfidfVectorizer()
tfidf_matrix = vectorizer.fit_transform([text_a, text_b])
cos_similarities = cosine_similarity(tfidf_matrix[0:1], tfidf_matrix).flatten()[1:]
print('Cosine similarities:', cos_similarities)
```
这里展示了一个更为简洁的方式——仅需调用一次 `fit_transform()` 即可获得整个批次内所有实例共同作用形成的全局视角下的重要性和影响力指标体系;随后再次呼叫 `cosine_similarity()` 完成实际数值上的量化工作。
#### 分词的重要性
值得注意的是,在任何涉及到自然语言处理的任务之前,合理的分词策略都是不可或缺的一环。因为只有准确地区分开各个独立单元之后才能更好地理解其内在含义以及相互联系。例如下面给出了一组简单的例子说明了这一点[^3]:
```python
sentences = [
'今天天气真好适合去逛街也适合晒太阳',
'今天天气不错适合去玩也适合去晒太阳'
]
tokenized_sentences = [[word for word in sent.split()] for sent in sentences]
print(tokenized_sentences)
```
尽管这段代码只是模拟性的实现了最基础层面的手动切分动作,但在真实场景里往往还需要考虑更多因素比如命名实体识别、同义替换等问题从而确保后续环节能够顺利开展下去。
阅读全文
相关推荐


















