NLP开发Python实现中文英文分词

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NLP开发Python实现中文英文分词相关的知识,希望对你有一定的参考价值。

1、简介

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

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

2.1 简介

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

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

Jieba提供了三种分词模式:

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

2.2 安装

pip install jieba

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

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

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

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

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

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

  • (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 = rC:\\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()

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)

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

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

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 oclock on Thursday morning
... Arthur didnt 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)

  • (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 oclock on Thursday morning
... Arthur didnt 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()

结语

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

以上是关于NLP开发Python实现中文英文分词的主要内容,如果未能解决你的问题,请参考以下文章

词法分析:分词;词性标注;实体识别

jieba分词的词性标注

nlp词性标注

jieba分词(R vs. python)

NLP⚠️学不会打我! 半小时学会基本操作 1⚠️ 分词

NLP⚠️学不会打我! 半小时学会基本操作 1⚠️ 分词