赞
踩
pkuseg具有如下几个特点:
多领域分词。不同于以往的通用中文分词工具,此工具包同时致力于为不同领域的数据提供个性化的预训练模型。根据待分词文本的领域特点,用户可以自由地选择不同的模型。 我们目前支持了新闻领域,网络领域,医药领域,旅游领域,以及混合领域的分词预训练模型。在使用中,如果用户明确待分词的领域,可加载对应的模型进行分词。如果用户无法确定具体领域,推荐使用在混合领域上训练的通用模型。各领域分词样例可参考 example.txt。 更高的分词准确率。
相比于其他的分词工具包,当使用相同的训练数据和测试数据,pkuseg可以取得更高的分词准确率。 支持用户自训练模型。支持用户使用全新的标注数据进行训练。 支持词性标注。
https://github.com/lancopku/PKUSeg-python
#对文件分词 中文需要保存为utf-8
import pkuseg
pkuseg.test('./NLPdata/input.txt', './NLPdata/output.txt', nthread=2) #20
# 对input.txt的文件分词输出到output.txt中
# 额外使用用户自定义词典
import pkuseg
seg = pkuseg.pkuseg(user_dict='./data/my_dict.txt') # 给定用户词典为当前目录下的"my_dict.txt"
text = seg.cut('我爱北京天安门') # 进行分词
print(text)
#额外使用用户自定义词典
import pkuseg
seg = pkuseg.pkuseg(model_name='./ctb8') # 假设用户已经下载好了ctb8的模型并放在了'./ctb8'目录下,通过设置model_name加载该模型
text = seg.cut('我爱北京天安门') # 进行分词
print(text)
#练新模型 (模型随机初始化)
import pkuseg
# 训练文件为'train.txt'
# 测试文件为'test.txt'
# 加载'./pretrained'目录下的模型,训练好的模型保存在'./models',训练10轮
pkuseg.train('train.txt', 'test.txt', './models', train_iter=10, init_model='./pretrained')
语言技术平台( Language Technology Plantform,简称LTP),经过哈工大社会计算与信息检索研究中心11 年的持续研发和推广, 是国内外最具影响力的中文处理基础平台。详情见官网:http://ltp.ai/
提供的功能包括:中文分词、词性标注、命名实体识别、依存句法分析、语义角色标注等
安装LTP:pip install ltp
pyltp 是 LTP 的 Python 封装,提供了分词,词性标注,命名实体识别,依存句法分析,语义角色标注的功能。安装pyltp(python版本3.7以下),下载ltp_data_v3.4.0文件,可参考https://blog.csdn.net/jknpocca/article/details/107675020
notebook
#分句
from pyltp import SentenceSplitter
sents = SentenceSplitter.split('元芳你怎么看?我就趴窗口上看呗!') # 分句
print('\n'.join(sents))
#命名实体识别 import os LTP_DATA_DIR='F:\python-machine-learning-package-win-amd64\ltp_data_v3.4.0' ner_model_path = os.path.join(LTP_DATA_DIR, 'ner.model') # 命名实体识别模型路径,模型名称为`pos.model` from pyltp import NamedEntityRecognizer recognizer = NamedEntityRecognizer() # 初始化实例 recognizer.load(ner_model_path) # 加载模型 words = ['元芳', '你', '怎么', '看'] postags = ['nh', 'r', 'r', 'v'] netags = recognizer.recognize(words, postags) # 命名实体识别 print('\t'.join(netags)) recognizer.release() # 释放模型
#依存句法分析 import os LTP_DATA_DIR='F:\python-machine-learning-package-win-amd64\ltp_data_v3.4.0\ltp_data_v3.4.0' par_model_path = os.path.join(LTP_DATA_DIR, 'parser.model') # 依存句法分析模型路径,模型名称为`parser.model` from pyltp import Parser parser = Parser() # 初始化实例 parser.load(par_model_path) # 加载模型 words = ['元芳', '你', '怎么', '看'] postags = ['nh', 'r', 'r', 'v'] arcs = parser.parse(words, postags) # 句法分析 print("\t".join("%d:%s" % (arc.head, arc.relation) for arc in arcs)) parser.release() # 释放模型
#语义角色标注 import os LTP_DATA_DIR='F:\python-machine-learning-package-win-amd64\ltp_data_v3.4.0\ltp_data_v3.4.0' srl_model_path = os.path.join(LTP_DATA_DIR, 'pisrl_win.model') # 语义角色标注模型目录路径,模型目录为`srl`。注意该模型路径是一个目录,而不是一个文件。 from pyltp import SementicRoleLabeller labeller = SementicRoleLabeller() # 初始化实例 labeller.load(srl_model_path) # 加载模型 words = ['元芳', '你', '怎么', '看'] postags = ['nh', 'r', 'r', 'v'] # arcs 使用依存句法分析的结果 roles = labeller.label(words, postags, arcs) # 语义角色标注 # 打印结果 for role in roles: print(role.index, "".join( ["%s:(%d,%d)" % (arg.name, arg.range.start, arg.range.end) for arg in role.arguments])) labeller.release() # 释放模
“结巴”分词是一个Python 中文分词组件,参见https://github.com/fxsjy/jieba
可以对中文文本进行分词、词性标注、关键词抽取等功能,并且支持自定义词典。
jieba分词的原理
安装包jieba分词包 :pip install jieba
实践(工具:Anaconda的notebook)
import jieba
if __name__ == '__main__':
#jieba分词有三种不同的分词模式:精确模式、全模式和搜索引擎模式:
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("他来到了网易杭研大厦", HMM=False) #不使用HMM模型
print("/".join(seg_list))
seg_list = jieba.cut("他来到了网易杭研大厦", HMM=True) #使用HMM模型
print("/".join(seg_list))
seg_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所,后在日本京都大学深造", HMM=False) #搜索引擎模式
print("/".join(seg_list))
seg_list = jieba.lcut_for_search("小明硕士毕业于中国科学院计算所,后在日本京都大学深造", HMM=True)
print(seg_list)
有两种算法,基于TF-IDF和基于TextRank
import jieba.analyse as analyse
text = "坚定着信念,接受着试练,地平线已不再遥远"
# TF-IDF
tf_result = analyse.extract_tags(text, topK=5) # topK指定数量,默认20
print(tf_result)
# TextRank
tr_result = analyse.textrank(text, topK=5) # topK指定数量,默认20
print(tr_result)
#读取数据与分词 import jieba filepaths = ['NLPdata/test1.txt', 'NLPdata/test2.txt', 'NLPdata/test3.txt', 'NLPdata/test4.txt'] docs = [open(f).read() for f in filepaths] docs = [jieba.lcut(doc) for doc in docs] docs #.去除停止词,只保留词语长度大于1的 docs = [[w for w in doc if len(w)>1] for doc in docs] #sklearn默认分析的语言是英文,我们要组织成类似英文那样以空格间隔的语言形式。 #corpus现在是一个列表,列表中有四个字符串。 #每个字符串就是一个文档 corpus = [' '.join(doc) for doc in docs] corpus #构建Tfidf矩阵每一行代表一个test的文档,每一列代表一个词语的tfidf值。学过的sklearn的都知道fit和transform的意义,如果对tfidf不懂的可以查看咱们之前分享的文章。 from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.decomposition import LatentDirichletAllocation tfidf = TfidfVectorizer() tfidf_matrix = tfidf.fit_transform(corpus) tfidf_matrix #LDA分析 lda = LatentDirichletAllocation(n_components=2, random_state=0) docres = lda.fit_transform(tfidf_matrix) docres
import nltk import math import string from sklearn.feature_extraction.text import TfidfVectorizer corpus = ['祝福你前程似锦', '祝福你未来星光璀璨', '祝福你求仁得仁,' ] vectorizer = TfidfVectorizer(min_df=1) cret = vectorizer.fit_transform(corpus) print(cret) fnames = vectorizer.get_feature_names() print(fnames) arr = vectorizer.fit_transform(corpus).toarray() print(arr) #!/usr/bin/python没有词cnews.train_jieba # -*- coding:utf-8 -*- import jieba,os,re from gensim import corpora, models, similarities """创建停用词列表""" def stopwordslist(): stopwords = [line.strip() for line in open('./stopwords.txt',encoding='UTF-8').readlines()] return stopwords """对句子进行中文分词""" def seg_depart(sentence): sentence_depart = jieba.cut(sentence.strip()) stopwords = stopwordslist() outstr = '' for word in sentence_depart: if word not in stopwords: outstr += word outstr += " " # outstr:'黄蜂 湖人 首发 科比 带伤 战 保罗 加索尔 ...' return outstr """如果文档还没分词,就进行分词""" if not os.path.exists('./cnews.train_jieba.txt'): # 给出文档路径 filename = "./cnews.train.txt" outfilename = "./cnews.train_jieba.txt" inputs = open(filename, 'r', encoding='UTF-8') outputs = open(outfilename, 'w', encoding='UTF-8') # 把非汉字的字符全部去掉 for line in inputs: line = line.split('\t')[1] line = re.sub(r'[^\u4e00-\u9fa5]+','',line) line_seg = seg_depart(line.strip()) outputs.write(line_seg.strip() + '\n') outputs.close() inputs.close() print("删除停用词和分词成功!!!") #分词cnews.train。txxt # @Blog :http://blog.csdn.net/u010105243/article/ # Python3 import jieba # jieba.load_userdict('userdict.txt') # 创建停用词list def stopwordslist(filepath): stopwords = [line.strip() for line in open(filepath, 'r', encoding='utf-8').readlines()] return stopwords # 对句子进行分词 def seg_sentence(sentence): sentence_seged = jieba.cut(sentence.strip()) stopwords = stopwordslist('./stopwords.txt') # 这里加载停用词的路径 outstr = '' for word in sentence_seged: if word not in stopwords: if word != '\t': outstr += word outstr += " " return outstr inputs = open('./cnews.train.txt', 'r', encoding='utf-8') outputs = open('./cnews.train_jieba.txt', 'w',encoding='utf-8') for line in inputs: line_seg = seg_sentence(line) # 这里的返回值是字符串 outputs.write(line_seg + '\n') outputs.close() inputs.close() """准备好训练语料,整理成gensim需要的输入格式""" fr = open('./cnews.train_jieba.txt', 'r',encoding='utf-8') train = [] for line in fr.readlines(): line = [word.strip() for word in line.split(' ')] train.append(line) # train: [['黄蜂', '湖人', '首发', '科比', '带伤', '战',...],[...],...] """构建词频矩阵,训练LDA模型""" dictionary = corpora.Dictionary(train) # corpus[0]: [(0, 1), (1, 1), (2, 1), (3, 1), (4, 1),...] # corpus是把每条新闻ID化后的结果,每个元素是新闻中的每个词语,在字典中的ID和频率 corpus = [dictionary.doc2bow(text) for text in train] lda = models.LdaModel(corpus=corpus, id2word=dictionary, num_topics=3) topic_list = lda.print_topics(3) print("3个主题的单词分布为:\n") for topic in topic_list: print(topic)
pkuseg结果跟LTP一样,但是更直观
pkuseg
#分词同时进行词性标注
seg = pkuseg.pkuseg(postag=True) # 开启词性标注功能
text = seg.cut('元芳你怎么看') # 进行分词和词性标注
print(text)
pyltp
#词性标注
import os
from pyltp import Segmentor
from pyltp import Postagger
LTP_DATA_DIR='F:\python-machine-learning-package-win-amd64\ltp_data_v3.4.0'
pos_model_path = os.path.join(LTP_DATA_DIR, 'pos.model') # 词性标注模型路径,模型名称为`pos.model`
postagger = Postagger() # 初始化实例
postagger.load(pos_model_path) # 加载模型
words = ['元芳', '你', '怎么', '看'] # 分词结果
postags = postagger.postag(words) # 词性标注
print('\t'.join(postags))
postagger.release() # 释放模型
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。