赞
踩
分词是自然语言处理中的一项重要任务,将一段文本划分成一系列有意义的词语或单词,是很多文本处理任务的基础,如文本分类、情感分析、机器翻译等。在中文分词中,jieba是一个常用的分词工具,而在英文分词中,spaCy是一个较为流行的选择。本文将介绍jieba和spaCy的使用方法和原理。
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))
输出结果为:
['我们', '在', '学习', '自然', '语言', '自然语言', '处理', '语言处理', '。']
虽然分词工具都预先加载了大量的词库,但有时候我们可能需要加入一些特定的词汇,比如产品名、人名、地名、行业术语等。这时候,就需要使用用户自定义字典了。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'}
分词效果的好坏对于自然语言处理任务的成功与否有着至关重要的影响。因此,在使用分词工具时,我们需要对分词效果进行评估。
分词效果评估通常使用准确率(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} F1−Score=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)
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}
其中,uas
和las
分别代表无标签和有标签的依存关系准确率(Unlabeled Attachment Score和Labeled Attachment Score),tags_acc
代表词性标注准确率,token_acc
代表分词准确率,textcat_score
代表文本分类准确率。
spaCy除了分词外还有一些其他的功能,如词性标注、实体识别、依存关系分析等。在实际应用中,我们可以将其与其他机器学习模型结合起来,完成更复杂的自然语言处理任务。
参考文献:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。