分词

什么是分词

分词(Tokenization)是自然语言处理(NLP)中的一个基本步骤,它涉及将文本数据分解成更小的单元,通常是单词、短语或其他有意义的元素,这些单元被称作“词元”(tokens)。分词的目的是让计算机能够更好地理解和处理文本信息。以下是分词的一些关键点:

  • 文本分解:将文本字符串分解成可单独处理的单元。
  • 语言相关性:分词对于每种语言都是不同的。例如,在英文中,分词通常是通过空格来识别单词的边界;而在中文中,由于没有明显的单词分隔符,分词更为复杂。
  • 词性标注:在分词的基础上,有时还会进行词性标注,即为每个词元指定一个词性(名词、动词、形容词等)。
  • 去除停用词:在分词后,可能会去除停用词(stop words),这些词在语义分析中通常不携带重要信息,如“的”、“和”、“是”。
  • 应用:分词在文本分析、信息检索、机器翻译、情感分析等多个领域都有应用。
  • 算法:分词可以基于不同的算法实现,如基于规则的分词、统计分词、基于深度学习的分词等。
  • 挑战:分词面临的挑战包括处理歧义、识别新词和专有名词、处理多义词等。
  • 工具和库:存在多种分词工具和库,如NLTK、HanLP、jieba等,它们为不同语言的分词提供了强大的支持。

分词是自然语言理解的基石,对于后续的文本分析和处理步骤至关重要。

常用Python分词库

Python 中常用的分词库主要包括以下几种:

jieba(结巴):

支持三种分词模式:精确模式、全模式和搜索引擎模式。
支持繁体分词和自定义词典。
采用基于前缀词典实现高效的词图扫描,生成句子中汉字所有可能成词情况的有向无环图 (DAG),并使用动态规划查找最大概率路径。
对未登录词使用基于汉字成词能力的 HMM 模型和 Viterbi 算法。

HanLP:

功能完善、性能高效、架构清晰、语料时新、可自定义。
在 Python 下通过 hanlp 使用,支持命令行分词。

THULAC(THU Lexical Analyzer for Chinese):

由清华大学自然语言处理与社会人文计算实验室研制的中文词法分析工具包。
能力强大,准确率高,速度快。
支持中文分词和词性标注。

FoolNLTK:

可能不是最快的开源中文分词,但很可能是最准的开源中文分词。
基于 BiLSTM 模型训练而成,包含分词、词性标注、实体识别等。

NLTK (Natural Language Toolkit):

是 Python 中广泛使用的 NLP 库,它也提供了分词功能。

jieba 和 hanlp 区别和对比

Jieba 和 HanLP 都是流行的中文自然语言处理工具,它们在中文分词、词性标注、命名实体识别等方面有着广泛的应用。以下是它们的主要区别和对比:

1.分词速度:

Jieba:Jieba 分词速度快,适合对大量文本进行快速分词处理。
HanLP:HanLP 分词速度相对较慢,但在准确率上可能更胜一筹。

2.分词准确率:

Jieba:Jieba 提供了精确模式、全模式和搜索引擎模式,用户可以根据需要选择不同的分词模式,但在一些复杂句子上可能需要调整词典以提高准确率。
HanLP:HanLP 在分词准确率上表现良好,尤其是在命名实体识别和机构名识别上,由于其丰富的语料库和实体库,准确度较高。

3.功能丰富性:

Jieba:Jieba 主要用于分词,同时也支持词性标注、文本摘要等功能,但功能相对简单。
HanLP:HanLP 提供了更为丰富的功能,包括分词、词性标注、命名实体识别、短语提取、文本分类、关键词提取等。

4.自定义词典:

Jieba:支持用户自定义词典,可以方便地调整分词结果。
HanLP:同样支持自定义词典,并且可以动态增删词库,但添加大量词典数据时速度会变慢。

5.易用性:

Jieba:安装简单,易于上手,适合初学者和快速原型开发。
HanLP:安装和配置相对复杂,但提供了更多的功能和更高的准确性。

6.性能:

Jieba:在处理速度上表现优秀,适合需要快速处理的场景。
HanLP:虽然处理速度较慢,但在一些需要高准确度的场景下,HanLP 的性能更为突出。

