首页 > 编程语言 >【NLP开发】Python实现中文、英文分词

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

时间:2022-09-27 22:10:59浏览次数:71  
标签:NLP jieba Python list nltk seg import 分词

1、简介

机器学习之所以看上去可以解决很多复杂的问题,是因为它把这些问题都转化为了数学问题。 而 NLP 也是相同的思路,文本都是一些「非结构化数据」,我们需要先将这些数据转化为「结构化数据」,结构化数据就可以转化为数学问题了,而分词就是转化的第一步。

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

image.png

  • <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

image.png

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))

image.png

  • 例子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))

image.png

  • 例子3:带词性的分词
import jieba.posseg as jp
print(jp.lcut('我爱西樵山'))

image.png

  • 例子4:词与词性间映射
from jieba.posseg import dt
print(dt.word_tag_tab)

image.png

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()

image.png

  • (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()

image.png

  • (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()

image.png image.png

image.png

image.png

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)

image.png

  • (2)对文件进行分词
import thulac	

thu1 = thulac.thulac(seg_only=True)  #只进行分词,不进行词性标注
thu1.cut_f(r"d:\西游记.txt", r"d:\output.txt")  #对input.txt文件内容进行分词,输出到output.txt

image.png

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)

image.png

  • (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))

image.png

  • (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()

image.png

结语

如果您觉得该方法或代码有一点点用处,可以给作者点个赞,或打赏杯咖啡;╮( ̄▽ ̄)╭ 如果您感觉方法或代码不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进;o_O??? 如果您需要相关功能的代码定制化开发,可以留言私信作者;(✿◡‿◡) 感谢各位大佬童鞋们的支持!( ´ ▽´ )ノ ( ´ ▽´)っ!!!

标签:NLP,jieba,Python,list,nltk,seg,import,分词
From: https://blog.51cto.com/u_15800063/5710916

相关文章

  • Python基础(五) | 函数及面向过程编程详解
    第五章函数⭐本专栏旨在对Python的基础语法进行详解,精炼地总结语法中的重点,详解难点,面向零基础及入门的学习者,通过专栏的学习可以熟练掌握python编程,同时为后续的数据分析,......
  • python 时间与日期模块总结
    python标准库中关于日期和时间的库主要有三个:calendar、time和datetime。1.calemdar模块calendar模块在日历的获取、显示以及年份是否为闰年等方面有诸多函数支持1.1打......
  • python流程控制理论
    今日内容概要垃圾回收机制流程控制理论(重要)流程控制之分支结构(重要)流程控制之循环结构(重要)今日内容详细垃圾回收机制"""有一些语言内存空间的申请和......
  • Python入门基础
    今日份内容概要垃圾回收机制控制流程理论控制流程之分支结构控制流程之循环结构今日内容详情任何的语言,使用内存空间的申请和释放都需要程序员自己写代码才能完成......
  • python st
    #######numpy.ndarray转为dataframelr_info=data1.uns['lr_summary']lr_scores=data1.obsm['lr_scores']df_lr_scores=pd.DataFrame(data=lr_scores[0:,0:],col......
  • python垃圾回收机制与流程控制
    垃圾回收机制有一些语言,内存空间的申请和清除都需要程序员自己写代码才可以完成,但是在python中却不需要,通过垃圾回收机制自动管理1.引用计数name='lizhi'表示数......
  • Python cv2(Opencv) Canny边缘检测 和 傅里叶变换
    OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和MacOS操作系统上。它轻量级而且高效,由一系列C函数和少......
  • 垃圾回收、python中的流程控制
    垃圾回收机制1.概念垃圾回收机制(GC):是Python解释器自带一种机制,专门用来回收不可用的变量值所占用的内存空间2.原理Python的垃圾回收机制(GC)主要使用引用计数(referen......
  • Python之垃圾回收机制与流程控制
    python之垃圾回收机制与流程控制目录一、垃圾回收机制二、流程控制1.流程控制理论2.流程控制的必备python知识3.流程控制之分支结构(ifelse语句)(1)单if分支结构(2)if...el......
  • Python基础5
    今日内容概要垃圾回收机制流程控制理论流程控制必备知识分支结构循环结构作业今日内容详细垃圾回收机制  有一些语言内存空间的申请和释放都需......