0%

Python-自然语言处理

Python 进行自然语言处理相关的实践。如:

  • pypinyin:汉字拼音转换工具 Python 版。
    • xpinyin:一个用于把汉字转换为拼音的库。
  • jieba: Chinese Word Segmentation:jieba 中文分词:做最好的 Python 中文分词组件
  • NLTK:该库具备可用于几乎所有 NLP 任务的工具
  • pkuseg:北大开源的中文分词工具包,”据说“分词准确率远超过 THULAC 与结巴分词
  • spacy:最快的 NLP 框架
  • THULAC:清化大学推出的一套高效的中文词法分析工具包
  • HanLP:Java 开发的中文自然语言处理工具
  • SnowNLP:中文文本处理库
  • gensim:从非结构化文本中无监督地学习文本隐层的主题向量表示,支持包括 TF-IDF/LSA/LDA/Word2VeC 多种主题模型算法。并可进行相似度计算、信息检索等常用任务。
  • FlashText:运行时间与操作词语数量无关的关键词抽取、同义词替代

概述

语言模型

语言模型:描述语言规律的数学模型

  • 目标:寻找困惑度最小的模型,使其最接近真实的语言
  • 概率图模型
    • HMM 马尔科夫模型
    • CRF 条件随机场模型
  • MEMM 最大熵隐马尔可夫模型

主要方向

命名实体识别

命名实体识别:Name Entity Recognition:NER:对非结构化文本数据提取出实体

关系抽取:Relation Extraction:RE:

实体统一:实体消歧:Entity Resolution:ER:对指向同一个实体的,进行合并,如“中国”与“中华人民共和国”

指代消解:Coreference Resolution:

命名实体识别

实体标注

语义消歧

词性标注

句法分析

语义分析

语音识别

语音识别:Speech recognition:Automatic Speech Recogniition:ASR:Speech To Text:STT:计算机自动将人类的语音内容转换为相应的文字

常用 LSTM

  • 音素(Phoneme):单词的发音都是由音素构成,对于英语,常用的音素集是 CMU 的 39 个音素构成的音素集。而对于汉语,一般直接用全部声母和韵母作为音素集,另外汉语识别还要考虑音调。
  • 声学模型:是将声学和发音学(phonetics)的知识进行整合,以特征提取部分生成的特征作为输入,并为可变长特征序列生成声学模型分数。
  • 语言模型:通过从训练语料(通常是文本形式)学习词之间的相互关系,来估计假设词序列的可能性,又叫语言模型分数。
  • GMM:Gaussian Mixture Model, 高斯混合模型,描述基于傅里叶频谱语音特征的统计模型,用于传统声学模型的建模中。
  • HMM:Hidden Markov Model, 隐马尔科夫模型,是一种用来描述含有隐含未知参数的马尔科夫过程,其难点是从可观察的参数中确定该过程的隐含参数。然后利用这些参数来作进一步的分析,例如模式识别。
  • MFCC:Mel-Frequency Cepstral Coefficients, 梅尔频率倒谱系数,是组成梅尔频率倒谱的系数。衍生自音讯片段的倒频谱(cepstrum)。倒谱与梅尔频率倒谱的区别在于,梅尔频率倒谱的频带划分是在梅尔刻度上等距划分的,它比用于正常的对数倒频谱中的线性间隔的频带更接近人类的听觉系统。广泛应用于语音识别中。
  • Fbank:Mel Frequency Filter Bank, 梅尔频率滤波器组。
  • WER:Word Error Rate, 词错误率,是最常见的衡量语音识别系统性能的指标。

文字转语音

文本相似度

文本情感分析

新闻评论:舆情监控与预测
产品评论:产品优劣
情感词典

文本生成

知识图谱

pypinyin

pypinyin:汉字拼音转换工具 Python 版。

xpinyin:一个用于把汉字转换为拼音的库。

jieba 分词

jieba: Chinese Word Segmentation:jieba 中文分词:做最好的 Python 中文分词组件

  • 中文分词必备

基本使用

  • 四种模式
    • 精确模式:最精确分开,不存在冗余数据,常用于文本分析
    • 全模式:所有可成词词语扫描出来,速度快,但有歧义
    • 搜索引擎模式:精确模式的基础上对长词进行切分,提高召回率,适合用于搜索引擎构建倒排索引的分词,粒度比较细
    • paddle 模式:利用 PaddlePaddle 深度学习框架,训练序列标注(双向 GRU)网络模型实现分词。
      • 需先安装:pip install paddlepaddle-tiny==1.6.1
