当前位置: 首页 > 工具软件 > TextBlob > 使用案例 >

自然语言典型工具TextBlob、Gensim、Polyglot,关键词抽取(jieba、TF-IDF、textrank)和特征提取(CountVectorizer、TfidfVectorizer)

翟泰
2023-12-01

一.自然语言处理的典型工具

自然语言处理的三项基本技术为单词切分句法分析语义理解

1. TextBlob

TextBlob是自然语言处理的python库。它为常见的自然语言处理提供一个简单地API,例如单词标注、名词短语提取、情感分析、分类、翻译等。
TextBlob安装命令pip install -U textblob
python -m textblob.download_corpora

from textblob import TextBlob
text='I feel happy today. I feel sad.'
blob=TextBlob(text)
#第一句情感分析
first=blob.sentences[0].sentiment
print(first)
#第二句情感分析
second=blob.sentences[1].sentiment
print(second)
#总的
all=blob.sentiment
print(all)
运行结果:
Sentiment(polarity=0.8, subjectivity=1.0)
Sentiment(polarity=-0.5, subjectivity=1.0)
Sentiment(polarity=0.15000000000000002, subjectivity=1.0)

情感极性为0.8,-0.5,0。15,主观性为1.0.情感极性的变化范围为【-1,1】,-1代表完全负面,1代表完全正面。

2. Gensim

Gensim也是一个用于自然语言处理的python库,主要功能是自动提取语义主题。
Gensim可以处理非结构化的数值化文本,是一个通过衡量词组(或更高结构,如整句或文档)模式来挖掘文档语义结构的工具。
安装命令:pip install genism

import jieba
from gensim import corpora
def word_cutting(word):
    ls=[]
    for i in word:
        ll=jieba.lcut(i)
        ls.append(ll)
    return ls
documents=['Gensim也是一个用于自然语言处理的python库']
texts=word_cutting(documents)
print(texts)
print(' '.join(texts[0]))
dictionary=corpora.Dictionary(texts)
print(dictionary.token2id)
运行结果:
[['Gensim', '也', '是', '一个', '用于', '自然语言', '处理', '的', 'python', '库']]
Gensim 也 是 一个 用于 自然语言 处理 的 python 库
{'Gensim': 0, 'python': 1, '一个': 2, '也': 3, '处理': 4, '库': 5, '是': 6, '用于': 7, '的': 8, '自然语言': 9}

3. Polyglot

polyglot是功能强大且支持Pipeline(管道流)方式的多语言处理python工具包。
安装命令为:pip install polyglot

二. jieba实现词性标注和关键词抽取

结巴用于自然语言处理的python库,完美支持中文分词。
jieba安装命令为:pip install jieba

1.jieba实现词性标注

import jieba
import jieba.analyse
import jieba.posseg
str='我来到了北京清华大学'
seg_list=jieba.posseg.cut(str)
outstr=''
for x in seg_list:
    outstr+='{}/{},'.format(x.word,x.flag)
print(outstr)

运行结果:
我/r,来到/v,了/ul,北京/ns,清华大学/nt,

2.基于TF-IDF算法的关键词抽取

jieba关键词提取方法:jieba.analyse.extanct_tags()
jieba.analuse.extanct_tags(sentences,topk=20,withWeight=Flase,allowPOS=())
其中,sentence:代提取文本
topK:返回TF-IDF权重最大的关键词,默认为20
withWeightr:是否一并返回关键词权重值,默认为FLASE
allowPOS:仅包括指定词性的词

import jieba
import jieba.analyse
str='我来到了北京清华大学'
seg_list=jieba.analyse.extract_tags(str)
print(' '.join(seg_list))
运行结果:
清华大学 来到 北京

3.基于TextRank算法的关键词抽取

jieba关键词提取方法:jieba.analyse.textrank()
jieba.analyse.textrank(sentence,topk=20,withWeight=Flase,allowPOS=(‘ns’,‘n’,‘vn’,‘v’))

import jieba
import jieba.analyse
text='线程是程序执行时的最小单位,它是进程的执行流,在多CPU环境下就允许多个线程同时运行。' \
     '同样多线程也可以实现开发操作,每个请求分配一个线程来处理'
tags=jieba.analyse.textrank(text,withWeight=True)
for x,w in tags:
    print(x,w)
运行结果:
线程 1.0
操作 0.6174979298762336
分配 0.6169869132378641
请求 0.6150294825657957
允许 0.5754017857185157
进程 0.5357151017749702
开发 0.4739203521546845
单位 0.4730437236292663
程序执行 0.41006124402029
运行 0.3708019296978289
处理 0.33480108226624467
实现 0.3285670222363986
执行 0.2908959635956896
环境 0.2255843975147267

三. Gensim查找相似词

Gensim三大核心概念为:文集(语料)、向量、模型。

import jieba
import jieba.posseg as posseg
from jieba.analyse import textrank,extract_tags
import jieba.finalseg
from gensim import corpora,models,similarities

#1.jiaba中文词性标注
text="我爱天安门"
poss=posseg.lcut(text)
print(poss)

#2.jiaba关键词提取
text1="我来到了北京清华大学"
tags=extract_tags(text1,5)
trank=textrank(text1,6,withWeight=True)
print(" ".join(tags))
print(trank)


