模型简介
模型特点
模型能力
使用案例
语言: 英语
许可证: MIT
标签:
- 关键短语生成
数据集: - midas/inspec
小部件: - 文本: "关键短语提取是文本分析中的一种技术,通过该技术可以从文档中提取重要的关键短语。借助这些关键短语,人们无需完整阅读文本即可快速轻松地理解其内容。最初,关键短语提取主要由人工标注者完成,他们详细阅读文本后记录下最重要的关键短语。缺点是当处理大量文档时,这一过程会耗费大量时间。
此时人工智能便派上了用场。目前,广泛使用基于统计和语言特征的经典机器学习方法进行提取。而借助深度学习,能够比这些传统方法更准确地捕捉文本的语义。传统方法关注文本中词的频率、出现位置及顺序,而神经网络方法能捕捉文本中词语间的长期语义依赖关系和上下文。"
示例标题: "示例1"
- 文本: "本研究中,我们探索如何学习针对特定任务的语言模型,旨在从文本文档中学习关键短语的丰富表示。我们在判别式和生成式两种设置下,对预训练Transformer语言模型(LMs)采用不同的掩码策略进行实验。在判别式设置中,我们提出新的预训练目标——带替换的关键短语边界填充(KBIR),当使用KBIR预训练的LM针对关键短语提取任务进行微调时,相比现有最优方法(SOTA)性能显著提升(F1最高提升9.26分)。在生成式设置中,我们为BART设计了新的预训练方案——KeyBART,它以CatSeq格式生成与输入文本相关的关键短语,而非去噪后的原始输入。这也使得关键短语生成任务的性能超越SOTA(F1@M最高提升4.33分)。此外,我们还在命名实体识别(NER)、问答(QA)、关系抽取(RE)、抽象摘要等任务上微调预训练语言模型,取得了与SOTA相当的结果,表明学习关键短语的丰富表示确实有益于许多其他基础NLP任务。"
示例标题: "示例2"
模型索引: - 名称: DeDeckerThomas/keyphrase-generation-t5-small-inspec
结果:- 任务:
类型: 关键短语生成
名称: 关键短语生成
数据集:
类型: midas/inspec
名称: inspec
指标:- 类型: F1@M (存在)
值: 0.317
名称: F1@M (存在) - 类型: F1@O (存在)
值: 0.279
名称: F1@O (存在) - 类型: F1@M (缺失)
值: 0.073
名称: F1@M (缺失) - 类型: F1@O (缺失)
值: 0.065
名称: F1@O (缺失)
- 类型: F1@M (存在)
- 任务:
🔑 关键短语生成模型:T5-small-inspec
关键短语提取是文本分析中的一种技术,通过该技术可以从文档中提取重要的关键短语。借助这些关键短语,人们无需完整阅读文本即可快速轻松地理解其内容。最初,关键短语提取主要由人工标注者完成,他们详细阅读文本后记录下最重要的关键短语。缺点是当处理大量文档时,这一过程会耗费大量时间⏳。
此时人工智能🤖便派上了用场。目前,广泛使用基于统计和语言特征的经典机器学习方法进行提取。而借助深度学习,能够比这些传统方法更准确地捕捉文本的语义。传统方法关注文本中词的频率、出现位置及顺序,而神经网络方法能捕捉文本中词语间的长期语义依赖关系和上下文。
📓 模型描述
该模型以T5-small模型为基础,并在Inspec数据集上进行了微调。关键短语生成Transformer被微调为文本到文本生成问题,直接生成关键短语。输出结果为用指定分隔符(如“;”)连接所有关键短语的字符串。此类模型能够生成文档中存在的(present)和未出现的(absent)关键短语。
✋ 使用范围与限制
🛑 限制
- 该关键短语生成模型具有极强的领域特异性,在科学论文摘要上表现优异。不建议将其用于其他领域,但欢迎自由测试。
- 仅适用于英文文档。
- 部分生成结果可能不符合逻辑。
❓ 使用方法
# 模型参数
from transformers import (
Text2TextGenerationPipeline,
AutoModelForSeq2SeqLM,
AutoTokenizer,
)
class KeyphraseGenerationPipeline(Text2TextGenerationPipeline):
def __init__(self, model, keyphrase_sep_token=";", *args, **kwargs):
super().__init__(
model=AutoModelForSeq2SeqLM.from_pretrained(model),
tokenizer=AutoTokenizer.from_pretrained(model),
*args,
**kwargs
)
self.keyphrase_sep_token = keyphrase_sep_token
def postprocess(self, model_outputs):
results = super().postprocess(
model_outputs=model_outputs
)
return [[keyphrase.strip() for keyphrase in result.get("generated_text").split(self.keyphrase_sep_token) if keyphrase != ""] for result in results]
# 加载流程
model_name = "ml6team/keyphrase-generation-t5-small-inspec"
generator = KeyphraseGenerationPipeline(model=model_name)
text = """
关键短语提取是文本分析中的一种技术,通过该技术可以从文档中提取重要的关键短语。借助这些关键短语,人们无需完整阅读文本即可快速轻松地理解其内容。最初,关键短语提取主要由人工标注者完成,他们详细阅读文本后记录下最重要的关键短语。缺点是当处理大量文档时,这一过程会耗费大量时间。
此时人工智能便派上了用场。目前,广泛使用基于统计和语言特征的经典机器学习方法进行提取。而借助深度学习,能够比这些传统方法更准确地捕捉文本的语义。传统方法关注文本中词的频率、出现位置及顺序,而神经网络方法能捕捉文本中词语间的长期语义依赖关系和上下文。
""".replace("\n", " ")
keyphrases = generator(text)
print(keyphrases)
# 输出
[['关键短语提取', '文本分析', '人工智能', '经典机器学习方法']]
📚 训练数据集
Inspec是一个关键短语提取/生成数据集,包含2000篇1998至2002年间发表的计算机与控制及信息技术领域的英文科学论文。关键短语由专业索引员或编辑标注。
更多信息可查阅论文。
👷♂️ 训练流程
训练参数
参数 | 值 |
---|---|
学习率 | 5e-5 |
训练轮次 | 50 |
早停耐心值 | 1 |
预处理
数据集中的文档已预处理为单词列表及对应关键短语。仅需进行分词并将所有关键短语用选定分隔符(;
)拼接为字符串。
from datasets import load_dataset
from transformers import AutoTokenizer
# 分词器
tokenizer = AutoTokenizer.from_pretrained("t5-small", add_prefix_space=True)
# 数据集参数
dataset_full_name = "midas/inspec"
dataset_subset = "raw"
dataset_document_column = "document"
keyphrase_sep_token = ";"
def preprocess_keyphrases(text_ids, kp_list):
kp_order_list = []
kp_set = set(kp_list)
text = tokenizer.decode(
text_ids, skip_special_tokens=True, clean_up_tokenization_spaces=True
)
text = text.lower()
for kp in kp_set:
kp = kp.strip()
kp_index = text.find(kp.lower())
kp_order_list.append((kp_index, kp))
kp_order_list.sort()
present_kp, absent_kp = [], []
for kp_index, kp in kp_order_list:
if kp_index < 0:
absent_kp.append(kp)
else:
present_kp.append(kp)
return present_kp, absent_kp
def preprocess_fuction(samples):
processed_samples = {"input_ids": [], "attention_mask": [], "labels": []}
for i, sample in enumerate(samples[dataset_document_column]):
input_text = " ".join(sample)
inputs = tokenizer(
input_text,
padding="max_length",
truncation=True,
)
present_kp, absent_kp = preprocess_keyphrases(
text_ids=inputs["input_ids"],
kp_list=samples["extractive_keyphrases"][i]
+ samples["abstractive_keyphrases"][i],
)
keyphrases = present_kp
keyphrases += absent_kp
target_text = f" {keyphrase_sep_token} ".join(keyphrases)
with tokenizer.as_target_tokenizer():
targets = tokenizer(
target_text, max_length=40, padding="max_length", truncation=True
)
targets["input_ids"] = [
(t if t != tokenizer.pad_token_id else -100)
for t in targets["input_ids"]
]
for key in inputs.keys():
processed_samples[key].append(inputs[key])
processed_samples["labels"].append(targets["input_ids"])
return processed_samples
# 加载数据集
dataset = load_dataset(dataset_full_name, dataset_subset)
# 预处理数据集
tokenized_dataset = dataset.map(preprocess_fuction, batched=True)
后处理
后处理需根据关键短语分隔符拆分字符串。
def extract_keyphrases(examples):
return [example.split(keyphrase_sep_token) for example in examples]
📝 评估结果
传统评估指标为P@k、R@k和F1@k,m,其中k表示前k个预测关键短语,m表示预测关键短语的平均数量。关键短语生成任务还关注F1@O,其中O表示真实关键短语的数量。
模型在Inspec测试集上的表现如下:
提取式关键短语
数据集 | P@5 | R@5 | F1@5 | P@10 | R@10 | F1@10 | P@M | R@M | F1@M | P@O | R@O | F1@O |
---|---|---|---|---|---|---|---|---|---|---|---|---|
Inspec测试集 | 0.33 | 0.31 | 0.29 | 0.17 | 0.31 | 0.20 | 0.41 | 0.31 | 0.32 | 0.28 | 0.28 | 0.28 |
抽象式关键短语
数据集 | P@5 | R@5 | F1@5 | P@10 | R@10 | F1@10 | P@M | R@M | F1@M | P@O | R@O | F1@O |
---|---|---|---|---|---|---|---|---|---|---|---|---|
Inspec测试集 | 0.05 | 0.09 | 0.06 | 0.03 | 0.09 | 0.04 | 0.08 | 0.09 | 0.07 | 0.06 | 0.06 | 0.06 |
🚨 问题反馈
欢迎在社区标签页发起讨论。