1
2
3
4
5
6
7
8
9
10
# 使用utf-8编码的字符串
to_cut_str='结巴中文分词:做最好的 Python 中文分词组件'
# 返回generator,jieba.lcut 以及 jieba.lcut_for_search 直接返回 list
jieba.cut_for_search()
jieba.cut(
to_cut_str,
cut_all:bool, # 为True时为全模式,False时为精确模式
HMM=True, # 是否使用HMM模型
use_paddle=False,
)

添加新词

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# # 特殊用词加入用户自定义词典
filename='./test.txt'
jieba.load_userdict(filename)
# 词典一词占一行,一行分三部分,词语、词频(可省略)、词性(可省略),以空格隔开
# 在程序中动态修改字典
add_word(word,freq=None,tag=None)
del_word(word)

# 调整单个词的频率,使它可以(或不能)被分割
suggest_freq(segment, tune=True)
jieba.suggest_freq(('中', '将'), True)

text="我来到了浙江理工大学"
jieba.suggest_freq(("江理"),True)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import jieba
from jieba import analyse

with open(r"C:\Users\chen\Desktop\西游记.txt","rb") as f:
novel=f.read()
print("一共{}个字符".format(len(novel)))
dic={}
res=jieba.cut(novel)
for word in res:
if len(word)==1:
continue
if word in dic:
dic[word]+=1
else:
dic[word]=1
dic=list(dic.items())
dic.sort(key=lambda x:x[1],reverse=True)
for i in range(10):
word,count=dic[i]
print("{}{}".format(word,count))
print("-------")
lis=analyse.extract_tags(novel,withWeight=True)
lis.sort(key=lambda x:x[1],reverse=True)
print("按权重取出关键词")
for i in lis:
print("{}{}".format(i[0],i[1]))

词云

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

import jieba
#读取标点符号库
f=open("utils/stopwords.txt","r")
stopwords={}.fromkeys(f.read().split("\n"))
f.close()
#加载用户自定义词典
# 一个词占一行;每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒。 词频省略时使用自动计算的能保证分出该词的词频
jieba.load_userdict("./utils/jieba_user_dict.txt")
segs=jieba.cut(text)
mytext_list=[]
#文本清洗
for seg in segs:
if seg not in stopwords and seg!=" " and len(seg)!=1:
mytext_list.append(seg.replace(" ",""))
cloud_text=",".join(mytext_list)
from wordcloud import WordCloud
wc = WordCloud(
background_color="white", #背景颜色
max_words=200, #显示最大词数
font_path="./font/wb.ttf", #使用字体
min_font_size=15,
max_font_size=50,
width=400 #图幅宽度
)
wc.generate(cloud_text)
wc.to_file("pic.png")

关键词抽取

  • TF-IDF 算法、TextRank 算法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 关键词提取
import jieba.analyse
# 词性标注
#jieba 在中文分词时,还可以完成词性标注任务中,根据分词结果中每个词的词性,可初步实现命名实体识别
import jieba.possea as pseg
word=pseg.cut("我爱北京天安门")
for word,flag in words:
print("{}{}".format(word,flag))

jieba.analyse.extract_tags(
sentence, # 要提取的文本
topK=20, # 返回具有最高 TF/IDF 权重的关键字数量。默认值为 20
withWeight=False, # 是否返回带有关键字的 TF/IDF 权重。默认值为 False
allowPOS=()) # 过滤包含 POS 的单词。为空不过滤。

词性标注

  • 标注句子分词后每个词的词性
1
2
3
4
5
6
7
8
9
10
11
import jieba.posseg as pseg
words = pseg.cut("我爱我的祖国") #jieba默认模式

for word, flag in words:
print('%s %s' % (word, flag))

我 r
爱 v
我 r
的 uj
祖国 n

词在原文的位置

  • jieba 提供了 Tokenize 来返回词语在原文的起止位置,拥有默认和搜索两种模式。
1
2
3
4
5
6
7
8
9
10
result = jieba.tokenize(u'小Q的python学习笔记')
for tk in result:
print("word %s\t\t start: %d \t\t end:%d" % (tk[0],tk[1],tk[2]))

word 小 start: 0 end:1
word Q start: 1 end:2
word 的 start: 2 end:3
word python start: 3 end:9
word 学习 start: 9 end:11
word 笔记 start: 11 end:13

NLTK

NLTK:该库具备可用于几乎所有 NLP 任务的工具

  • 对每种 NLP 任务有大量方法
  • 学习与使用较为复杂,运行速度慢
  • 没有集成词向量,不提供神经网络结构
    用于分词、词性还原、词干提取、解析、句法分析、词性标注等任务。

PKUSeg

pkuseg:北大开源的中文分词工具包,”据说“分词准确率远超过 THULAC 与结巴分词

  • 多领域分词
