自然语言处理(NLP)-nltk 安装 wordnet使用简介

自然语言处理( Natural Language Processing, NLP)是计算机科学领域与人工智能领域中的一个重要方向。nltk (Natural Language Toolkit),自然语言处理工具包,在NLP领域中,最常使用的一个Python库。

nltk是一个开源的项目,包含:Python模块,数据集和教程,用于NLP的研究和开发;NLTK由Steven Bird和Edward Loper在宾夕法尼亚大学计算机和信息科学系开发。NLTK包括图形演示和示例数据。其提供的教程解释了工具包支持的语言处理任务背后的基本概念。

一、安装

NLTK requires Python versions 3.5, 3.6, 3.7, 3.8, or 3.9

Mac/Unix的环境下: pip install –user -U nltk

windows环境下:http://www.python.org/downloads/ 下载后安装,也可以在cmd窗口下通过pip命令按照。

二、语料下载

我们使用windows环境,在cmd命令下输入python,回车,进去python命令交互窗口,然后输入一下代码;也可以是在IED里输入一下代码,之后运行脚本。

import nltk
#然后下载语料库
nltk.download()

代码运行后会弹出窗口如下,按需下载,我最初不确定自己会用什么语料,所以双击了all。整个下载完占用3个G左右的空间。

nltk下载界面

其中corpora为语料库,也可以下载自己需要的语料库:http://www.nltk.org/nltk_data/

corpora中有好多文章和字典,wordnet是面向语义的词典,names里包含了好多名字,stopwords包含了可忽略的语法上的高频词汇,words包含平时常用的单词可用来做拼写检查,还有city_database,webtext,unicode_samples等语料。

wordnet语料库:wordnet是普林斯顿大学创建的语义词典,特点是其中包含了大量的单词间的联系,可以看作是一个巨大的词汇网络。

词与词之间的关系可以为同义,反义,上下位(水果-苹果),整体部分(汽车-轮胎)。建立关系是大脑学习的首要过程,知识的脉络必定可达,孤立点会被遗忘。

wordnet API:http://www.nltk.org/howto/wordnet.html

三、语料使用

使用的时候直接import即可,如

from nltk.corpus import gutenberg
from nltk.corpus import stopwords

使用 wordnet

from nltk.corpus import wordnet as wn
from nltk.corpus import wordnet as wn
print(wn.synsets('food'))
# 输出:[Synset('food.n.01'), Synset('food.n.02'), Synset('food.n.03')]

注: synsets()用来查询一个单词,返回结果是Synset数组,一个Synset由 单词-词性-序号 组成

streamlit

streamlit – The fastest way to build and share data apps 是专门针对机器学习和数据科学团队的应用开发框架,你可以认为它的目标是取代Flask在机器学习项目中的地位从而帮助机器学习工程师快速开发用户交互工具。

源码传送门: https://github.com/streamlit/streamlit

关于streamlit的介绍和教程网上可以搜到,不再做过多的冗余介绍,当然本篇依旧是入门篇,不过我们会用实际的数据来看一下它基本的效果。我们要用DogeCoin狗狗币的历史数据来画一些有意思的图,并利用streamlit来展示出来,整个过程也是对streamlit的初步认识。废话不多说,开始撸代码。

1、安装

pip install streamlit

2、狗狗币数据一览

DogeCoin数据一览、

3、引入相关python包

import streamlit as st
import pandas as pd
import plotly.graph_objects as go

4、自定义函数

# 加载数据
def load_dogecoin_data():
    ss = pd.read_csv("D:/path/to/dogecoin/doge_history.csv")
    ss = ss.set_index(pd.DatetimeIndex(ss['tickertime']))
    ss = ss.drop(columns=['Unnamed: 0', 'tickertime'])
    ss = ss.sort_index()
    return ss

# 设置开始结束日期
def get_inputs():
    # 设置边框输入栏
    start_date = st.sidebar.text_input("开始日期:", "2019-12-01")
    end_date = st.sidebar.text_input("结束日期:", "2021-05-16")
    return start_date, end_date

# 按日期加载数据
def get_data(start, end):
    data = load_dogecoin_data()
    start = pd.to_datetime(start)
    end = pd.to_datetime(end)
    return data.loc[start: end]

5、数据初始化

_start, _end = get_inputs()
df = get_data(_start, _end)

6、各种画图

fig = go.Figure(data=[go.Candlestick(
    x=df.index,
    open=df['openprice'],
    close=df['closeprice'],
    high=df['high'],
    low=df['low'],
    increasing_line_color='red',
    decreasing_line_color='green'
)])

st.title('Analysis DogeCoin by Streamlit!')
st.header('DogeCoin data')
st.write(df)
st.header('DogeCoin Statistics')
st.write(df.describe())
st.header('DogeCoin Volume')
st.bar_chart(df['vol'])
st.header('DogeCoin Close Price')
st.line_chart(df['closeprice'])
st.header('DogeCoin Candle Stick')
st.plotly_chart(fig)

7、运行

streamlit run streamlit_app.py

8、效果展示

我们可以在浏览器中看到运行的效果,打开浏览器输入地址,http://localhost:8501/

streamlit sidebar效果

在浏览器的左侧边框可以看到初始化的文本框,我们可以自己手动输入日期,然后按回车,那么浏览器对应的其它图会自动从新加载指定日期的数据。

streamlit 基本效果图标1
streamlit 基本效果图2

整个浏览器中看到的图都是动态的,可以通过鼠标滚动或者单击挪动图的具体内容。

参考: https://zhuanlan.zhihu.com/p/85741306

机器学习-拉普拉斯平滑(Laplacian smoothing)

零概率和拉普拉斯修正

拉普拉斯平滑(Laplacian smoothing) 是为了解决零概率的问题。拉普拉斯是一个人名,他是法国数学家,并且最早提出用 加1 的方法来估计没有出现过的现象的概率。

零概率问题:在计算事件的概率时,如果某个事件在观察样本库(训练集)中没有出现过,会导致该事件的概率结果是0。这是不合理的,不能因为一个事件没有观察到,就被认为该事件一定不可能发生(即该事件的概率为0)。至于可能出现零概率问题的情况在贝叶斯定理实现是容易出现。

理论假设:假定训练样本很大时,每个分量x的计数加1造成的估计概率变化可以忽略不计,但可以方便有效的避免零概率问题。

举一个例子?来说明一下,如下图,有很多的“0”值,如何把零值影响规避掉呢?

零概率问题

previous : P(wi | wi-1) = c(wi-1, wi) / c(wi)
using smoothing: P(wi | wi-1) = ( c(wi-1, wi) + 1 ) / (c(wi-1) + V)
Then we can ensure that the p will not be zero. Now we can estimate this mothed.
We can use the Reconsitituted formula: c(wi-1, wi) = P(wi | wi-1) * c(wi-1) = ( c(wi-1, wi) + 1 ) / (c(wi-1) + V) * c(wi-1).

总结:分子加一,分母加V,V代表类别数目。
拉普拉斯修正后的数据

再进一步总结就如下:

总结拉普拉斯

场景举栗子:

假设在文本分类中,有3个类:C1、C2、C3。
在指定的训练样本中,某个词语K1,在各个类中观测计数分别为0,990,10。
则对应K1的概率为0,0.99,0.01。

显然C1类中概率为0,不符合实际。

于是对这三个量使用拉普拉斯平滑的计算方法如下:
  1/1003 = 0.001,991/1003=0.988,11/1003=0.011
  
在实际的使用中也经常使用加 λ(0≤λ≤1)来代替简单加1。如果对N个计数都加上λ,这时分母也要记得加上N*λ