宏鹏同学的学习笔记

  • Startseite

  • Archiv

词云

Veröffentlicht am 2018-07-19

词云统计

绝大不扽词频统计工具都是基于分词后构建词条的list进行,因此首先需要完成相应的分词工作。

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
29
30
31
32
33
import pandas as pd
f = open(r"C:\Users\Wang\Desktop\PythonData\金庸-射雕英雄传txt精校版.txt" , encoding = "GBK")
raw = pd.read_table(f,names = ['txt'],sep='aaa')#sep设置成"aaa"是为了把一整段当一个东西读入
#print(raw)

def m_head(tmpstr):
return tmpstr[:1]

def m_mid(tmpstr):
return tmpstr.find("回 ")

raw['head'] = raw.txt.apply(m_head)#apply怎么用?
raw['mid'] = raw.txt.apply(m_mid)
raw['len'] = raw.txt.apply(len)
raw.head(10)

chapnum = 0

for i in range(len(raw)):
if raw['head'][i] == "第" and raw['mid'][i]>0 and raw['len'][i]<30:
chapnum+=1
if chapnum > 40 and raw['txt'][i] == "附录一:成吉思汗家族":
chapnum = 0
raw.loc[i,'chap'] = chapnum#设定一个chap列

#删除临时变量
del raw['head']
del raw['mid']
del raw['len']

rawgrp = raw.groupby('chap')
chapter = rawgrp.agg(sum)#agg怎么用?
chapter = chapter[chapter.index!=0]
c:\users\wang\appdata\local\programs\python\python36-32\lib\site-packages\ipykernel_launcher.py:3: ParserWarning: Falling back to the 'python' engine because the 'c' engine does not support regex separators (separators > 1 char and different from '\s+' are interpreted as regex); you can avoid this warning by specifying engine='python'.
  This is separate from the ipykernel package so we can avoid doing imports until
1
2
3
4
import jieba 

word_list = jieba.lcut(chapter.txt[1])
word_list[:10]
['第一回', ' ', '风雪', '惊变', '钱塘江', '浩浩', '江水', ',', '日日夜夜', '无穷']

构建完list之后,也可以自行编写词频统计程序,框架如下:

遍历整个list,对每个词条:

if word in d:

d[word] + = 1

else:

d[word] = 1

使用Pandas统计

1
2
3
4
import pandas as pd

df = pd.DataFrame(word_list,columns = ['word'])
df.head(5)































word
0 第一回
1
2 风雪
3 惊变
4 钱塘江

1
2
3
4
5
result = df.groupby(['word']).size()#按照word来分组,使用size来获得词频
print(type(result))

freqlist = result.sort_values(ascending=False)
freqlist[:20]
<class 'pandas.core.series.Series'>





word
,      2034
。       714
了       400
“       344
:       343
”       342
的       291
道       210
他       187
是       168
杨铁心     148
在       140
?       136
包惜弱     114
那       108
又        97
我        94
得        91
也        88
!        85
dtype: int64

使用NLTK统计

NLTK生成的结果为频数字典,在和某些程序包对接时比较有用

1
2
import nltk
word_list[:10]
['第一回', ' ', '风雪', '惊变', '钱塘江', '浩浩', '江水', ',', '日日夜夜', '无穷']
1
2
fdist = nltk.FreqDist(word_list) #生成完整的词条频数字典
fdist
FreqDist({',': 2034, '。': 714, '了': 400, '“': 344, ':': 343, '”': 342, '的': 291, '道': 210, '他': 187, '是': 168, ...})
1
fdist['颜烈'] #就像普通的字典一样操作
37
1
fdist.keys() #列出词条列表,以list形式出现
dict_keys(['第一回', ' ', '风雪', '惊变', '钱塘江', '浩浩', '江水', ',', '日日夜夜', '无穷', '无休', '的'....])
1
fdist.most_common(5) #显示最高频和相应的频数
[(',', 2034), ('。', 714), ('了', 400), ('“', 344), (':', 343)]

词云展示

什么是词云

  • 本质上是对分词结果频数表的图形化展示
  • 对文本中出现频率较高的“关键词”予以视觉上的突出,从而过滤掉大量的文本信息,使浏览网页者只要一眼扫过文本就可以领略文本的主旨
  • 可以在基础词云的基础上进一步衍生,用于表达更富的信息
    • 多彩渲染
    • 加入背景图片
    • 不同主题的结果比较

