天天看点

【NLP开发】Python实现中文、英文分词

1、简介

机器学习之所以看上去可以解决很多复杂的问题,是因为它把这些问题都转化为了数学问题。

而 NLP 也是相同的思路,文本都是一些「非结构化数据」,我们需要先将这些数据转化为「结构化数据」,结构化数据就可以转化为数学问题了,而分词就是转化的第一步。

分词是自然语言理解(NLP)的重要步骤。 分词就是将句子、段落、文章这种长文本,分解为以字词为单位的数据结构,方便后续的处理分析工作。

【NLP开发】Python实现中文、英文分词
  • <font color=blue><b>(1)中文分词⼯具</b></font>

    Hanlp:https://github.com/hankcs/HanLP

    Stanford 分词:https://github.com/stanfordnlp/CoreNLP

    ansj 分词器:https://github.com/NLPchina/ansj_seg

    哈⼯⼤ LTP:https://github.com/HIT-SCIR/ltp

    KCWS分词器:https://github.com/koth/kcws

    jieba:https://github.com/yanyiwu/cppjieba

    IK:https://github.com/wks/ik-analyzer

    清华⼤学THULAC:https://github.com/thunlp/THULAC

    ICTCLAS:https://github.com/thunlp/THULAC

  • <font color=blue><b>(2)英文分词⼯具</b></font>

    Keras:https://github.com/keras-team/keras

    Spacy:https://github.com/explosion/spaCy

    Gensim:https://github.com/RaRe-Technologies/gensim

    NLTK:https://github.com/nltk/nltk

2、Jieba(中文分词)

https://pypi.org/project/jieba/

https://github.com/fxsjy/jieba

“结巴”中文分词:做最好的 Python 中文分词组件

“Jieba” (Chinese for “to stutter”) Chinese text segmentation: built to

be the best Python Chinese word segmentation module.

2.1 简介

自然语言处理( Natural Language Processing, NLP)是计算机科学领域与人工智能领域中的一个重要方向。jieba的主要功能是做中文分词,可以进行简单分词、并行分词、命令行分词,当然它的功能不限于此,目前还支持关键词提取、词性标注、词位置查询等。

  • Jieba其实并不是只有分词这一个功能,其是一个开源框架,提供了很多在分词之上的算法,如关键词提取、词性标注等。
  • Jieba官方提供了Python、C++、Go、R、iOS等多平台多语言支持,不仅如此,还提供了很多热门社区项目的扩展插件,如ElasticSearch、solr、lucene等。在实际项目中,进行扩展十分容易。

Jieba提供了三种分词模式:

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

2.2 安装

pip install jieba
           
【NLP开发】Python实现中文、英文分词

2.3 测试

  • 例子1:官网入门例子
# encoding=utf-8
import jieba

#jieba.enable_paddle()# 启动paddle模式。 0.40版之后开始支持,早期版本不支持
strs=["我来到北京清华大学","乒乓球拍卖完了","中国科学技术大学"]
for str in strs:
    seg_list = jieba.cut(str,use_paddle=True) # 使用paddle模式
    print("Paddle Mode: " + '/'.join(list(seg_list)))

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

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

seg_list = jieba.cut("他来到了网易杭研大厦")  # 默认是精确模式
print(", ".join(seg_list))

seg_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所,后在日本京都大学深造")  # 搜索引擎模式
print(", ".join(seg_list))

           
【NLP开发】Python实现中文、英文分词
  • 例子2:四种搜索模式
import jieba

sent = '中文分词是文本处理不可或缺的一步!'

seg_list = jieba.cut(sent, cut_all=True)
print('全模式:', '/ '.join(seg_list))

seg_list = jieba.cut(sent, cut_all=False)
print('精确模式:', '/ '.join(seg_list))

seg_list = jieba.cut(sent)
print('默认精确模式:', '/ '.join(seg_list))

seg_list = jieba.cut_for_search(sent)
print('搜索引擎模式', '/ '.join(seg_list))
           
【NLP开发】Python实现中文、英文分词
  • 例子3:带词性的分词
import jieba.posseg as jp
print(jp.lcut('我爱西樵山'))
           
【NLP开发】Python实现中文、英文分词
  • 例子4:词与词性间映射
from jieba.posseg import dt
print(dt.word_tag_tab)
           
【NLP开发】Python实现中文、英文分词

2.4 词云图

  • 安装词云的第三方库
pip3 install wordcloud
           
  • (1)使用wordcloud进行测试
import matplotlib.pyplot as plt
import wordcloud

# 数据获取
with open("d:\西游记.txt", 'r', encoding='gbk')as f:
    text = f.read()
    
wc = wordcloud.WordCloud(background_color="white",
                         font_path="C:\\Windows\\Fonts\\simhei.ttf", 
                         width=500, height=500)
wc.generate(text)
wc.to_file("pywcloud.png")

fig = plt.figure()
# 设置窗口标题
# fig.canvas.set_window_title("爱看书的小沐")
# fig.canvas.manager.window.setWindowTitle("爱看书的小沐")
fig.canvas.manager.window.title("西游记的词云 - 爱看书的小沐")

plt.imshow(wc, interpolation='catrom')
plt.axis('off')
plt.show()
           
【NLP开发】Python实现中文、英文分词
  • (2)使用wordcloud+jieba进行测试
import matplotlib.pyplot as plt
import jieba
import wordcloud

# 提取数据
with open("d:\西游记.txt", 'r', encoding='gbk')as f:
    text = f.read()

wc = wordcloud.WordCloud(
    font_path="C:\\Windows\\Fonts\\simhei.ttf", 
    width=500, height=500)
wc.generate(" ".join(jieba.lcut(text)))
wc.to_file("wc.png")