# 3.gensim三大核心:语料、向量、模型
documents=['物联网是新一代信息技术的重要组成部分','也是信息化时代的重要发展阶段']
texts=[jieba.lcut(w) for w in documents]
# 将文本生成语料库
dictionary=corpora.Dictionary(texts)
print(dictionary.token2id)
#文档表示成向量
bow_corpus=[dictionary.doc2bow(text) for text in texts]
print(bow_corpus)
#模型
tfidf=models.TfidfModel(bow_corpus)
print(tfidf)
运行结果:
[['物', '联网', '是', '新一代', '信息技术', '的', '重要', '组成部分'], ['也', '是', '信息化', '时代', '的', '重要', '发展', '阶段']]
{'信息技术': 0, '新一代': 1, '是': 2, '物': 3, '的': 4, '组成部分': 5, '联网': 6, '重要': 7, '也': 8, '信息化': 9, '发展': 10, '时代': 11, '阶段': 12}
[[(0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1), (6, 1), (7, 1)], [(2, 1), (4, 1), (7, 1), (8, 1), (9, 1), (10, 1), (11, 1), (12, 1)]]
TfidfModel(num_docs=2, num_nnz=16)

gensim查找相似度

from gensim import corpora
import jieba
from gensim import models
import gensim
from gensim import similarities
l1=['你的名字是什么','你今年几岁了','你有多高,你年龄多大','你体重多少']
a='你年龄多大了'
all_doc_list=[]
for doc in l1:
    doc_list=[word for word in jieba.cut(doc)]
    all_doc_list.append(doc_list)

print(all_doc_list)
doc_test_list=[word for word in jieba.cut(a)]
print(doc_test_list)
#制作语料库
dictionary=corpora.Dictionary(all_doc_list)
print(dictionary.token2id)

#向量
corpus=[dictionary.doc2bow(doc) for doc in all_doc_list]
print(corpus)
#寻找相似度的分词列表做成词料库
doc_test_vec=dictionary.doc2bow(doc_test_list)
print('doc_test_vec',doc_test_vec)

#模型
lsi=models.TfidfModel(corpus)
print("lsi=",lsi)

#语料库训练结果
print(lsi[corpus])
print(lsi[doc_test_vec])

index=similarities.SparseMatrixSimilarity(lsi[corpus],num_features=len(dictionary.keys()))
print("index=",index)
sim=index[lsi[doc_test_vec]]
print("sim=",sim)

cc=sorted(enumerate(sim),key=lambda item:item[1],reverse=True)
print(cc)
text=l1[cc[0][0]]
print(a,text)


四. TextBlob

1.词性标注
词性就是词的分类,TextBlob中的属性tags表示词性。

from textblob import TextBlob
str='python is a high-level,general-purpose programming language.'
str1=TextBlob(str)
print(str1.tags)

2.英文情感分析
TextBlobs的属性sentiment进行情感分析,返回一个元组sentiment(polarity,subjectivity)
其中,priority:范围为【-1,1】,-1表示消极,1表示积极
subjectivity:范围为【0,1】,0表示客观,1表示主观。

from textblob import TextBlob
str2=TextBlob('I am glad')
print(str2.sentiment)
str3=TextBlob('I am sad')
print(str3.sentiment)

3.分句提取
利用TextBlob的属性sentences可以进行分句提取,返回一个句子列表。

from textblob import TextBlob
str4=TextBlob('I am glad.''I am sad.''I am complex.')
print(str4.sentences)

4.中文情感分析

利用TextBlob进行中文情感分析,需要安装Snownlp库,安装命令pip install snownlp

from snownlp import SnowNLP
text='我今天很快乐。我今天很悲伤。'
s=SnowNLP(text)
print(SnowNLP(s.sentences[0].sentiments))
print(SnowNLP(s.sentences[1].sentiments))

五. CountVectorizer和TfidfVectorizer

1.CountVectorizer特征提取

from sklearn.feature_extraction.text import TfidfVectorizer,CountVectorizer
texts=['我 爱 北京','北京 是 首都','中国 北京']
cv=CountVectorizer()
cv_fit=cv.fit_transform(texts)
print(cv.vocabulary_)
print(cv_fit)
print(cv_fit.toarray())
{'北京': 1, '首都': 2, '中国': 0}
  (0, 1)	1
  (1, 1)	1
  (1, 2)	1
  (2, 1)	1
  (2, 0)	1
[[0 1 0]
 [0 1 1]
 [1 1 0]]

2.TfidfVectorizer特征提取

from sklearn.feature_extraction.text import TfidfVectorizer,CountVectorizer
texts=['我 爱 北京','北京 是 首都','中国 北京']
cv=TfidfVectorizer()
cv_fit=cv.fit_transform(texts)
print(cv.vocabulary_)
print(cv_fit)
print(cv_fit.toarray())
{'北京': 1, '首都': 2, '中国': 0}
  (0, 1)	1.0
  (1, 2)	0.8610369959439764
  (1, 1)	0.5085423203783267
  (2, 0)	0.8610369959439764
  (2, 1)	0.5085423203783267
[[0.         1.         0.        ]
 [0.         0.50854232 0.861037  ]
 [0.861037   0.50854232 0.        ]]

3. tfidf计算单词的关联度

import numpy as np
from sklearn.feature_extraction.text import CountVectorizer,TfidfTransformer

#文本
text=np.array(["I come to beijing","beijing is capital","I like beijing"])
#文本转化为特征向量
count=CountVectorizer(ngram_range=(1,1))
#文本进行训练
bag=count.fit_transform(text)
print(count.get_feature_names())
print(count.vocabulary_)
print(bag)
print(bag.toarray())

#tfidf计算单词的关联度
tfidf=TfidfTransformer()
trans=tfidf.fit_transform(bag)
print(trans)
print(trans.toarray())
 类似资料: