中文分词常用的分词工具有jieba等,本文以jieba分词为例,讲解中文文本分析。
来源github:https://github.com/fxsjy/jieba
支持三种分词模式:
支持自定义词典 .
方法接受三个输入参数: 需要分词的字符串;cut_all 参数用来控制是否采用全模式;HMM 参数用来控制是否使用
HMM 模型
方法接受两个参数:需要分词的字符串;是否使用 HMM
模型。该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细 待分词的字符串可以是 unicode 或 UTF-8 字符串、GBK
字符串。注意:不建议直接输入 GBK 字符串,可能无法预料地错误解码成 UTF-8
新建自定义分词器,可用于同时使用不同词典。jieba.dt 为默认分词器,所有全局分词相关函数都是该分词器的映射。
用法: jieba.load_userdict(file_name) # file_name 为文件类对象或自定义词典的路径
词典格式和 dict.txt
一样,一个词占一行;每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒。file_name
若为路径或二进制方式打开的文件,则文件必须为 UTF-8 编码。 词频省略时使用自动计算的能保证分出该词的词频。
使用 add_word(word, freq=None, tag=None) 和 del_word(word)
可在程序中动态修改词典。
使用 suggest_freq(segment, tune=True) 可调节单个词语的词频,使其能(或不能)被分出来。
注意:自动计算的词频在使用 HMM 新词发现功能时可能无效。
import jieba.analyse
jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())
sentence 为待提取的文本
topK 为返回几个 TF/IDF 权重最大的关键词,默认值为 20
withWeight 为是否一并返回关键词权重值,默认值为 False
allowPOS 仅包括指定词性的词,默认值为空,即不筛选
jieba.analyse.TFIDF(idf_path=None) 新建 TFIDF 实例,idf_path 为 IDF 频率文件
jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v')) 直接使用,接口相同,注意默认过滤词性。
jieba.analyse.TextRank() 新建自定义 TextRank 实例
jieba.posseg.POSTokenizer(tokenizer=None) 新建自定义分词器,tokenizer 参数可指定内部使用的 jieba.Tokenizer 分词器。jieba.posseg.dt 为默认词性标注分词器。
标注句子分词后每个词的词性,采用和 ictclas 兼容的标记法。
基于 python 自带的 multiprocessing 模块,目前暂不支持 Windows
用法:
jieba.enable_parallel(4) # 开启并行分词模式,参数为并行进程数
jieba.disable_parallel() # 关闭并行分词模式
demo1:分词
#coding:utf-8
import jieba
words=jieba.cut("他来到了网易杭研大厦")
print ("/".join(words))
demo2 : 加入自定义字典
#coding:utf-8
import jieba
jieba.load_userdict("dict.txt")
words=jieba.cut("他来到了网易杭研大厦")
print ("/".join(words))
print (type(words))
自定义的词典 dict.txt
杭研大厦 100 n
自定义的词典一行上面有三列,第二个是指出现的次数,第三个是词性
也就是说杭研大厦被看作为了一个整体。
demo3:允许程序在运行的时候,动态的修改词典
#coding:utf-8
import jieba
words =jieba.cut("我们中出了一个叛徒",HMM=False)
#jieba.suggest_freq(('中出'),True)
print ('/'.join(words))
使用 suggest_freq(segment, tune=True) 可调节单个词语的词频,使其(或不能)被分出来。
注意:自动计算的词频在使用 HMM 新词发现功能时可能无效。
#coding:utf-8
import jieba
words =jieba.cut("我们中出了一个叛徒",HMM=False)
jieba.suggest_freq(('中出'),True)
#jieba.suggest_freq(('中','出'),True)
print ('/'.join(words))
demo4:词性标注
#coding:utf-8
import jieba.posseg as pseg
words=pseg.cut("我爱北京天安门")
for word ,flag in words:
print ('%s %s' %(word,flag))
demo5:三种模式的分词
# encoding=utf-8
import 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("他来到了网易杭研大厦") # 默认是精确模式
print(", ".join(seg_list))
seg_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所,后在日本京都大学深造") # 搜索引擎模式
print(", ".join(seg_list))
相关参考:
https://www.jianshu.com/p/cdea68108cbf
from gensim import corpora, models, similarities
raw_documents = [
'0无偿居间介绍买卖毒品的行为应如何定性',
'1吸毒男动态持有大量毒品的行为该如何认定',
'2如何区分是非法种植毒品原植物罪还是非法制造毒品罪',
'3为毒贩贩卖毒品提供帮助构成贩卖毒品罪',
'4将自己吸食的毒品原价转让给朋友吸食的行为该如何认定',
'5为获报酬帮人购买毒品的行为该如何认定',
'6毒贩出狱后再次够买毒品途中被抓的行为认定',
'7虚夸毒品功效劝人吸食毒品的行为该如何认定',
'8妻子下落不明丈夫又与他人登记结婚是否为无效婚姻',
'9一方未签字办理的结婚登记是否有效',
'10夫妻双方1990年按农村习俗举办婚礼没有结婚证 一方可否起诉离婚',
'11结婚前对方父母出资购买的住房写我们二人的名字有效吗',
'12身份证被别人冒用无法登记结婚怎么办?',
'13同居后又与他人登记结婚是否构成重婚罪',
'14未办登记只举办结婚仪式可起诉离婚吗',
'15同居多年未办理结婚登记,是否可以向法院起诉要求离婚'
]
载入中文数据以及对应的包,corpora是构造词典的, similarities求相似性可以用得到。
texts = [[word for word in jieba.cut(document, cut_all=True)] for document in raw_documents]
将词语进行分词,并进行存储。
dictionary = corpora.Dictionary(texts)
寻找整篇语料的词典、所有词,corpora.Dictionary。
corpus = [dictionary.doc2bow(text) for text in texts]
建立语料之后,可以采用BOW词袋模型或者TFIDF模型。 .
BOW词袋模型,由doc2bow变为词袋,输出的格式为:
[[(0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1), (6, 1)], [(0, 1), (4, 1), (5, 1), (7, 1), (8, 1), (9, 2), (10, 1)], [(0, 1), (3, 1), (4, 1), (5, 1), (6, 1), (7, 1), (10, 1)]]
例如(9,2)这个元素代表第二篇文档中id为9的单词“silver”出现了2次。 .
TFIDF模型
tfidf = models.TfidfModel(corpus)
使用tf-idf 模型得出该评论集的tf-idf 模型
corpus_tfidf = tfidf[corpus]
此处已经计算得出所有评论的tf-idf 值,在TFIDF的基础上,进行相似性检索。
similarity = similarities.Similarity('Similarity-tfidf-index', corpus_tfidf, num_features=600)
然后进行similarity检索。
print(similarity[test_corpus_tfidf_1]) # 返回最相似的样本材料,(index_of_document, similarity) tuples
当然其中的test_corpus_tfidf_1需要进行预先处理。先变为dow2bow,然后tfidf .
首先进行文本向量化,然后直接调用模型即可。
new_sensence = "16通过下面一句得到语料中每一篇文档对应的稀疏向量"
test_corpus_1 = dictionary.doc2bow(jieba.cut(raw_documents[1], cut_all=True))
vec_tfidf = tfidf[test_corpus_1]
利用doc2bow对其进行分割,然后求tfidf模型。输出的结果即为:
vec_tfidf
Out[82]:
[(1, 0.09586155438319434),
(5, 0.1356476941913782),
(6, 0.09586155438319434),
(8, 0.1356476941913782),
(11, 0.19172310876638868),
(12, 0.38344621753277736),
(13, 0.38344621753277736),
(14, 0.38344621753277736),
(15, 0.16086258119086566),
(16, 0.38344621753277736),
(17, 0.38344621753277736),
(18, 0.38344621753277736)]
for item in corpus_tfidf:
print(item)
tfidf.save("data.tfidf")
tfidf = models.TfidfModel.load("data.tfidf")
print(tfidf.dfs)
相关参考:
https://cloud.tencent.com/developer/article/1010859