jieba的使用(不做练习要求,仅演示)

Jieba 是一个非常流行的中文分词 Python 库,它支持多种分词模式,并且用户可以很容易地根据自己的需求进行定制。以下是 Jieba 的一些基本使用方法:

安装 Jieba

在 Python 环境中安装 Jieba 非常简单,可以通过 pip 命令安装:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple  jieba

基本使用

安装完成后,可以通过以下方式在 Python 代码中使用 Jieba:

1. 精确模式分词

精确模式会将句子最精确地切分开,适合文本分析:

import jieba

text = "我来到北京清华大学"
jieba.cut(text, cut_all=False)

2. 全模式分词

全模式会将句子中所有可能成词的词语都扫描出来,速度非常快,但是可能存在冗余:

jieba.cut(text, cut_all=True)

3. 添加自定义词典

有时候 Jieba 的默认词典可能不符合我们的需求,这时候可以添加自定义词典来提高准确率:

jieba.load_userdict("userdict.txt")

通过这些基本的使用方法,你可以开始使用 Jieba 进行中文文本处理了。Jieba 的强大之处在于它的灵活性和易用性,无论是简单的分词任务还是更复杂的 NLP 应用,Jieba 都能提供很好的支持。

评价

  1. 速度快
  2. 简单
  3. 不准确!

hanlp的使用

参见这个网站:https://hanlp.hankcs.com/
hanlp有多个版本,见下图

image-5.png

考虑到性能,我们此次选择“本地精简版”。

当然“本地完整版”效果肯定最好,但是太大了,且机器性能不一定跑得动。
RESTful版肯定效果也好,本质是远程服务器进行运算,但要钱。

虽然是本地精简版,但整个包也不小。。
建议使用vscode的虚拟环境。

安装并引入库

安装本地精简版

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple  hanlp

使用本地本地精简版

import hanlp

加载预训练模型

什么是模型

在自然语言处理(NLP)领域,模型通常指的是经过训练的机器学习算法,它们能够执行特定的任务,比如文本分类、情感分析、机器翻译、分词等。

模型的来源:

  • 研究与开发:NLP模型通常由研究机构、大学或公司中的研究人员开发。他们基于最新的研究成果,设计并实现模型。
  • 数据训练:模型需要大量的标注数据进行训练。例如,分词模型需要训练数据集,其中包含了句子及其正确的分词结果。
  • 预训练与微调:许多模型采用预训练加微调的方式。预训练模型在大规模数据集上训练,学习通用的语言表示,然后针对特定任务进行微调。
  • 开源共享:很多NLP模型会开源,使得研究者和开发者可以下载并使用这些模型,或者基于它们进行二次开发。
    模型的作用:
  • 文本理解:模型可以帮助计算机理解文本的含义,包括语法、句法和语义。
  • 信息提取:从文本中提取有用的信息,如命名实体识别(NER)、关键词提取等。
  • 辅助决策:通过分析文本数据,模型可以辅助做出决策,如情感分析、文本分类等。

