之前有个小伙伴做作家文风分析,大概就是将作家的文章做处理,然后分析作家的写作风格和一些细节上的习惯,显然首先要做的就是将所有文章都分成一个个词然后进行统计,手动分词的话显然是个很复杂的工程,想起来之前看过搜索引擎分词相关的文章,所以就去找了下python分词相关的东西,果然找到了一个非常好用的库——jieba。
照例先上官方文档,里面有详细的安装方法和简单的介绍和演示,下面就以莫言《红高粱》为例看一下jiaba分词的效果。思路就是将文章进行分解,将每一个词都存到数据库中然后进行分析。
# -*- coding:UTF-8 -*-
import pymysql
#导入jieba词性标注
from jieba import posseg
db_config ={
'host': '127.0.0.1',
'port': 3306,
'user': 'root',
'password': 'root',
'db': 'compword',
'charset': 'utf8'
}
connection = pymysql.connect(**db_config)
with open(r'G:\testData\red.txt', 'r') as file:
lines = file.readlines()
for line in lines:
words = posseg.cut(line.strip())
with connection.cursor() as cursor:
sql = 'insert into words(word, flag) values(%s, %s)'
for word in words:
cursor.execute(sql, (word.word, word.flag))
connection.commit()
connection.close()
上面的代码就是将存在G盘的文章一行一行地读取并去掉空格进行分词并以词性标注,然后存入数据库,主要语句就是
words = posseg.cut(line.strip())
然后再用上次介绍到的plotly做图形,代码及效果图如下:
import pandas
import plotly as py
import plotly.graph_objs as go
import pymysql
py.tools.set_credentials_file(username='venidi', api_key='***********')
db_config ={
'host': '127.0.0.1',
'port': 3306,
'user': 'root',
'password': 'root',
'db': 'compword',
'charset': 'utf8'
}
connection = pymysql.connect(**db_config)
with connection.cursor() as cursor:
sql = 'select flag,count(*) from words GROUP BY flag'
cursor.execute(sql)
rows = cursor.fetchall()
# 使用Pandas中的DataFrame处理便于plotly的使用,转换成DataFarame的格式,类似二维表
df = pandas.DataFrame([[ij for ij in i] for i in rows])
df.rename(columns={0: 'flag', 1: 'count'}, inplace=True)
trace1 = go.Bar(
x=df['flag'],
y=df['count']
)
data = [trace1]
# 离线形式存储形成的图表
py.offline.plot(data, filename='g:/test2.html')
结果如下,各词性使用数量
连词使用量
import pandas
import plotly as py
import plotly.graph_objs as go
import pymysql
py.tools.set_credentials_file(username='venidi', api_key='**********')
db_config ={
'host': '127.0.0.1',
'port': 3306,
'user': 'root',
'password': 'root',
'db': 'compword',
'charset': 'utf8'
}
connection = pymysql.connect(**db_config)
with connection.cursor() as cursor:
sql = 'select word,count(*) from words where flag = "c" GROUP BY word '
cursor.execute(sql)
rows = cursor.fetchall()
# 使用Pandas中的DataFrame处理便于plotly的使用,转换成DataFarame的格式,类似二维表
df = pandas.DataFrame([[ij for ij in i] for i in rows])
df.rename(columns={0: 'word', 1: 'count'}, inplace=True)
trace1 = go.Scatter(
x=df['word'],
y=df['count'],
mode = 'markers'
)
data = [trace1]
# 离线形式存储形成的图表
py.offline.plot(data, filename='g:/test.html')
结果:
好了,大概就是这样了,另外关于中文信息处理分析啥的我不太懂,就是听小伙伴转述,有不对的地方还请见谅,文章中有错误的话欢迎大家指正O(∩_∩)O。