本文最后更新于 2025-02-11,墨迹未干时,知识正鲜活。随着时间推移,文章部分内容可能需要重新着墨,请您谅解。Contact

全面详解:在 Ubuntu 服务器上使用 Jieba 分词

Jieba(“结巴”)是一款优秀的中文分词工具,因其简单易用、功能强大而广受欢迎。本文将详细介绍如何在 Ubuntu 服务器上安装和使用 Jieba 分词,包括基本用法、高级功能、自定义词典、关键词提取、词性标注、Tokenize、性能优化等内容.

目录

  1. Jieba 简介
  2. 在 Ubuntu 上安装 Jieba
  3. 快速上手
  4. 分词模式详解
  5. 自定义词典
  6. 调节分词结果
  7. 词性标注
  8. Tokenize:获取词语位置
  9. 并行分词
  10. 性能优化
  11. 集成其他库
  12. 常见问题及解决方法
  13. 参考资料

1. Jieba 简介

Jieba(“结巴”)中文分词工具是一个基于 Python 的开源项目,它采用了多种分词算法,包括基于 Trie 树实现的词典加基于 HMM 模型的中文分词方法,支持三种分词模式:

  • 精确模式:试图将句子最精确地切开,适合文本分析。
  • 全模式:把句子中所有的可能词语都扫描出来,速度快,但不能解决歧义。
  • 搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。

此外,Jieba 还支持:

  • 自定义词典:添加用户自定义的专有词汇,提升分词准确性。
  • 关键词提取:基于 TF-IDF 算法和 TextRank 算法提取关键词。
  • 词性标注:为分词结果标注词性。
  • Tokenize:返回词语在原文中的位置。

2. 在 Ubuntu 上安装 Jieba

在 Ubuntu 环境下,通过 Python 的包管理工具 pip 安装 Jieba。

2.1 更新系统包

sudo apt update
sudo apt upgrade -y

2.2 安装 Python 和 pip

如果尚未安装 Python 和 pip,请运行以下命令:

sudo apt install python3 python3-pip -y

验证安装版本:

python3 --version
pip3 --version

2.3 创建虚拟环境(可选)

使用虚拟环境可以避免包冲突:

sudo apt install python3-venv -y
python3 -m venv jieba_env
source jieba_env/bin/activate

2.4 安装 Jieba

pip install jieba

验证安装:

python3 -c "import jieba; print(jieba.__version__)"

3. 快速上手

导入 Jieba

import jieba

示例文本

text = "我来到北京清华大学"

精确模式

seg_list = jieba.cut(text, cut_all=False)
print("精确模式:", "/".join(seg_list))
# 输出: 我/来到/北京/清华大学

全模式

seg_list = jieba.cut(text, cut_all=True)
print("全模式:", "/".join(seg_list))
# 输出: 我/来到/北京/清华/清华大学/华大/大学

搜索引擎模式

seg_list = jieba.cut_for_search(text)
print("搜索引擎模式:", "/".join(seg_list))
# 输出: 我/来到/北京/清华/华大/大学/清华大学

4. 分词模式详解

4.1 精确模式

精确模式是 Jieba 的默认模式,适合文本分析。

示例:

text = "他来到了网易杭研大厦"
seg_list = jieba.cut(text)
print("/".join(seg_list))
# 输出: 他/来到了/网易/杭研/大厦

4.2 全模式

全模式将句子中所有可能的词语都扫描出来。

示例:

seg_list = jieba.cut(text, cut_all=True)
print("/".join(seg_list))
# 输出: 他/来到/了/网易/杭研/杭研大厦/大厦

4.3 搜索引擎模式

在精确模式的基础上,对长词再次切分,适合用于搜索引擎分词。

示例:

seg_list = jieba.cut_for_search(text)
print("/".join(seg_list))
# 输出: 他/来到了/网易/杭研/大厦/杭研大厦

5. 自定义词典

Jieba 默认自带了一个中文词典,但在某些特定领域,可能需要添加一些专有名词。

5.1 加载自定义词典

方法一:使用自带接口加载词典

jieba.load_userdict('userdict.txt')

userdict.txt 文件每行一个词,格式为:

词语 频率 词性

示例:

云计算 100 n
大数据 100 n
机器学习 100 n

方法二:在初始化时指定词典

jieba.dt.tmp_dir = './'
jieba.dt.cache_file = 'jieba.cache'

5.2 动态添加和删除词语

添加新词