常见的词云绘制工具

  • Python
    • 比较标准的词云生成功能
    • 可进行背景图片的进一步修饰
  • R
    • 可以展示不用类别间的词云比较
    • 可以实现彩色动态效果的词云
    • 可进行背景图片的进一步修饰
  • Tableau
    • 可以实现词云结果的动态检测和展示
  • 专用工具/网站

绘制词云

###WordCloud的基本语法

class worldcloud.WordCloud

常用功能:

font_path:在图形中使用的字体,默认使用系统字体

width:图形的宽度/高度

max_words = 需要绘制的最多词条数

stopwords = None:停用词列表,不用定时使用系统默认停用词列表

字体设定:

min_font_size = 4/min_font_size = None :字符大小范围

font_step = 1 :字号增加的步长

relative_scaling = 5 :词条频数比例和字号大小比例的换算关系,默认为504

prefer_horizontal = 0.90 : 图中词条水平显示的比例

颜色设定:

background_color = “black” : 图形背景色

mode = “RGB” : 图形颜色编码,如果指定为“RGBA”且背景色为None时,背景色为透明

color_func = None : 生成新颜色的函数,使用matplotlib的colormap

背景淹模:
mask = None : 词云使用的背景图(遮罩)

用原始文本直接分词并绘制

cloudobj = WordCloud().generate(text)

generate实际上是generate_from_text的别名

文本需要用空格/标点符号(英文的标点)分隔单词,否则不能正确分词

import wordcloud
myfont = r'C:\Windows\Fonts\MSYH.ttc'
text = 'this is shanghai, 郭靖,和, 哀牢山 三十六剑'
cloudobj = wordcloud.WordCloud(font_path = myfont).generate(text)
print(cloudobj) # <wordcloud.wordcloud.WordCloud object at 0x16601610>



<wordcloud.wordcloud.WordCloud object at 0x16601610>




import matplotlib.pyplot as plt
plt.imshow(cloudobj)
plt.axis("off") # 关掉坐标轴
plt.show()# 默认词表中有 this is 和

png

cloudobj = wordcloud.WordCloud(font_path= myfont,
                              width = 360 , height = 180,
                              mode = "RGBA",background_color = None).generate(text)

plt.imshow(cloudobj)
plt.axis("off")
plt.show()

png

cloudobj.to_file("词云.png")# wordcloud.WordCloud(font_path = myfont).generate(text).to_file(r"词云.png")





    <wordcloud.wordcloud.WordCloud at 0x179fa5d0>




import pandas as pd
import jieba

stoplist = list(pd.read_csv('C:/Users/Wang/Desktop/PythonData/停用词.txt', names = ['w'], sep = 'aaa',encoding = 'utf-8',engine='python').w)

def m_cut(intxt):
    return [w for w in jieba.cut(intxt) if w not in stoplist]




cloudobj = wordcloud.WordCloud(font_path = myfont,
                              width = 1200, height = 800,
                              mode = "RGBA", background_color = None).generate(' '.join(m_cut(chapter.txt[1])))

plt.imshow(cloudobj)
plt.axis("off")
plt.show()

png

cloudobj.to_file("词云2.png")


    <wordcloud.wordcloud.WordCloud at 0x17d4d0d0>

基于分词频数绘制

generate()实际操作

调用分词函数process_text()

调用基于频数的绘制函数fit_words()

fit_words(dict)

实际上是generate_from_frequencies的别名

Dict: 由词条和频数构成的字典



txt_freq = {'张三':100,'李四':90,'王二麻子':50000000} #绝对数量对大小影响不大
cloudobj = wordcloud.WordCloud(font_path = myfont).fit_words(txt_freq)

plt.imshow(cloudobj)
plt.axis("off")
plt.show()

png

用频数生成射雕第一章的词云

import nltk
from nltk import FreqDist

tokens = m_cut(chapter.txt[1])
fdist = FreqDist(tokens) # 生成完整的词条频数字典
type(fdist)

cloudobj = wordcloud.WordCloud(font_path = myfont,stopwords = stoplist).fit_words(fdist)

plt.imshow(cloudobj)
plt.axis("off")
plt.show()

png

词典和停用词

Veröffentlicht am 2018-07-17

修改词典

动态增删新词

在程序中可以动态根据分词结果,对内存中的词库进行更新。

add_word(word)

word: 新词
freq = none :词频
tag = none :具体词性

del_word(word)

