复述挖掘

复述挖掘的任务是在大型句子语料库中找到复述(含义相同/相似的文本)。在语义文本相似度中,我们看到了在句子列表中查找复述的简化版本。那里介绍的方法使用了暴力方法来评分和排序所有对。

然而,由于这种方法的时间复杂度是平方级的,因此它无法扩展到大型(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, 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: ~typing.Callable[[~torch.Tensor, ~torch.Tensor], ~torch.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: “ 将句子“What is the capital of France?”转换为:“query: What is the capital of France?”。使用此参数可完全覆盖提示逻辑并提供您自己的前缀。此参数优先于 prompt_name。默认为 None。

返回:

返回一个格式为 [分数, id1, id2] 的三元组列表

返回类型:

List[List[Union[float, int]]]

为了优化内存和计算时间,复述挖掘是分块进行的,如由query_chunk_sizecorpus_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 不一定是最相似的句子 for B。因此,返回的列表可能包含 (A, B) 和 (B, C) 这样的条目。