fig = plt.figure()
fig.canvas.manager.window.title("西游记的词云 - 爱看书的小沐")

plt.imshow(wc, interpolation='catrom')
plt.axis('off')
plt.show()

           
【NLP开发】Python实现中文、英文分词
  • (3)使用wordcloud+jieba+各种形状进行测试
import matplotlib.pyplot as plt
import jieba
import wordcloud
from PIL import Image
import numpy as np

# 数据获取
with open("d:\西游记.txt", 'r', encoding='gbk')as f:
    text = f.read()

font = r'C:\Windows\Fonts\simhei.ttf'
sep_list = jieba.lcut_for_search(text)
sep_list = " ".join(sep_list)
wc = wordcloud.WordCloud(
    scale=5,          # 调整图片大小
    font_path=font,   # 使用的字体库
    max_words=100,    # 词云显示的最大词数
    margin=1,         # 字体之间的间距
    mask=np.array(Image.open("d:\heart.png")),  # 背景图片
    background_color='white',                   # 背景颜色
    max_font_size=200,
    # min_font_size=1,
    # stopwords=STOPWORDS,                      #屏蔽的内容
    collocations=False,                         # 避免重复单词
    width=1000, height=1000                     # 图像宽高,字间距
)

wc.generate(sep_list)
wc.to_file("wc.png")

fig = plt.figure()
fig.canvas.manager.window.title("西游记的词云 - 爱看书的小沐")
plt.imshow(wc, interpolation='catrom')
plt.axis('off')
plt.show()
           
【NLP开发】Python实现中文、英文分词
【NLP开发】Python实现中文、英文分词
【NLP开发】Python实现中文、英文分词
【NLP开发】Python实现中文、英文分词

3、THULAC(中文分词)

3.1 简介

https://github.com/thunlp/THULAC-Python

https://github.com/thunlp/THULAC

THULAC(THU Lexical Analyzer for Chinese)由清华大学自然语言处理与社会人文计算实验室研制推出的一套中文词法分析工具包,具有中文分词和词性标注功能。THULAC具有如下几个特点:

  • 能力强。利用我们集成的目前世界上规模最大的人工分词和词性标注中文语料库(约含5800万字)训练而成,模型标注能力强大。
  • 准确率高。该工具包在标准数据集Chinese Treebank(CTB5)上分词的F1值可达97.3%,词性标注的F1值可达到92.9%,与该数据集上最好方法效果相当。
  • 速度较快。同时进行分词和词性标注速度为300KB/s,每秒可处理约15万字。只进行分词速度可达到1.3MB/s。

3.2 安装

pip install thulac
           

<font color=red>报错:AttributeError: module 'time' has no attribute 'clock'?

<font color=green>原因:是 Python3.8 不再支持time.clock,但在调用时,非本工程文件CBTaggingDecoder依然包含该方法。

解决:将time.clock 改成 time.perf_counter(),功能不变。

3.3 测试

  • (1)对一句话分词
import thulac	

thu1 = thulac.thulac() #默认模式
text = thu1.cut("我是爱看书的小沐", text=True) #进行一句话分词
print(text)
           
【NLP开发】Python实现中文、英文分词
  • (2)对文件进行分词
import thulac	

thu1 = thulac.thulac(seg_only=True)  #只进行分词,不进行词性标注
thu1.cut_f(r"d:\西游记.txt", r"d:\output.txt")  #对input.txt文件内容进行分词,输出到output.txt
           
【NLP开发】Python实现中文、英文分词

4、NLTK(英文分词)

https://www.nltk.org/install.html

4.1 简介

NLTK 是用于构建 Python 程序以处理人类语言数据的领先平台。它为超过 50 个语料库和词汇资源(如 WordNet)提供易于使用的接口,以及一套用于分类、标记化、词干提取、标记、解析和语义推理的文本处理库,工业级 NLP 库的包装器,和一个活跃的讨论论坛。

得益于介绍编程基础知识和计算语言学主题的实践指南,以及全面的 API 文档,NLTK 适合语言学家、工程师、学生、教育工作者、研究人员和行业用户。NLTK 适用于 Windows、Mac OS X 和 Linux。最重要的是,NLTK 是一个免费、开源、社区驱动的项目。

4.2 安装

pip install nltk
           

4.3 测试

  • (1)分词
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import nltk
nltk.download('stopwords')

sentence = """At eight o'clock on Thursday morning
... Arthur didn't feel very good."""

tokens = nltk.word_tokenize(sentence)
print(tokens)

from nltk.tokenize import word_tokenize
from nltk.corpus import stopwords
 
data = "All work and no play makes jack dull boy. All work and no play makes jack a dull boy."
stopWords = set(stopwords.words('english'))
words = word_tokenize(data)
wordsFiltered = []
 
for w in words:
    if w not in stopWords:
        wordsFiltered.append(w)
 
print(wordsFiltered)
           
【NLP开发】Python实现中文、英文分词
  • (2)分句
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from nltk.tokenize import sent_tokenize
 
data = "All work and no play makes jack dull boy. All work and no play makes jack a dull boy."
print(sent_tokenize(data))
           
  • (3)分块
import nltk
nltk.download('averaged_perceptron_tagger')
nltk.download('maxent_ne_chunker')
nltk.download('words')
nltk.download('treebank')

sentence = """At eight o'clock on Thursday morning
... Arthur didn't feel very good."""
tokens = nltk.word_tokenize(sentence)
print(tokens)

tagged = nltk.pos_tag(tokens)
print(tagged)

entities = nltk.chunk.ne_chunk(tagged)
print(entities)

from nltk.corpus import treebank
t = treebank.parsed_sents('wsj_0001.mrg')[0]
t.draw()
           

结语