• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

分词工具和方法jieba、spaCy等

武飞扬头像
PyTechShare
帮助1

分词是自然语言处理中的一项重要任务,将一段文本划分成一系列有意义的词语或单词,是很多文本处理任务的基础,如文本分类、情感分析、机器翻译等。在中文分词中,jieba是一个常用的分词工具,而在英文分词中,spaCy是一个较为流行的选择。本文将介绍jieba和spaCy的使用方法和原理。

1. jieba分词

jieba是一个优秀的中文分词工具,其主要特点是支持三种分词模式:精确模式、全模式和搜索模式。同时,jieba还提供了用户自定义字典和并行分词等功能,适用于不同的中文文本处理任务。

1.1 安装

使用pip命令即可安装jieba:

pip install jieba

1.2 精确模式

精确模式是jieba默认的分词模式,它将文本按照最大概率分成词语。使用方法如下:

import jieba

text = "我们在学习自然语言处理。"
words = jieba.cut(text)
print(list(words))

输出结果为:

['我们', '在', '学习', '自然语言处理', '。']

1.3 全模式

全模式将文本中所有可能的词语都分出来,速度较快,但是会产生一些冗余的词语。使用方法如下:

import jieba

text = "我们在学习自然语言处理。"
words = jieba.cut(text, cut_all=True)
print(list(words))

输出结果为:

['我们', '在', '学习', '自然', '自然语言', '语言', '处理', '']

1.4 搜索模式

搜索模式将文本中所有可能的词语都扫描出来,有利于搜索引擎等应用。使用方法如下:

import jieba

text = "我们在学习自然语言处理。"
words = jieba.cut_for_search(text)
print(list(words))

输出结果为:

['我们', '在', '学习', '自然', '语言', '自然语言', '处理', '语言处理', '。']

2. 用户自定义字典

虽然分词工具都预先加载了大量的词库,但有时候我们可能需要加入一些特定的词汇,比如产品名、人名、地名、行业术语等。这时候,就需要使用用户自定义字典了。jieba和spaCy都支持用户自定义字典。

jieba的用户自定义字典是一个文本文件,每行一条记录,格式为:词汇 词频 词性(可选)。其中,词频和词性是可选的,如果不指定,jieba会自动计算词频并使用默认词性。下面是一个例子:

阿里巴巴 5 nr
华为 3 nz

以上例子表示将“阿里巴巴”和“华为”作为词汇加入到分词器的词库中,并指定它们的词频和词性。将自定义字典文件加载到jieba分词器中的代码如下:

import jieba

jieba.load_userdict('my_dict.txt')

spaCy的用户自定义字典是一个Python文件,其中定义了一个字典对象。字典的键是词汇,值是一个字典对象,其中包含了该词汇的属性信息。下面是一个例子:

my_dict = {
    "阿里巴巴": {"pos": "PROPN"},
    "华为": {"pos": "PROPN"}
}

以上例子表示将“阿里巴巴”和“华为”作为词汇加入到分词器的词库中,并指定它们的词性为专有名词。将自定义字典加载到spaCy分词器中的代码如下:

import spacy

nlp = spacy.load('en_core_web_sm')

from spacy.tokens import Doc

Doc.set_extension('my_dict', default={})

nlp.vocab['阿里巴巴'].is_stop = True
nlp.vocab['阿里巴巴'].my_dict = {'pos': 'PROPN'}
nlp.vocab['华为'].is_stop = True
nlp.vocab['华为'].my_dict = {'pos': 'PROPN'}

3. 分词效果评估

分词效果的好坏对于自然语言处理任务的成功与否有着至关重要的影响。因此,在使用分词工具时,我们需要对分词效果进行评估。

分词效果评估通常使用准确率(Precision)、召回率(Recall)和F1值(F1-Score)这三个指标来衡量。其中,准确率表示正确分词的数量与分词器分出的总词数之比;召回率表示正确分词的数量与参考标准中的总词数之比;F1值是准确率和召回率的调和平均数。

3.1 准确率(Accuracy)

准确率是最简单和最直观的评估指标。它表示分词器正确切分出的单词数占所有单词数的比例。

