器→工具, 开源项目

开源的中文NLP大模型

钱魏Way · · 10 次浏览

Hugging Face上,有多个模型适合用于对中文文本的迷信。这些模型通常被预训练在大规模的中文语料上,因此它们能够有效地理解和处理中文文本。以下是一些推荐的模型:

bert-base-chinese

bert-base-chinese 是一个预训练的语言模型,基于 BERT (Bidirectional Encoder Representations from Transformers) 架构。BERT 是由 Google 在 2018 年提出的一种新型转换器模型(Transformer),它通过大量的文本数据进行预训练,学习语言的深层次表示。这里的“base”指的是模型的规模,相对于更大的“large”模型,它的参数更少,因此计算成本更低,但效果仍然非常出色。

主要特点:

  • 中文处理:bert-base-chinese 特别针对中文数据进行了优化。它在大量中文文本上进行预训练,因此非常适合处理中文NLP任务。
  • 双向转换器模型:与之前的模型相比,BERT的关键创新是使用双向Transformer。这意味着它在理解每个词时考虑了上下文中的所有词,而不仅仅是之前或之后的词。
  • 预训练任务:BERT通过两种主要的预训练任务来学习语言:掩码语言模型(Masked Language Model, MLM)和下一个句子预测(Next Sentence Prediction, NSP)。MLM随机掩盖输入句子中的一些词,然后模型必须预测这些词;NSP则是预测给定的两个句子是否在原始文本中相邻。
  • 通用性:BERT模型被设计为可以应用于广泛的NLP任务,例如文本分类、情感分析、命名实体识别、问题回答等,而无需对模型架构进行大的改动。

使用场景:

  • 由于bert-base-chinese是在中文文本上预训练的,因此它特别适合中文语言理解任务。
  • 它可以用于各种NLP应用,包括但不限于情感分析、文本分类、命名实体识别、机器翻译等。
  • 它通常作为NLP任务的起点,通过在特定任务上的进一步微调来优化性能。

总之,bert-base-chinese是一个强大且灵活的工具,适用于处理各种中文NLP任务。由于其预训练的特性,它可以在没有大量任务特定数据的情况下提供出色的性能。

bert-base-chinese的使用:

import numpy as np
import pandas as pd
from transformers import AutoTokenizer, AutoModelForMaskedLM
import torch
from tqdm import tqdm

# 加载模型和分词器
tokenizer = AutoTokenizer.from_pretrained("bert-base-chinese")
model = AutoModelForMaskedLM.from_pretrained("bert-base-chinese")


# 函数:使用BERT模型提取文本特征
def extract_features(texts, model, tokenizer):
    model.eval()  # 将模型设置为评估模式
    features = []

    for text in tqdm(texts, desc="Extracting features"):
        inputs = tokenizer(text, return_tensors="pt", padding=True, truncation=True, max_length=512)
        with torch.no_grad():
            outputs = model(**inputs)
        # 获取模型输出的隐藏状态
        hidden_states = outputs[0]  # 通常是元组的第一个元素
        # 计算平均隐藏状态
        mean_hidden_states = hidden_states.mean(dim=1)
        features.append(mean_hidden_states)

    return torch.cat(features, dim=0)


if __name__ == '__main__':
    df = pd.read_csv("data/text.csv")
    texts = df['text'].to_list()
    features = extract_features(texts, model, tokenizer)
    np.save('data/features.npy', features.numpy())

使用bert-base-chinese前不需要分词

使用bert-base-chinese模型时,通常不需要对中文进行传统意义上的分词操作。这是因为BERT模型(包括bert-base-chinese)采用的是一种称为字级(Character-level)的处理方式,而不是传统的词级(Word-level)分词。

字级处理的特点:

  • 每个汉字为单位:在中文BERT模型中,每个汉字都被视为一个独立的单位。这意味着模型直接处理文本中的每个字符,而不是将它们组合成词。
  • 使用特殊的标记符:BERT模型使用特殊的标记符(如[CLS]、[SEP]等)来处理输入文本,这些标记符帮助模型理解文本的结构。
  • 上下文敏感:BERT的一个关键特性是其对上下文的敏感性。即使是同一个字,在不同的上下文中可以有不同的含义,BERT模型能够捕捉这种差异。

为什么不需要传统分词:

  • 模型的预训练过程:在预训练阶段,bert-base-chinese已经学习了大量的中文文本,它已经对单个汉字以及它们在不同上下文中的含义有了深入的理解。
  • 更好地处理歧义:传统分词可能因为分词错误而导致意义理解的偏差。字级处理避免了这种风险,模型可以在更细的粒度上学习和理解文本。
  • 适应性更强:对于一些新词或者网络用语,传统分词可能无法正确分割,而字级处理则没有这个问题。

因此,在使用bert-base-chinese进行中文NLP任务时,通常不需要单独进行分词处理,模型已经具备处理原始文本的能力。在上述代码示例中,BertTokenizer直接处理原始文本,将其转换为模型可以理解的格式,而无需额外的分词步骤。