1
2
jieba.add_word("哀牢山三十六剑")#动态更改词典
'/'.join(jieba.cut(tmpstr))
'郭靖/和/哀牢山三十六剑/。'

如果是有大量的词要添加的话,一个一个添加是不效率的,所以我们往往会事先准备词库。

1
2
jieba.del_word("哀牢山三十六剑")
'/'.join(jieba.cut(tmpstr))
'郭靖/和/哀牢山/三十六/剑/。'

使用自定义词典

load_userdict(file_name)

file_name:文件夹对象或自定义词典的路径

词典的基本格式:一个词占一行,词、词频(可省略)、词性(可省略),用空格隔开。词典文件必须用UTF-编码,必要时可以用Uedit进行文件编码转换。

云计算 5

李小福 2 nr

easy_install 3 eng

台中

1
2
3
dict = 'C:/Users/Wang/Desktop/PythonData/金庸小说词库.txt'
jieba.load_userdict(dict) #dict为自定义词典的路径
'/'.join(jieba.cut(tmpstr))
'郭靖/和/哀牢山三十六剑/。'

去除停用词

常见停用词种类

  • 超高频的常用词,基本不携带有效信息/歧义太多无分析价值
    • 的、地、得
  • 虚词:如介词,连词等
    • 只、条、件
    • 当、从、同
  • 专业领域的高频词:基本不携带有效信息
  • 视情况而定的停用词

分词后取出停用词

基本步骤

  1. 读入停用词表文件
  2. 正常分词
  3. 在分词结果中去除停用词

    新列表 = [word in word in 原列表 if word not in 停用词列表]

该方法存在的问题:停用词必须要被分词过程正确拆分出来才行

1
2
newlist = [w for w in jieba.cut(tmpstr) if w not in ['和','。']]
print(newlist)
['郭靖', '哀牢山三十六剑']

当停用词很多时,我们可以先读入外部文件并且把它转化为列表。

1
2
3
import pandas as pd
tmpdf = pd.read_csv('C:/Users/Wang/Desktop/PythonData/停用词.txt', names = ['w'], sep = 'aaa',encoding = 'utf-8')
tmpdf.head()
c:\users\wang\appdata\local\programs\python\python36-32\lib\site-packages\ipykernel_launcher.py:2: ParserWarning: Falling back to the 'python' engine because the 'c' engine does not support regex separators (separators > 1 char and different from '\s+' are interpreted as regex); you can avoid this warning by specifying engine='python'.































w
0 ,
1 ,
2 、
3 ;
4 :

1
[ w for w in jieba.cut(tmpstr) if w not in list(tmpdf.w)]
['郭靖', '哀牢山三十六剑']

用extract_tags函数去除停用词

方法特点:

  • 根据TF-IDF算法将特征词提取出来,在提取之前去掉停用词
  • 可以人工指定停用词字典
  • jieba.analyse.set_stop_words()
1
2
3
import jieba.analyse as ana
ana.set_stop_words('C:/Users/Wang/Desktop/PythonData/停用词.txt')
jieba.lcut(tmpstr)# 读入停用词列表对分词结果无效
['郭靖', '和', '哀牢山三十六剑', '。']
1
ana.extract_tags(tmpstr,topK=20) #使用TF-IDF算法提取关键词,并同时去掉停用词
['郭靖', '哀牢山三十六剑']

结巴分词的基本使用方法

Veröffentlicht am 2018-07-17

jieba是目前应用最广,评价也比较高的分词工具包

安装

pip install jieba

基本特点

三种分词模式

  • 精确模式,试图将句子最精确地切开,适合做文本分析
  • 全模式,把句子中所有的可有成词的词语都扫描出来,速度非常快,但是不能解决歧义
  • 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词

支持繁体分词

支持自定义词典

1
2
3
4
import jieba
tmpstr = "郭靖和哀牢山三十六剑。"
res = jieba.cut(tmpstr)#精确模式
print(res) #是一个可迭代的generator,可以使用for循环来遍历结果,本质上类似list
<generator object Tokenizer.cut at 0x04CADA50>
1
print("/".join(res)) # 用“/”把之前分好的词串起来
郭靖/和/哀牢山/三十六/剑/。
1
print(jieba.lcut(tmpstr)) #用lcut函数结果直接输出为list
['郭靖', '和', '哀牢山', '三十六', '剑', '。']
1
print("/".join(jieba.cut(tmpstr,cut_all = True))) #全模式(加了一个cut_all = True),把所有可能(三十/三十六/十六)都输出了。全模式中句尾符号被去掉了
郭/靖/和/哀牢山/三十/三十六/十六/剑//
1
print("/".join(jieba.cut_for_search(tmpstr)))#搜索引擎模式cut_for_search,为了提高搜索引擎的效率,并且可以用jieba.lcut_for_search直接生成list
郭靖/和/哀牢山/三十/十六/三十六/剑/。