A c c u r a c y = C o r r e c t T o t a l Accuracy = \frac{Correct}{Total} Accuracy=TotalCorrect

其中, C o r r e c t Correct Correct 表示分词器正确切分出的单词数, T o t a l Total Total 表示总的单词数。

3.2 召回率(Recall)

召回率是指标示正确的单词数量占总单词数量的比例。它衡量的是模型发现的所有正确答案的数量。

R e c a l l = C o r r e c t R e f e r e n c e Recall = \frac{Correct}{Reference} Recall=ReferenceCorrect

其中, C o r r e c t Correct Correct 表示分词器正确切分出的单词数, R e f e r e n c e Reference Reference 表示正确答案的单词数。

3.3 精度(Precision)

精度是指正确的单词数量占分词器预测单词数量的比例。它衡量的是模型的预测是否准确。

P r e c i s i o n = C o r r e c t P r e d i c t e d Precision = \frac{Correct}{Predicted} Precision=PredictedCorrect

其中, C o r r e c t Correct Correct 表示分词器正确切分出的单词数, P r e d i c t e d Predicted Predicted 表示分词器预测出的单词数。

3.4 F1-Score

F1-Score 是精度和召回率的调和平均数,可以综合反映模型的预测能力和发现正确答案的能力。

F 1 − S c o r e = 2 × P r e c i s i o n × R e c a l l P r e c i s i o n R e c a l l F1-Score = 2 \times \frac{Precision \times Recall}{Precision Recall} F1Score=2×Precision RecallPrecision×Recall

可以使用 Python 中的 sklearn 库来计算这些指标。下面是一个示例代码:

from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score

# 分词器预测结果
pred_tokens = ['这', '是', '一个', '句子', '。']
# 正确答案
true_tokens = ['这', '是', '一个', '句子', '。']

# 计算准确率
accuracy = accuracy_score(true_tokens, pred_tokens)
# 计算精度
precision = precision_score(true_tokens, pred_tokens, average='macro')
# 计算召回率
recall = recall_score(true_tokens, pred_tokens, average='macro')
# 计算 F1-Score
f1 = f1_score(true_tokens, pred_tokens, average='macro')

print('Accuracy:', accuracy)
print('Precision:', precision)
print('Recall:', recall)
print('F1-Score:', f1)
学新通

4. spaCy分词

spaCy是一种比jieba更为先进的自然语言处理工具,其分词效果更加准确且支持多种语言。同样地,spaCy也有其自带的词库,但是我们也可以添加自定义的词汇。

安装spaCy:

pip install spacy

安装中文模型:

pip install spacy-legacy-thinc
python -m spacy download zh_core_web_sm

加载中文模型:

import spacy

nlp = spacy.load("zh_core_web_sm")

使用spaCy分词:

doc = nlp("这是一个测试句子")

for token in doc:
    print(token.text)

输出结果:

这
是
一个
测试
句子

与jieba类似,spaCy也提供了分词效果的评估工具。我们可以通过比较文本的真实分词结果和工具的分词结果,计算得到各种指标,如精确率、召回率、F1值等。

from spacy.scorer import Scorer
from spacy.gold import GoldParse

text = "我喜欢自然语言处理"
doc = nlp(text)
gold = GoldParse(doc, words=["我", "喜欢", "自然语言处理"])

scorer = Scorer()
scorer.score(doc, gold)

print(scorer.scores)

输出结果:

{'uas': 0.0, 'las': 0.0, 'las_per_type': {'': {'p': 0.0, 'r': 0.0, 'f': 0.0}}, 'tags_acc': 0.0, 'token_acc': 0.0, 'textcat_score': 0.0}

其中,uaslas分别代表无标签和有标签的依存关系准确率(Unlabeled Attachment Score和Labeled Attachment Score),tags_acc代表词性标注准确率,token_acc代表分词准确率,textcat_score代表文本分类准确率。

spaCy除了分词外还有一些其他的功能,如词性标注、实体识别、依存关系分析等。在实际应用中,我们可以将其与其他机器学习模型结合起来,完成更复杂的自然语言处理任务。

参考文献:

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhggecei
系列文章
更多 icon
同类精品
更多 icon
继续加载