文章目录
1、简介
机器学习之所以看上去可以解决很多复杂的问题,是因为它把这些问题都转化为了数学问题。
而 NLP 也是相同的思路,文本都是一些「非结构化数据」,我们需要先将这些数据转化为「结构化数据」,结构化数据就可以转化为数学问题了,而分词就是转化的第一步。
分词是自然语言理解(NLP)的重要步骤。 分词就是将句子、段落、文章这种长文本,分解为以字词为单位的数据结构,方便后续的处理分析工作。
- (1)中文分词⼯具
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 - (2)英文分词⼯具
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
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)
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
报错:AttributeError: module ‘time’ has no attribute ‘clock’?
原因:是 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、SnowNLP(中文分词)
4.1 简介
SnowNLP: Simplified Chinese Text Processing
SnowNLP是一个python写的类库,可以方便的处理中文文本内容,是受到了TextBlob的启发而写的,由于现在大部分的自然语言处理库基本都是针对英文的,于是写了一个方便处理中文的类库,并且和TextBlob不同的是,这里没有用NLTK,所有的算法都是自己实现的,并且自带了一些训练好的字典。注意本程序都是处理的unicode编码,所以使用时请自行decode成unicode。
- 中文分词(Character-Based Generative Model)
- 词性标注(TnT 3-gram 隐马)
- 情感分析(现在训练数据主要是买卖东西时的评价,所以对其他的一些可能效果不是很好,待解决)
- 文本分类(Naive Bayes)
- 转换成拼音(Trie树实现的最大匹配)
- 繁体转简体(Trie树实现的最大匹配)
- 提取文本关键词(TextRank算法)
- 提取文本摘要(TextRank算法)
- tf,idf
- Tokenization(分割成句子)
- 文本相似(BM25)
- 支持python3(感谢erning)
4.2 安装
pip install snownlp
4.3 测试
- (1)中文分词
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from snownlp import SnowNLP
# 中文分词
text = '段誉回到大理,适逢吐蕃国大轮明法王鸠摩智为抢大理国天龙寺武功绝学六脉神剑图谱与天龙寺众高僧比武之会。为救伯父保定帝,段誉以深厚的内力为基础,一人使出六脉神剑,大败鸠摩智,后被鸠摩智用计擒住,带至姑苏武林世家、以“以彼之道,还施彼身”享誉中原武林的慕容氏家中,在阿朱、阿碧帮助下逃脱。在苏州,他遇见苦恋表哥慕容复的王语嫣,对她一见钟情,苦苦追随;后又在无锡松鹤楼与丐帮帮主乔峰结为异姓兄弟。'
s = SnowNLP(text)
print(s.words)
- (2)词性标注
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from snownlp import SnowNLP
# 词性标注
text = '段誉回到大理,适逢吐蕃国大轮明法王鸠摩智为抢大理国天龙寺武功绝学六脉神剑图谱与天龙寺众高僧比武之会。为救伯父保定帝,段誉以深厚的内力为基础,一人使出六脉神剑,大败鸠摩智,后被鸠摩智用计擒住,带至姑苏武林世家、以“以彼之道,还施彼身”享誉中原武林的慕容氏家中,在阿朱、阿碧帮助下逃脱。在苏州,他遇见苦恋表哥慕容复的王语嫣,对她一见钟情,苦苦追随;后又在无锡松鹤楼与丐帮帮主乔峰结为异姓兄弟。'
s = SnowNLP(text)
print(list(s.tags))
- (3)情感分析
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from snownlp import SnowNLP
# 情感分析
text1 = '相貌不佳为人愚直的小和尚成为逍遥派的掌门人后,又被灵鹫宫主人天山童姥带至西夏皇宫中,尽得逍遥派真传。'
text2 = '乔峰带她至东北,从金人手中救出辽国皇帝耶律洪基,结为兄弟,帮助消除叛乱,被封为南院大王。'
s1 = SnowNLP(text1)
s2 = SnowNLP(text2)
print(s1.sentiments)
print(s2.sentiments)
- (4)转换成拼音
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from snownlp import SnowNLP
# 转换成拼音
text = '以宋哲宗时代为背景,通过宋、辽、大理、西夏、吐蕃等王国之间的武林恩怨和民族矛盾,从哲学的高度对人生和社会进行审视和描写,展示了一幅波澜壮阔的生活画卷。'
s = SnowNLP(text)
print(s.pinyin)
- (5)繁体转简体
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from snownlp import SnowNLP
# 繁体转简体
text = '八部者,一天,二龍,三夜叉,四乾達婆,五阿修羅,六迦樓羅,七緊那羅,八摩呼羅迦。'
s = SnowNLP(text)
print(s.han)
- (6)提取文本关键词
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from snownlp import SnowNLP
# 提取文本关键词,总结10个关键词
text = '“无量剑”原分东、北、西三宗,北宗近数十年来已趋式微,东西二宗却均人材鼎盛。“无量剑”于五代后唐年间在南诏无量山创派,掌门人居住无量山剑湖宫。'
s = SnowNLP(text)
print(s.keywords(10))
- (7)提取文本摘要
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from snownlp import SnowNLP
# 提取文本摘要
text = '自于大宋仁宗年间分为三宗之后,每隔五年,三宗门下弟子便在剑湖宫中比武斗剑,获胜的一宗得在剑湖宫居住五年,至第六年上重行比试。五场斗剑,赢得三场者为胜。'
s = SnowNLP(text)
print(s.summary(2))# 总结两条摘要
- (8)tf,idf
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from snownlp import SnowNLP
# tf,idf
"""
TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。
TF词频越大越重要,但是文中会的“的”,“你”等无意义词频很大,却信息量几乎为0,这种情况导致单纯看词频评价词语重要性是不准确的。因此加入了idf
IDF的主要思想是:如果包含词条t的文档越少,也就是n越小,IDF越大,则说明词条t越重要
TF-IDF综合起来,才能准确的综合的评价一词对文本的重要性。
"""
text = "段誉轻挥折扇,摇了摇头,说道:“你师父是你的师父,你师父可不是我的师父。你师父差得动你,你师父可差不动我。你师父叫你跟人家比剑,你已经跟人家比过了。你师父叫我跟你比剑,我一来不会,二来怕输,三来怕痛,四来怕死,因此是不比的。我说不比,就是不比。”"
s = SnowNLP(text)
print(s.tf)
print(s.idf)
- (9)Tokenization
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from snownlp import SnowNLP
# Tokenization(分割句子)
text = "段誉轻挥折扇,摇了摇头,说道:“你师父是你的师父,你师父可不是我的师父。你师父差得动你,你师父可差不动我。你师父叫你跟人家比剑,你已经跟人家比过了。你师父叫我跟你比剑,我一来不会,二来怕输,三来怕痛,四来怕死,因此是不比的。我说不比,就是不比。”"
s = SnowNLP(text)
print(s.sentences)
- (10)文本相似
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from snownlp import SnowNLP
text = '众人正惊奇间,忽听得头顶有人噗哧一笑。众人抬起头来,只见一个少女坐在梁上,双手抓的都是蛇。'
# 文本相似度(BM25)
s = SnowNLP(text)
print(s.sim('少女'))
5、NLTK(英文分词)
https://www.nltk.org/install.html
5.1 简介
NLTK 是用于构建 Python 程序以处理人类语言数据的领先平台。它为超过 50 个语料库和词汇资源(如 WordNet)提供易于使用的接口,以及一套用于分类、标记化、词干提取、标记、解析和语义推理的文本处理库,工业级 NLP 库的包装器,和一个活跃的讨论论坛。
得益于介绍编程基础知识和计算语言学主题的实践指南,以及全面的 API 文档,NLTK 适合语言学家、工程师、学生、教育工作者、研究人员和行业用户。NLTK 适用于 Windows、Mac OS X 和 Linux。最重要的是,NLTK 是一个免费、开源、社区驱动的项目。
5.2 安装
pip install nltk
5.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)
- (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()
结语
如果您觉得该方法或代码有一点点用处,可以给作者点个赞,或打赏杯咖啡;
╮( ̄▽ ̄)╭
如果您感觉方法或代码不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进;
o_O???
如果您需要相关功能的代码定制化开发,可以留言私信作者;
(✿◡‿◡)
感谢各位大佬童鞋们的支持!
( ´ ▽´ )ノ ( ´ ▽´)っ!!!