使用bert-base-chinese前不需要去除停用词

使用bert-base-chinese前是否需要去除停用词,这取决于具体的任务和目标。在大多数情况下,对于基于BERT的模型,不需要去除停用词。这与传统的文本处理方法有所不同,原因如下:

  • 上下文理解能力。BERT及其变体通过预训练学习了大量的语言上下文信息。这意味着模型能够理解每个词在具体上下文中的含义,包括那些通常被视为停用词的词汇。在很多情况下,这些词汇对于理解句子的整体含义是有帮助的。
  • 完整性保留。保留停用词可以保持句子的完整性,这对于BERT模型捕捉句子结构和语义是有利的。去除停用词可能会破坏句子的原始结构,从而影响模型理解句子的能力。
  • 微调和任务特定性。BERT模型在预训练阶段并没有去除停用词,因此它在理解包含停用词的句子方面已经进行了优化。在微调阶段,保持输入数据的格式与预训练阶段一致,有助于模型更好地理解和处理特定任务的数据。
  • 特定任务的考虑。尽管在大多数情况下不需要去除停用词,但也有一些特定的场景或任务可能会从去除停用词中受益。例如,在一些需要高度文本精简的任务中(如关键词提取),去除停用词可能会有所帮助。因此,是否去除停用词应根据任务的具体需求和目标来决定。

如果涉及到的模型无法下载,请参考:Hugging Face模型无法下载解决方案

针对以上代码的还可以使用GPU进行加速。具体代码为:

import numpy as np
import pandas as pd
from transformers import AutoTokenizer, AutoModelForMaskedLM
import torch
from tqdm import tqdm

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(f"Using device: {device}")

# 加载模型和分词器
tokenizer = AutoTokenizer.from_pretrained("bert-base-chinese")
model = AutoModelForMaskedLM.from_pretrained("bert-base-chinese").to(device)


# 函数:使用BERT模型提取文本特征
def extract_features(texts, model, tokenizer, device):
    model.eval()  # 将模型设置为评估模式
    features = []

    for text in tqdm(texts, desc="Extracting features"):
        # 确保输入数据也在GPU上
        inputs = tokenizer(text, return_tensors="pt", padding=True, truncation=True, max_length=512).to(device)
        with torch.no_grad():
            outputs = model(**inputs)
        # 获取模型输出的隐藏状态
        hidden_states = outputs[0]  # 通常是元组的第一个元素
        # 计算平均隐藏状态并转移到CPU
        mean_hidden_states = hidden_states.mean(dim=1).cpu()
        features.append(mean_hidden_states)

    return torch.cat(features, dim=0)


if __name__ == '__main__':
    df = pd.read_csv("data/text.csv")
    texts = df['text'].to_list()
    features = extract_features(texts, model, tokenizer, device)
    np.save('data/features.npy', features.numpy())

ERNIE

ERNIE(Enhanced Representation through kNowledge Integration)是一种先进的自然语言处理(NLP)预训练模型。它由百度研究院开发,旨在通过融合知识图谱和语言理解,提升语言模型的表现。ERNIE 在处理语言理解任务时,展现出了比传统的BERT模型更优异的性能。

主要特点:

  • 知识图谱整合:ERNIE的一个关键创新是将外部知识(如知识图谱)整合进模型中。这使得模型能够更好地理解和表达与特定实体相关的复杂语义信息。
  • 多种预训练任务:与BERT相比,ERNIE采用了多种预训练任务,包括词级、短语级和句子级任务。这种多层次的预训练方法有助于捕捉更丰富的语言信息。
  • 更好的语义理解:通过整合知识图谱和多种预训练任务,ERNIE在许多NLP任务上,如语义理解、语义相似度计算、情感分析等方面表现出了更好的效果。
  • 面向不同语言和任务的版本:百度发布了多个ERNIE的版本,针对不同的语言(如中文和英文)和不同的应用场景。
    • ERNIE 3.0-XBase (20-layer, 1024-hidden, 16-heads)
    • ERNIE 3.0-Base (12-layer, 768-hidden, 12-heads)
    • ERNIE 3.0-Medium (6-layer, 768-hidden, 12-heads)
    • ERNIE 3.0-Mini (6-layer, 384-hidden, 12-heads)
    • ERNIE 3.0-Micro (4-layer, 384-hidden, 12-heads)
    • ERNIE 3.0-Nano (4-layer, 312-hidden, 12-heads)

使用场景:

  • 文本分类:ERNIE可以用于对文本进行分类,如新闻分类、评论情感分析等。
  • 问答系统:利用其强大的语义理解能力,ERNIE适用于构建问答系统。
  • 语义相似度计算:ERNIE能够准确计算句子之间的语义相似度,适用于相关性分析和推荐系统。
  • 命名实体识别:ERNIE的知识图谱整合能力使其在识别特定实体(如人名、地点、组织名)方面表现出色。