1
2
3
4
5
6
7
8
9
10
11
12
import pkuseg
seg=pkuseg.pkuseg()
text=seg.cut('我爱北京天安门')
print(test)
lexicon=['北京大学''北京天安门']
seg=pkuseg.pkuseg(user_dict=lexicon)
text=seg.cut('我爱北京天安门')
print(text)
import pkuseg
seg=pkuseg.pkuseg(model_name='./ctb8')
text=seg.cut('我爱北京天安门')
print(text)
  • 训练模型
1
2
import pkuseg
3pkuseg.train('msr_training.utf8', 'msr_test_gold.utf8', './models', nthread=20) #训练文件为'msr_training.utf8',测试文件为'msr_test_gold.utf8',模型存到'./models'目录下,开 20 个进程训练模型

spacy

spacy:最快的 NLP 框架

  • 更面向对象
  • 不如 NLTK 灵活,不支持多种 语言
1
sudo pip install spacy

THULAC

THULAC:清化大学推出的一套高效的中文词法分析工具包

  • 功能:
    • 中文分词模型
    • 词性标注模型
  • 由 5800 万字的人工分词和词性标注中文语料库训练而成,能力强大,对 Chinese Treebank(CTB5) 上的分词 F1 值高达 97.3%,词性标注的 F1 值高达 92.9%,且速度快,同时进行分词与词性标注速度达 300kb/s,每秒处理 15 万字,只进行分词达 1.3MB/S。

HanLP

HanLP:Java 开发的中文自然语言处理工具

  • 中文分词
  • 词性标注
  • 命名实体识别
  • 依存句法分析

SnowNLP

SnowNLP:中文文本处理库
unicode 编码

  • 文本分类(Naive Bayes)
  • 转换成拼音(Trie 树实现的最大匹配)
  • 繁体转简体(Trie 树实现的最大匹配)
  • 提取文本关键词(TextRank 算法)
  • 提取文本摘要(TextRank 算法)
  • Tokenization(分割成句子)
  • 文本相似(BM25)
  • 词性标注
  • 句子分割
1
2
3
4
5
from snownlp import SnowNLP
s=SnowNLP('我爱北京天安门')
s.pinyin # 列表
s.han # 繁体转简体
s.summary(5) # 自动摘要

gensim

gensim:从非结构化文本中无监督地学习文本隐层的主题向量表示,支持包括 TF-IDF/LSA/LDA/Word2VeC 多种主题模型算法。并可进行相似度计算、信息检索等常用任务。

  • 知识图谱作为知识存储
  • 快速高效的知识检索
  • 情感分析与推理技术

FlashText

FlashText:运行时间与操作词语数量无关的关键词抽取、同义词替代

  • 高效的文本查找替换库
1
pip install flashtext

关键词抽取

  • 相同的意思有不同的词语
1
2
3
4
5
6
7
8
9
10
from flashtext import KeywordProcessor
#设置关键词处理器
keyword_processor = KeywordProcessor()
#设置关键词及其近义词
keyword_processor.add_keyword('Big Apple', 'New York') #遇到 Big Apple 就会识别为 New York
keyword_processor.add_keyword('Bay Area')
keywords_found = keyword_processor.extract_keywords("I love Big Apple and Bay Area.")
keywords_found

# ['New York', 'Bay Area']

关键词替换

1
2
3
4
5
# 将 New Delhi(新德里)替换为 NCR region(国家首都区)
keyword_processor.add_keyword('New Delhi', 'NCR region')
new_sentence = keyword_processor.replace_keywords('I love Big Apple and new delhi.')
new_sentence
# 'I love New York and NCR region.'

rasa

rasa:基于多轮对话的框架

  • 组件:
    • Rassa NLU:自然语言理解:意图识别 + 实体识别,将用户的输入转换为结构化的数据
      • 词槽
    • Rasa Core:聊天机器人框架:基于机器学习的对话管理,决定返回什么内容给用户
  • 功能:
  • 对话系统
    • 检索型问答系统:IR-bot:主要针对问答系统,提问 - 给答案,一般不需参考上下文内容
    • 任务型对话系统:Task-bot:针对查询、操作(如订机票)之类的任务对话
    • 闲聊系统:Chitchat-bot:如 小爱用学、siri 之类的陪聊
  • 自然语言理解:NLU,
    • 表示自然语言含义的形式:三元组方式:
      • action:意图
      • slot:需要填充的槽值
      • value:对应的值
  • 对话状态:DST:Dialogue State Tracking,持续对话所需要的各种信息

nlpir

1
pip install pynlpir
给博主来一杯卡布奇诺