jieba.add_word('区块链')
jieba.add_word('人工智能', freq=2000, tag='n')

调整词频

jieba.suggest_freq('红掌', tune=True)

删除词语

jieba.del_word('自定义词')

6. 调节分词结果

6.1 调整词频

print('/'.join(jieba.cut('如果放到post中将出错。', HMM=False)))
# 输出: 如果/放到/post/中将/出错/。

jieba.suggest_freq(('中', '将'), True)
print('/'.join(jieba.cut('如果放到post中将出错。', HMM=False)))
# 输出: 如果/放到/post/中/将/出错/。

6.2 关键词提取

基于 TF-IDF 算法

import jieba.analyse

text = "我喜欢自然语言处理,因为它非常有趣。"
keywords = jieba.analyse.extract_tags(text, topK=5, withWeight=False)
print(keywords)
# 输出: ['自然语言处理', '喜欢', '有趣']

基于 TextRank 算法

keywords = jieba.analyse.textrank(text, topK=5, withWeight=False)
print(keywords)
# 输出: ['自然语言处理', '喜欢', '有趣']

7. 词性标注

import jieba.posseg as pseg

words = pseg.cut("我爱北京天安门")
for word, flag in words:
    print(f'{word} {flag}')
# 输出:
# 我 r
# 爱 v
# 北京 ns
# 天安门 ns

常见词性标注:

  • n 名词
  • v 动词
  • a 形容词
  • r 代词
  • ns 地名
  • nt 机构团体
  • nr 人名

8. Tokenize:获取词语位置

8.1 默认模式

result = jieba.tokenize('永和服装饰品有限公司')
for tk in result:
    print(f'词语: {tk[0]}, 起始位置: {tk[1]}, 结束位置: {tk[2]}')
# 输出:
# 词语: 永和, 起始位置: 0, 结束位置: 2
# 词语: 服装, 起始位置: 2, 结束位置: 4
# 词语: 饰品, 起始位置: 4, 结束位置: 6
# 词语: 有限公司, 起始位置: 6, 结束位置: 10

8.2 搜索模式

result = jieba.tokenize('永和服装饰品有限公司', mode='search')
for tk in result:
    print(f'词语: {tk[0]}, 起始位置: {tk[1]}, 结束位置: {tk[2]}')
# 输出更细粒度的词语及位置

9. 并行分词

注意jieba.enable_parallel() 在新版本中已不推荐使用,建议使用多进程加速。

使用多进程

import jieba
import multiprocessing

def cut_process(text):
    return list(jieba.cut(text))

if __name__ == "__main__":
    texts = ['我来到北京清华大学', '他来到了网易杭研大厦', '小明硕士毕业于中国科学院计算所']
    pool = multiprocessing.Pool()
    results = pool.map(cut_process, texts)
    pool.close()
    pool.join()
    for res in results:
        print('/'.join(res))

10. 性能优化

10.1 预加载词典

在分词前预先加载词典,避免在分词过程中频繁加载。

jieba.initialize()

10.2 使用缓存机制

对于重复的文本,可以使用缓存机制减少重复分词。

11. 集成其他库

11.1 与 Pandas 集成

import jieba
import pandas as pd

data = {'text': ['我来到北京清华大学', '他来到了网易杭研大厦', '小明硕士毕业于中国科学院计算所']}
df = pd.DataFrame(data)

df['cut_text'] = df['text'].apply(lambda x: ' '.join(jieba.cut(x)))
print(df)

11.2 与 Numpy、Scikit-learn 集成

示例:文本特征提取

from sklearn.feature_extraction.text import CountVectorizer
import jieba

texts = ['我来到北京清华大学', '他来到了网易杭研大厦', '小明硕士毕业于中国科学院计算所']
corpus = [' '.join(jieba.cut(text)) for text in texts]

vectorizer = CountVectorizer()
X = vectorizer.fit_transform(corpus)
print(vectorizer.get_feature_names_out())
print(X.toarray())

12. 常见问题及解决方法

问题1:分词结果不准确

解决方案:

  • 检查是否需要添加自定义词典。
  • 通过 jieba.suggest_freq() 调整词频。

问题2:分词速度慢

解决方案:

  • 使用多进程加速分词。
  • 预加载词典,避免重复加载。

问题3:编码错误

解决方案:

  • 确保源文件和终端使用相同的编码(建议 UTF-8)。
  • 在文件读写时指定编码:open('file.txt', 'r', encoding='utf-8')

13. 参考资料