复述挖掘
复述挖掘的任务是在大型句子语料库中寻找复述(含义相同/相似的文本)。在语义文本相似度中,我们看到了在句子列表中查找复述的简化版本。那里提出的方法使用了暴力破解方法来对所有对进行评分和排序。
然而,由于其运行时间是二次方,因此无法扩展到大型(10,000 个或更多)句子集合。对于更大的集合,可以使用paraphrase_mining()函数
from sentence_transformers import SentenceTransformer
from sentence_transformers.util import paraphrase_mining
model = SentenceTransformer("all-MiniLM-L6-v2")
# Single list of sentences - Possible tens of thousands of sentences
sentences = [
"The cat sits outside",
"A man is playing guitar",
"I love pasta",
"The new movie is awesome",
"The cat plays in the garden",
"A woman watches TV",
"The new movie is so great",
"Do you like pizza?",
]
paraphrases = paraphrase_mining(model, sentences)
for paraphrase in paraphrases[0:10]:
score, i, j = paraphrase
print("{} \t\t {} \t\t Score: {:.4f}".format(sentences[i], sentences[j], score))
paraphrase_mining()接受以下参数
- sentence_transformers.util.paraphrase_mining(model: SentenceTransformer, sentences: list[str], show_progress_bar: bool = False, batch_size: int = 32, query_chunk_size: int = 5000, corpus_chunk_size: int = 100000, max_pairs: int = 500000, top_k: int = 100, score_function: Callable[[Tensor, Tensor], Tensor] = <function cos_sim>, truncate_dim: int | None = None, prompt_name: str | None = None, prompt: str | None = None) list[list[float | int]][source]
给定一个句子/文本列表,此函数执行复述挖掘。它将所有句子与所有其他句子进行比较,并返回具有最高余弦相似度分数的对的列表。
- 参数:
model (SentenceTransformer) – 用于嵌入计算的SentenceTransformer模型
sentences (List[str]) – 字符串列表(文本或句子)
show_progress_bar (bool, optional) – 显示进度条。默认为 False。
batch_size (int, optional) – 模型同时编码的文本数量。默认为 32。
query_chunk_size (int, optional) – 同时搜索 #query_chunk_size 的最相似对。减小此值以降低内存占用(增加运行时间)。默认为 5000。
corpus_chunk_size (int, optional) – 同时将一个句子与 #corpus_chunk_size 个其他句子进行比较。减小此值以降低内存占用(增加运行时间)。默认为 100000。
max_pairs (int, optional) – 返回的最大文本对数量。默认为 500000。
top_k (int, optional) – 对于每个句子,我们检索最多 top_k 个其他句子。默认为 100。
score_function (Callable[[Tensor, Tensor], Tensor], optional) – 用于计算分数的函数。默认使用余弦相似度。默认为 cos_sim。
truncate_dim (int, optional) – 截断句子嵌入的维度。如果为 None,则使用模型的维度。默认为 None。
prompt_name (Optional[str], optional) –
编码句子时使用的预定义提示的名称。它必须与模型 prompts 字典中的键匹配,该字典可以在模型初始化期间设置或从模型配置中加载。
如果提供了 prompt,则忽略此参数。默认为 None。
prompt (Optional[str], optional) –
在编码期间直接添加到输入句子开头的原始提示字符串。
例如,prompt=”query: “ 将句子“法国的首都是什么?”转换为:“query: 法国首都是什么?”。使用此功能完全覆盖提示逻辑并提供您自己的前缀。此参数优先于 prompt_name。默认为 None。
- 返回:
返回一个格式为 [score, id1, id2] 的三元组列表
- 返回类型:
List[List[Union[float, int]]]
为了优化内存和计算时间,复述挖掘是分块进行的,如 query_chunk_size 和 corpus_chunk_size 所指定。具体来说,一次只会比较 query_chunk_size * corpus_chunk_size 对,而不是 len(sentences) * len(sentences)。这更节省时间和内存。此外,paraphrase_mining() 每个块中每个句子只考虑 top_k 个最佳分数。您可以尝试此值作为效率-性能的权衡。
例如,对于每个句子,您将在此脚本中只获得一个最相关的句子。
paraphrases = paraphrase_mining(model, sentences, corpus_chunk_size=len(sentences), top_k=1)
最后一个关键参数是 max_pairs,它确定函数返回的复述对的最大数量。通常,您会获得更少的对,因为列表会清除重复项,例如,如果它包含 (A, B) 和 (B, A),则只返回其中一个。
注意
如果 B 是与 A 最相似的句子,A 不一定是与 B 最相似的句子。因此,返回的列表可能包含 (A, B) 和 (B, C) 等条目。