分词原理

Veröffentlicht am 2018-07-17

分词算法的分类

基于字符串的匹配

  • 即扫描字符串,如果发现字符串的字串和词相同,就算匹配
  • 通常会加入一些启发式规则,比如“正向/反向最大匹配”,“长词优先”等
  • 优点是速度快,但对歧义和未登录词处理不好

基于统计及机器学习的分词方式

  • 基于人工标注的词性和统计特征进行建模,并通过模型计算分词概率
  • 常见的序列标注模型有HMM和CRF
  • 这类分词算法能很好处理歧义和未登录问题,效果比前一类效果好,但是需要大量的人工标注数据,分词速度也比较慢

基于字符串匹配的分词算法原理

  • 以现有的词典为基础进行
  • 最大匹配法:以设定的最大此长度为框架,取出其中最长的匹配词
    • 例:“中华人民共和国”会被完整取出,而不会进一步被分词
    • 最佳匹配法:按照词典中的频率高低,优先取高频词
  • 最大概率法:最句子整体进行分词,找到最佳的词汇排列组合规律
    • 例:早上好→早上/好
  • 最短路径分词:寻找单词数最少的分词方式

分词的难点

  • 分词歧义
    • 我个人没意见
    • 三个人没意见
  • 未登录词识别: 郑成功
    • 数字
    • 实体名称/专业术语
    • 成语
    • 虚词,语气词

松本行弘:我的编程人生

Veröffentlicht am 2018-07-10

看到了一篇松本行弘的老文章,找到了原文并转载,希望自己也能是一个纯粹的人。

私がプログラミングを始めたのは中学校3年生のときでした。父が買ってきたシャープのポケットコンピュータ(PC-1210)でBASICを使うようになったのです。わずか400ステップしか入力できない小さなコンピュータでしたが、それでも自分の命令したとおりに動作するポケコンを見ていると、自分にはなんでもできるようなそんな「万能感」を感じさせてくれました。

それから四半世紀以上たちましたが、私がプログラミングから感じる「わくわく」は少しも減ることはありません。むしろ、どんどん増えているように感じます。長いプログラム経験を踏まえて、いま、感じるのは、

プログラミングは人生だ

ということです。プログラムには人生のあらゆる側面が詰め込まれています。文字どおり、人生そのものといってもいい過ぎではないでしょう。……うーん、やっぱり、いい過ぎかな。

プログラミングはスポーツだ

皆さんの多くは若いときにスポーツに熱中されていたかもしれません。あるいはいまでもスポーツ好きかもしれませんね。スポーツは人生を豊かにしてくれます。少なくともそう聞いています。

あいにく私は子供のときからさほどスポーツが得意ではなかったのですが、それでもスポーツを楽しむ人の気持ちは分かります。そして、プログラミングもスポーツと共通する要素をたくさん持っています。

プログラミングがスポーツだなどというと、懸け離れた印象を持ち、あきれる人もいらっしゃるかもしれません。しかし、例えば西洋ではチェスをスポーツに分類する人もいるくらいで、頭脳を中心とした活動をスポーツと見なすことは決して的外れとはいえません。

プログラミングとスポーツの共通点としてまず考えられるものは、練習と反復による技術の向上です。優れたプログラマになるためには、知識と経験値が重要です。それはまさにスポーツ選手が練習によって自己研鑽(けんさん)するのと同じ構図です。しかも、ときには苦しい練習を彼らは喜んで行うのです。

また、美しさやスピードの追求もスポーツに似ています。優れたプログラマは、自己の「作品」であるプログラムの「美しさ」にこだわります。それはある種のスポーツの「芸術点」の追求に似ています。また、パフォーマンスチューニングするときの、測定とボトルネックの探求、改善は、水泳や陸上の選手と類似の精神構造でしょう。

プログラミングは趣味だ