总而言之,ERNIE是一个功能强大的NLP工具,它通过融合外部知识和采用多层次的预训练方法,在许多语言处理任务中都显示出了卓越的性能。尤其在处理需要复杂语义理解的任务时,ERNIE相较于传统模型提供了显著的优势。

# 加载模型和分词器
from transformers import BertTokenizer, ErnieForMaskedLM

tokenizer = BertTokenizer.from_pretrained("nghuyong/ernie-3.0-base-zh")
model = ErnieForMaskedLM.from_pretrained("nghuyong/ernie-3.0-base-zh")

chinese-roberta-wwm-ext

chinese-roberta-wwm-ext是由哈尔滨工业大学和华为诺亚方舟实验室开发的RoBERTa模型的中文版本。是一个预训练的语言表示模型,专门针对中文文本设计。这个模型是基于 BERT(Bidirectional Encoder Representations from Transformers)架构的一种变体,由哈工大和华为诺亚方舟实验室共同研发。它在原始的 BERT 模型基础上进行了优化和改进,特别是在处理中文文本方面。

主要特点:

  • 全词遮蔽(Whole Word Masking, WWM):与标准BERT模型不同,chinese-roberta-wwm-ext 使用全词遮蔽策略。在中文处理中,这意味着遮蔽发生在整个词上,而不仅仅是单个字符。这有助于模型更好地理解词语的边界和含义。
  • 扩展训练数据:模型名称中的“ext”代表扩展(extended)。这意味着在预训练过程中,模型使用了比标准BERT更大的数据集,从而提高了模型的泛化能力和准确性。
  • 针对中文优化:该模型专门针对中文语境进行优化,能够更有效地处理中文语言的特点,如成语、复合词等。
  • 适用于各种中文NLP任务:chinese-roberta-wwm-ext 可用于各种中文自然语言处理任务,如文本分类、情感分析、命名实体识别等。

使用场景:

  • 文本分类:该模型能够有效地对中文文本进行分类,例如新闻分类、评论情感分析等。
  • 情感分析:利用其对中文的深入理解,可用于分析用户评论、社交媒体帖子等的情感倾向。
  • 命名实体识别:在识别中文文本中的特定实体(如人名、地点、组织名)方面表现良好。
  • 问答系统:可以用于构建针对中文用户的问答系统,提供准确的答案。

chinese-roberta-wwm-ext 通过全词遮蔽和扩展的训练数据,为中文自然语言处理任务提供了强大的语言表示能力。它在多种中文NLP任务中都能发挥出色的性能,是处理中文文本的一个有效工具。

# Load model directly
from transformers import AutoTokenizer, AutoModelForMaskedLM

tokenizer = AutoTokenizer.from_pretrained("hfl/chinese-roberta-wwm-ext")
model = AutoModelForMaskedLM.from_pretrained("hfl/chinese-roberta-wwm-ext")

chinese-bert-wwm由哈工大和华为联合开发,这个模型也采用全词遮蔽策略,对中文文本有很好的处理效果。chinese-bert-wwm,即“Chinese BERT with Whole Word Masking”,是一种专门为中文设计的预训练语言模型。这个模型基于BERT(Bidirectional Encoder Representations from Transformers)架构,但引入了针对中文特有的全词遮蔽(Whole Word Masking, WWM)技术。这种技术是在BERT模型的基础上进一步优化以更好地处理中文文本的特性。

主要特点:

  • 全词遮蔽(WWM):在中文中,一个词通常由多个字符组成。全词遮蔽技术意味着在预训练过程中,模型会将整个词作为一个单元进行遮蔽,而不是单独遮蔽每个字符。这有助于模型更好地理解中文词汇的结构和意义。
  • 针对中文优化:chinese-bert-wwm 在处理中文时表现更优,因为它更好地考虑了中文的语言特点,如词的边界、成语和复合词的处理。
  • 适用于多种中文NLP任务:类似于其他BERT变体,chinese-bert-wwm 可以用于多种中文自然语言处理任务,包括但不限于文本分类、情感分析、命名实体识别、问答系统等。

使用场景:

  • 文本分类:这个模型能有效地对中文文本进行分类,例如新闻分类、评论情感分析等。
  • 情感分析:凭借其对中文深入的理解能力,它可以用于分析例如用户评论、社交媒体帖子的情感倾向。
  • 命名实体识别:在识别中文文本中的特定实体(如人名、地点、组织名)方面表现良好。
  • 问答系统:可用于构建中文问答系统,提供准确的答案。

总体而言,chinese-bert-wwm 通过其全词遮蔽技术,为中文文本处理提供了一个强大的预训练模型。它在多种中文NLP任务中都能表现出色,是处理中文文本的有效工具。

# Load model directly
from transformers import AutoTokenizer, AutoModelForMaskedLM
.
.
tokenizer = AutoTokenizer.from_pretrained("hfl/chinese-bert-wwm")
model = AutoModelForMaskedLM.from_pretrained("hfl/chinese-bert-wwm")

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注