在自然语言处理(NLP)领域,将中文文本转化为数字的主流方法主要集中在预训练语言模型和子词编码技术上。这些方法能够更好地捕捉语义信息,并且在各种NLP任务中表现出色。以下是目前主流的文本编码方法:
1. 基于预训练语言模型的编码方法
预训练语言模型通过大规模语料库进行训练,能够生成高质量的文本表示。以下是几种主流的预训练模型:
1.1 BERT(Bidirectional Encoder Representations from Transformers)
-
特点:BERT 是一种双向 Transformer 模型,能够捕捉上下文信息。
-
应用场景:文本分类、命名实体识别、问答系统等。
-
使用方法:
from transformers import BertTokenizer, BertModel import torch# 加载预训练模型和分词器 tokenizer = BertTokenizer.from_pretrained("bert-base-chinese") model = BertModel.from_pretrained("bert-base-chinese")# 输入文本 text = "我爱北京天安门" inputs = tokenizer(text, return_tensors="pt")# 获取文本表示 outputs = model(**inputs) last_hidden_states = outputs.last_hidden_state print(last_hidden_states)
1.2 GPT(Generative Pre-trained Transformer)
-
特点:GPT 是一种单向 Transformer 模型,适合生成任务。
-
应用场景:文本生成、对话系统、摘要生成等。
-
使用方法:
from transformers import GPT2Tokenizer, GPT2Model import torch# 加载预训练模型和分词器 tokenizer = GPT2Tokenizer.from_pretrained("gpt2") model = GPT2Model.from_pretrained("gpt2")# 输入文本 text = "我爱北京天安门" inputs = tokenizer(text, return_tensors="pt")# 获取文本表示 outputs = model(**inputs) last_hidden_states = outputs.last_hidden_state print(last_hidden_states)
1.3 RoBERTa
-
特点:RoBERTa 是 BERT 的改进版本,通过更大的数据集和更长的训练时间优化性能。
-
应用场景:与 BERT 类似,但性能更好。
-
使用方法:
from transformers import RobertaTokenizer, RobertaModel import torch# 加载预训练模型和分词器 tokenizer = RobertaTokenizer.from_pretrained("roberta-base") model = RobertaModel.from_pretrained("roberta-base")# 输入文本 text = "我爱北京天安门" inputs = tokenizer(text, return_tensors="pt")# 获取文本表示 outputs = model(**inputs) last_hidden_states = outputs.last_hidden_state print(last_hidden_states)
1.4 ERNIE(Enhanced Representation through kNowledge Integration)
-
特点:ERNIE 是百度推出的预训练模型,专门针对中文优化,融合了知识图谱信息。
-
应用场景:中文文本理解、问答系统等。
-
使用方法:
from transformers import BertTokenizer, BertModel import torch# 加载ERNIE模型(基于BERT架构) tokenizer = BertTokenizer.from_pretrained("nghuyong/ernie-1.0") model = BertModel.from_pretrained("nghuyong/ernie-1.0")# 输入文本 text = "我爱北京天安门" inputs = tokenizer(text, return_tensors="pt")# 获取文本表示 outputs = model(**inputs) last_hidden_states = outputs.last_hidden_state print(last_hidden_states)
2. 子词编码(Subword Tokenization)
子词编码是一种将单词分解为更小子词单元的技术,能够有效处理未登录词(OOV)问题。
2.1 Byte Pair Encoding (BPE)
-
特点:通过合并高频子词对来构建词汇表。
-
应用场景:GPT、BERT 等模型的分词基础。
-
工具:
-
Hugging Face Transformers:支持 BPE 分词。
-
SentencePiece:独立的子词分词工具。
-
使用 SentencePiece:
import sentencepiece as spm# 加载预训练模型
sp = spm.SentencePieceProcessor()
sp.load("model.spm")# 分词和编码
text = "我爱北京天安门"
tokens = sp.encode_as_pieces(text)
ids = sp.encode_as_ids(text)
print(tokens) # ['▁我', '爱', '北京', '天安门']
print(ids) # [123, 456, 789, 1011]
2.2 WordPiece
-
特点:BERT 使用的分词方法,基于概率选择子词。
-
应用场景:BERT 及其变体模型。
-
工具:
-
Hugging Face Transformers:支持 WordPiece 分词。
-
使用 BERT 的 WordPiece:
from transformers import BertTokenizertokenizer = BertTokenizer.from_pretrained("bert-base-chinese")
text = "我爱北京天安门"
tokens = tokenizer.tokenize(text)
ids = tokenizer.convert_tokens_to_ids(tokens)
print(tokens) # ['我', '爱', '北', '京', '天', '安', '门']
print(ids) # [2769, 4263, 1266, 776, 1921, 2110, 730]
3. 传统方法
虽然预训练模型和子词编码是主流,但传统方法在某些场景下仍然有用。
3.1 词袋模型(Bag of Words, BoW)
-
特点:简单高效,但无法捕捉语义信息。
-
工具:
-
Scikit-learn:
CountVectorizer
。
-
示例:
from sklearn.feature_extraction.text import CountVectorizercorpus = ["我爱北京天安门", "天安门上太阳升"]
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(corpus)
print(X.toarray())
print(vectorizer.get_feature_names_out())
3.2 TF-IDF
-
特点:考虑词频和逆文档频率,适合文本分类。
-
工具:
-
Scikit-learn:
TfidfVectorizer
。
-
示例:
from sklearn.feature_extraction.text import TfidfVectorizercorpus = ["我爱北京天安门", "天安门上太阳升"]
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(corpus)
print(X.toarray())
print(vectorizer.get_feature_names_out())
4. 总结
目前主流的中文文本编码方法主要集中在以下两类:
-
预训练语言模型(如 BERT、GPT、ERNIE 等):能够捕捉上下文语义,适合复杂的 NLP 任务。
-
子词编码(如 BPE、WordPiece):有效处理未登录词,适合分词和编码。
传统方法(如词袋模型、TF-IDF)虽然简单,但在深度学习时代逐渐被淘汰,仅适用于简单的任务或小规模数据集。
根据任务需求选择合适的编码方法:
-
如果需要高质量的语义表示,优先选择预训练语言模型。
-
如果需要处理未登录词或分词问题,优先选择子词编码技术。
备注:huggingface访问不了问题可以使用国内镜像:HF-Mirror