例えば日本の野球人口に対して、プロ野球の選手になる人はほんのわずかです。多くの人は趣味として野球に接するわけです。同様に趣味としてプログラミングにかかわる人も大勢います。世の中の多くのオープンソースソフトウェアはもともとそのようにして誕生したものがほとんどです。また、プログラムのバグを取る活動は、パズルを解くのと同質の喜びがあります。

一方、プロスポーツ選手とはっきり異なるのは、そんなに好きでもないのに仕事としてプログラミングを選択する人が相当多いことでしょう。スポーツ選手よりもプログラマの方が世の中にたくさんいるからかもしれませんが、個人的にはそれは不幸なことだと思います。

プログラミングはコミュニケーションだ

コンピュータの前に向かうことの多いプログラミングという作業ですが、その多くの部分は意外に人間的です。というのも、いまだにプログラミングそのものを行うコンピュータが登場していないことからも、プログラミングは人間的な活動です。人間にしかできないといってもよいでしょう。

それだけでなく、コンピュータを思いどおりに動かすためにプログラムを作るわけですが、プログラムはあくまでも人間が使うものなので、ヒトが何を求めているか、どのように感じるか、ということが非常に重要な要素になるからです。プログラミングには何が求められているのかを引き出すコミュニケーション力が必要です。また、複数人でプログラムを行うときには、開発メンバ間の意思疎通にもコミュニケーション能力は不可欠です。

プログラミングは創造だ

私がプログラミングを好きで、何年たっても飽きない理由を考えてみると、その最大の理由はプログラミングがクリエイティブな作業であることではないかと思います。

ただ道具としてのコンピュータさえあれば、あとは全く何もないところから、一つの世界をつくり出すことができます。プログラミングの世界には重力や因果など、現実世界に付き物の制約がほとんどありません。このような自由な創造活動は、他に類を見ないでしょう。自分の思うままに世界をつくり出すことができる。それこそがプログラミングの最大の魅力です。

一生プログラミング

プログラミングは、ほかの多くの活動に比較して、体力に依存する部分はそれほど多くありません。もちろん、IT業界の一部で常態化しているという、“徹夜当然”のデスマーチを乗り切るためには、若さと体力が必要かもしれません。

しかし、ほとんどの場合、必要なのは、知識、経験、判断力などで、これらは年齢とともに大幅に低下するようなものではありません。ということは、事情さえ許せば、生涯現役プログラマというのは夢ではないということです。この辺りがプロスポーツ選手とは異なるところです。

しばしば「プログラマ35歳定年説」がいわれることがあります。確かに私の周辺でも30代後半くらいから「めっきりプログラミングしてなくて」という情けない「元プログラマ」が増えていますが、それは能力の低下というより社会的な事情でしょう。優れたプログラマの価値をそれほど認めない日本のIT業界で、年功序列制度による賃金上昇と、職業的価値のバランスが取れなくなる年齢が、35歳くらいということなのでしょう。

事実、海外の著名なプログラマの多くは、年齢を重ねても一線級で活躍している人が珍しくありません。日本でも、私の大学時代の指導教官であった方など、定年で退官した後の方が、事務的な雑事がないから集中できると、ばりばりとコードを量産しています。私もああいうふうに一生現役でありたいものだと思います。

プログラミングは本来楽しいものであり、楽しいからこそ能力が向上し、優れたプログラマになれるのだと私は思います。「仕事だから」とかいう理由を付けて、しかめ面でプログラミングをするのはやめましょう。また、楽しいプログラミングは人生をより実りあるものにしてくれるはずです。私はそう信じています。

第一篇博客

Veröffentlicht am 2018-07-06 | Edited on 2018-07-07

快要毕业了,想通过写博客的方式来记录自己学习的过程。

所以我花了大约一天的时间用Hexo搭建了一个博客,并且花了大约一个小时弄清楚了工作原理和markdown的大致书写方式。

于是,终于可以开始写自己的博客了,虽然对Hexo还不是特别了解,就当是learn by doing吧。

开始写了,一开始不熟练格式可能(一定)会很乱。

写博客的理由

  • 最重要的是可以记录自己学习的轨迹
  • 方便自己复习
  • 看自己写出来的东西就是很爽
  • 可以顺便练习一下git
  • 用md写博客很cooool不是吗

Hello World

Veröffentlicht am 2018-07-06

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment

Wang Hongpeng

7 Artikel
3 Tags
© 2018 Wang Hongpeng
Erstellt mit Hexo v3.7.1
|
Theme — NexT.Muse v6.3.0