hanlp自带以下预训练模型:

  • 'SIGHAN2005_PKU_CONVSEG': 'https://file.hankcs.com/hanlp/tok/sighan2005-pku-convseg_20200110_153722.zip',
  • 'SIGHAN2005_MSR_CONVSEG': 'https://file.hankcs.com/hanlp/tok/convseg-msr-nocrf-noembed_20200110_153524.zip',
  • 'CTB6_CONVSEG': 'https://file.hankcs.com/hanlp/tok/ctb6_convseg_nowe_nocrf_20200110_004046.zip',
  • 'PKU_NAME_MERGED_SIX_MONTHS_CONVSEG': 'https://file.hankcs.com/hanlp/tok/pku98_6m_conv_ngram_20200110_134736.zip',
  • 'LARGE_ALBERT_BASE': 'https://file.hankcs.com/hanlp/tok/large_corpus_cws_albert_base_20211228_160926.zip',
  • 'SIGHAN2005_PKU_BERT_BASE_ZH': 'https://file.hankcs.com/hanlp/tok/sighan2005_pku_bert_base_zh_20201231_141130.zip',
  • 'COARSE_ELECTRA_SMALL_ZH': 'https://file.hankcs.com/hanlp/tok/coarse_electra_small_20220616_012050.zip',
  • 'FINE_ELECTRA_SMALL_ZH': 'https://file.hankcs.com/hanlp/tok/fine_electra_small_20220615_231803.zip',
  • 'CTB9_TOK_ELECTRA_SMALL': 'https://file.hankcs.com/hanlp/tok/ctb9_electra_small_20220215_205427.zip',
  • 'CTB9_TOK_ELECTRA_BASE': 'http://download.hanlp.com/tok/extra/ctb9_tok_electra_base_20220426_111949.zip',
  • 'CTB9_TOK_ELECTRA_BASE_CRF': 'http://download.hanlp.com/tok/extra/ctb9_tok_electra_base_crf_20220426_161255.zip',
  • 'MSR_TOK_ELECTRA_BASE_CRF': 'http://download.hanlp.com/tok/extra/msra_crf_electra_base_20220507_113936.zip',
  • 'UD_TOK_MMINILMV2L6': 'https://file.hankcs.com/hanlp/tok/ud_tok_mMiniLMv2L6_no_space_mul_20220619_091824.zip',
  • 'UD_TOK_MMINILMV2L12': 'https://file.hankcs.com/hanlp/tok/ud_tok_mMiniLMv2L12_no_space_mul_20220619_091159.zip'

其中,大部分模型精简版是无法使用的。需要完整版。
以下实验我们可以使用:

  • COARSE_ELECTRA_SMALL_ZH
  • FINE_ELECTRA_SMALL_ZH
    这两个模型

COARSE_ELECTRA_SMALL_ZH模型解释

以COARSE_ELECTRA_SMALL_ZH为例:

COARSE 分词

在中文处理中,分词通常有两种粒度:粗粒度(coarse)和细粒度(fine)。
粗粒度分词通常指的是将句子分割成较为宽泛的词或短语,而细粒度分词则更细致,会将词进一步拆分为更小的词或词组。粗粒度分词在某些情况下可能更适合,因为它可以减少分词错误,尤其是在面对歧义或未知词时。

Electra 模型

Electra(Efficiently Learning an Encoder that Classifies Token of the Right Type)是一种预训练的变换器(Transformer)模型,由Google Research提出。它旨在解决BERT(Bidirectional Encoder Representations from Transformers)模型的一些限制,特别是在效率和训练成本方面。Electra模型通过一个称为“掩码语言模型”(Masked Language Model,MLM)的预训练任务来训练,该任务要求模型从给定的文本中预测出被随机掩盖的单词。

SMALL小模型

在模型的名称中,"SMALL" 通常表示这是一个较小的模型版本。在NLP中,模型的大小(即模型的参数数量)会影响其性能和效率。较小的模型可能在参数数量、计算资源需求和训练时间上都有所减少,但同时也可能在性能上有所折损。小模型更适合于资源受限的环境或需要快速部署的场景。

综合以上,COARSE_ELECTRA_SMALL_ZH 是一个预训练模型,意味着它已经在大量的文本数据上进行了训练,以便学习中文语言的通用特征。用户可以直接使用这个预训练模型,而不需要从头开始训练自己的模型,这大大节省了时间和计算资源。
来源:这个模型可能是由HanLP的开发者或者社区基于Google的Electra模型进行修改和优化,以适应中文的粗粒度分词任务。
作用:该模型的主要作用是对中文文本进行分词。

import hanlp
tok = hanlp.load(hanlp.pretrained.tok.COARSE_ELECTRA_SMALL_ZH)

以上表示加载hanlp.pretrained.tok.COARSE_ELECTRA_SMALL_ZH这个模型,需要下载。但是在首次执行时,会自动下载。

简单分词测试

import hanlp
tok = hanlp.load(hanlp.pretrained.tok.COARSE_ELECTRA_SMALL_ZH)
r=tok("你好,我是现代职业技术学校学生")
print(r)

tok()中,放需要分词内容

结果为:

['你好', ',', '我', '是', '现代职业技术学校', '学生']

可见,效果良好。