中文自然语言库处理大总结
自然语言(Natural language)通常是指一种自然地随文化演化的语言。例如,汉语、英语、日语都是自然语言的例子,这一种用法可见于自然语言处理一词中。自然语言是人类交流和思维的主要工具。 自然语言是人类智慧的结晶,自然语言处理是人工智能中最为困难的问题之一,而对自然语言处理的研究也是充满魅力和挑战的,也是各国人表达的方法其中之一。
以下的库对中文支持非常好,所以是对中文自然语言的处理,下面是笔者所学的所有知识的总结,会持续补充。
jieba
jieba库是一款优秀的 Python 第三方中文分词库,jieba 支持三种分词模式:精确模式、全模式和搜索引擎模式,下面是三种模式的特点。
精确模式:试图将语句最精确的切分,不存在冗余数据,适合做文本分析
全模式:将语句中所有可能是词的词语都切分出来,速度很快,但是存在冗余数据
搜索引擎模式:在精确模式的基础上,对长词再次进行切分
大量的库的依赖是jieba,可见jieba的重要性
安装
pip install jieba
引入
import jieba
jieba api
函数 | 描述 |
---|---|
jieba.cut(s) | 精确模式,返回一个可迭代的数据类型 |
jieba.cut(s, cut_all = True) | 全模式,输出文本s中所有可能的单词 |
jieba.cut_for_search(s) | 搜索引擎模式,适合搜索引擎建立索引的分词结果 |
jieba.lcut(s) | 精确模式,返回列表类型,建议使用 |
jieba.lcut(s, cut_all = True) | 全模式,返回列表类型,建议使用 |
jiaba.lcut_for_search(s) | 搜索引擎模式,返回列表类型,建议使用 |
jieba.add_word(s) | 向分词词典中添加新词w |
应用
string = "列车折返是什么意思"
afterCut = jieba.lcut_for_search(string)
print(afterCut)
输出:
Building prefix dict from the default dictionary ...
Loading model from cache C:\Users\xxxxx\AppData\Local\Temp\jieba.cache
Loading model cost 0.600 seconds.
Prefix dict has been built successfully.
['列车', '折返', '是', '什么', '意思']
jieba.analyse
通过词性,将一句话中具有该词性的词语提取出来。是分词的一种,但是是提取带有词性的关键字。
引入
import jieba.analyse
api
jieba.analyse.extract_tags(sentence, topK=5, withWeight=True, allowPOS=())
sentence,需要提取的字符串,必须是字符串类型
top,提取多少个关键字,重要性从高到低
withWeight,是否返回每个关键词的权重
allowPOS,词性过滤,分别有:'ns’, ‘n’, ‘vn’, ‘v’,解释为提取地名、名词、动名词、动词
应用
answerList = jieba.analyse.extract_tags(sentence = string, topK=5, withWeight=False, allowPOS=('n'))
return answerList[0][0:2]
jieba.posseg
切割句子并分析词性,例如动词,名词等
引用
import jieba.posseg as posseg
应用
list = posseg.lcut("金融危机是如何造成的")
print(list)
输出:
Building prefix dict from the default dictionary ...
Loading model from cache C:\Users\xxxx\AppData\Local\Temp\jieba.cache
Loading model cost 0.559 seconds.
Prefix dict has been built successfully.
[pair('金融危机', 'n'), pair('是', 'v'), pair('如何', 'r'), pair('造成', 'v'), pair('的', 'uj')]
SnowNLP
SnowNLP是一个python写的类库,可以方便的处理中文文本内容,是受到了TextBlob的启发而写的,由于现在大部分的自然语言处理库基本都是针对英文的,于是写了一个方便处理中文的类库,并且和TextBlob不同的是,这里没有用NLTK,所有的算法都是自己实现的,并且自带了一些训练好的字典。
它能分词,可以标注,可以断句,可以做为情感分析。标注和分词用jieba即可完成。
安装
pip install snownlp
引用
from snownlp import SnowNLP
分词
s = SnowNLP("这个答题很简单的好不好")
print(s.words)
输出:
['这个', '答题', '很', '简单', '的', '好', '不', '好']
断句
s = SnowNLP("这个答题很简单的好不好,闭着眼睛都能答出来。")
print(s.sentences)
输出:
['这个答题很简单的好不好', '闭着眼睛都能答出来']
繁体转汉字
s = SnowNLP("繁體字")
print(s.han)
输出:
繁体字
转拼音
s = SnowNLP("这个答题很简单的好不好")
print(s.pinyin)
输出:
['zhe', 'ge', 'da', 'ti', 'hen', 'jian', 'dan', 'de', 'hao', 'bu', 'hao']
情感分析
s = SnowNLP("这个答题很简单的好不好")
print(s.sentiments)
输出:
0.9216225993232947
越接近1表示正面情绪,接近0表示负面情绪,目前该api对评论支持较好,其他类型会有未知情况
概括总结文章
s = SnowNLP("SnowNLP是一个python写的类库,可以方便的处理中文文本内容,是受到了TextBlob的启发而写的,由于现在大部分的自然语言处理库基本都是针对英文的,于是写了一个方便处理中文的类库,并且和TextBlob不同的是,这里没有用NLTK,所有的算法都是自己实现的,并且自带了一些训练好的字典。")
print(s.summary(limit=4))
输出:
['于是写了一个方便处理中文的类库', 'SnowNLP是一个python写的类库', '是受到了TextBlob的启发而写的', '由于现在大部分的自然语言处理库基本都是针对英文的']
信息衡量
TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。
TF词频越大越重要,但是文中会的“的”,“你”等无意义词频很大,却信息量几乎为0,这种情况导致单纯看词频评价词语重要性是不准确的。因此加入了idf
IDF的主要思想是:如果包含词条t的文档越少,也就是n越小,IDF越大,则说明词条t越重要
TF-IDF综合起来,才能准确的综合的评价一词对文本的重要性。
s = SnowNLP("我的天啊")
print(s.tf)
print(s.idf)
输出:
[{'我': 1}, {'的': 1}, {'天': 1}, {'啊': 1}]
{'我': 0.8472978603872037, '的': 0.8472978603872037, '天': 0.8472978603872037, '啊': 0.8472978603872037}
文本相似性检测
s = SnowNLP("我的天啊")
print(s.sim(["我"]))
输出:
[0.8472978603872037, 0, 0, 0]
如果传入的是句子,那么它会将所有的句子拆开然后进行相似性的检测。
Gensim
Gensim是一款开源的第三方Python工具包,用于从原始的非结构化的文本中,无监督地学习到文本隐层的主题向量表达。它支持包括TF-IDF,LSA,LDA,和word2vec在内的多种主题模型算法,支持流式训练,并提供了诸如相似度计算,信息检索等一些常用任务的API接口。
Gensim需要慢慢研究,它实在是太大了 pip install snownlp
基本概念
语料(Corpus):一组原始文本的集合,用于无监督地训练文本主题的隐层结构。语料中不需要人工标注的附加信息。在Gensim中,Corpus通常是一个可迭代的对象(比如列表)。每一次迭代返回一个可用于表达文本对象的稀疏向量。
向量(Vector):由一组文本特征构成的列表。是一段文本在Gensim中的内部表达。
稀疏向量(SparseVector):通常,我们可以略去向量中多余的0元素。此时,向量中的每一个元素是一个(key, value)的元组
模型(Model):是一个抽象的术语。定义了两个向量空间的变换(即从文本的一种向量表达变换为另一种向量表达)。
安装
pip install gensim
引用
from gensim import corpora # 计算语料库的向量和生成语料库
from gensim import models # 模型算法tf-idf(主要tf:term frequency 词频;idf:inverse document frequency 倒文档频率)
from gensim import similarities # 计算向量相似度
相似度计算
笔者认为,gensim计算相似度是文章与文章的计算,宏观程度比SnowNLP大
在切割数据时,笔者把符号这些脏数据清除了,提高计算的准确率
以下为生成context1的语料库索引以及计算context1与context2的相似度
切割句子
context1 = context1.split("。")## 切割句子
texts = [jieba.lcut(re.sub("[_.!+\-=——,$%^,。?、~@#¥%……&*《》<>「」{}【】()/]",r"",text)) for text in context1]# 将句子切割成词语
生成词典(语料库)
dictionary = corpora.Dictionary(texts)
doc2bow生成稀疏向量值
corpus = [dictionary.doc2bow(text) for text in texts]
通过TF-IDF模型算法,计算出tf值
tf = models.TfidfModel(corpus)
通过token2id得到特征数(字典里面的键的个数)
num_features = len(dictionary.token2id.keys())
计算稀疏矩阵相似度,建立索引
index = similarities.MatrixSimilarity(tf[corpus], num_features=num_features)
语料库索引建立完毕,接下来对另外一篇文章进行相似度的检测
切割测试数据
test_words = [word for word in jieba.cut(re.sub("[_.!+\-=——,$%^,。?、~@#¥%……&*《》<>「」{}【】()/]",r"",context2))]
构建新的稀疏向量
new_vec = dictionary.doc2bow(test_words)
通过语料库索引计算相似度
sims = index[tf[new_vec]]
这里会得到一个转载着相似度的list,笔者这里把相似度做一个平均值,这样比较好观察
simlist = list(sims) # 将sims转换成list
avg = 0
for sim in simlist:
avg = sim+avg
avg = avg/len(simlist)
TextRank4ZH
TextRank算法可以用来从文本中提取关键词和摘要(重要的句子)。TextRank4ZH是针对中文文本的TextRank算法的python算法实现。
安装
pip install textrank4zh
引入
from textrank4zh import TextRank4Keyword, TextRank4Sentence
案例文章
金融危机的百度百科
sentence = "具体到行业,保险业近年来总体处于上升状态,除了受到国际金融危机的严重影响,保费增速降低,但仍超过10%。纺织行业等传统劳动密集型企业受到的影响比较严重。据海关总署数据显示,2008年9月份,纺织品服装出口较8月份减少近6亿美元,较上年同月仅小幅增加约3亿美元,9月份出口延续了8月份微幅增长的趋势。随着美国金融危机愈演愈烈,以美元计价的纺织出口接近零增长,以人民币汇率计价的出口额持续负增长,20%的纺织企业出现亏损;汽车行业受美国金融危机的影响,总体表现低迷。据中国汽车工业协会最新数据统计,2009年1~8月,乘用车产销463.24万辆和455.03万辆,同比增长13.67%和13.15%,与上年同期相比,增幅回落8.32个百分点和10.94个百分点。"
提取关键词
调用TextRank4Keyword() -> analyze -> 获取关键词 -> 输出
tr4w = TextRank4Keyword()
tr4w.analyze(text=sentence)
keywordlist = tr4w.get_keywords(20,word_min_len=2)# word_min_len=2,关键词的最小长度
for keyword in keywordlist:
print(keyword['word'])
提取关键句
调用TextRank4Sentence() -> analyze -> 获取关键句数量 -> 输出
tr4s = TextRank4Sentence()
tr4s.analyze(text=sentence, lower=True, source = 'all_filters')# 文本小写,使用words_all_filters生成句子之间的相似性
sentenceslist = tr4s.get_key_sentences(num=5)# num=3表示为提取3个关键句
for item in sentenceslist:
print(item)# index是语句在文本中索引位置,weight是权重系数
停用词表
原文链接:https://blog.csdn.net/dorisi_h_n_q/article/details/82114913
Synonyms
Chinese Synonyms for Natural Language Processing and Understanding.
最好的中文近义词工具包: https://github.com/huyingxi/Synonyms/。
synonyms可以用于自然语言理解的很多任务:文本对齐,推荐算法,相似度计算,语义偏移,关键字提取,概念提取,自动摘要,搜索引擎等。
原文链接:https://blog.csdn.net/samurais/article/details/79339406
安装
pip install synonyms
引入
import synonyms
调试
synonyms.display("飞机")
输出:
'飞机'近义词:
1. 架飞机:0.837399
2. 客机:0.764609
3. 直升机:0.762116
4. 民航机:0.750519
5. 航机:0.750116
6. 起飞:0.735736
7. 战机:0.734975
8. 飞行中:0.732649
9. 航空器:0.723945
10. 运输机:0.720578
同义词搜寻
生成一个二维数组
list = synonyms.nearby("金融危机")
print(list)
输出:
(['金融危机', '次贷危机', '经济危机', '经济衰退', '金融风暴', '石油危机', '股灾', '大萧条', '危机', '经济萧条'], [1.0, 0.85820746, 0.85081583, 0.80318713, 0.7774969, 0.7471542, 0.7450016, 0.7314842, 0.725529, 0.7105995])
关键词截取
keyword = synonyms.keywords(question)
相似性比较
sen1 = "发生历史性变革"
sen2 = "发生历史性变革"
r = synonyms.compare(sen1, sen2, seg=True)
print(r)
输出:
1.0
0.5 < 不相似,反之则对