Python自然语言处理,机器学习和

by admin on 2019年1月31日

本篇小说不是为着记开发流水账,而是想把支付进度的相逢的标题以及缓解思路和大家进行互换和读书。我是一名普普通通的
PHP
工程师,希望对初级开发同学有所襄助。具体的心体面见面文末的总结

本文实例讲述了Python自然语言处理 NLTK
库用法。分享给大家供大家参考,具体如下:

明天在网查到一篇介绍php中替换字符串中的空格为逗号’,’的篇章,作个日记保存下去。

简介: 机器学习取决于
IT、数学和自然语言的混杂,在大数额应用程序中会日常用到机械学习。本文将研商Python 编程语言和它的 NLTK 库,然后将它们利用于一个机器学习项目。

本月中,我在 GitHub
上开源了一个投机的小品种:chinese-typesetting。这是一个校正中文文案排版的
Composer 包。

在那篇文章中,大家将基于 Python
研究自然语言处理(NLP)。本学科将会选择 Python NLTK 库。NLTK
是一个即时风行的,用于自然语言处理的 Python 库。

复制代码 代码如下:

 

chinese-typesetting
包括以下职能:

那就是说 NLP 到底是哪些?学习 NLP 能带来哪些利益?

<pre name=”code” class=”php”><? php
/*
* 关键词中的空格替换为’,’
*/
public function emptyreplace($str) {
$str = str_replace(‘ ’, ‘ ‘, $str); //替换全角空格为半角
$str = str_replace(‘ ‘, ‘ ‘, $str); //替换延续的空格为一个
$noe = false; //是或不是遇到不是空格的字符
for ($i=0 ; $i<strlen($str); $i++) { //遍历整个字符串
if($noe && $str[$i]==’ ‘) $str[$i] = ‘,’;
//如若当前以此空格此前出现了不是空格的字符
elseif($str[$i]!=’ ‘) $noe=true; //当前以此字符不是空格,定义下 $noe
变量
}
return $str;
}
?>

挑衅:使用机器学习对 RSS 提要拓展分类

  • 在中文与英文字母/用于数学、科学和工程的希腊共和国(The Republic of Greece)字母/数字之间添加空格;
  • 有限度的全角转半角(英文、数字、空格以及部分特殊字符等拔取半角字符);
  • 修补错误的标点;
  • 清除 HTML 标签的样式;
  • 清除空的 HTML 标签;
  • 免去段首缩进;

简短的说,自然语言处理( NLP
)就是付出可以领略人类语言的应用程序和劳务。

你或许感兴趣的篇章:

  • PHP中去掉字符串首尾空格的法子
  • php中3种方法删除字符串中间的空格
  • PHP
    将逗号、空格、回车分隔的字符串转换为数组的函数
  • PHP中空字符串介绍0、null、empty和false之间的关系
  • php读取文件内容至字符串中,同时去除换行、空行、行首行尾空格(Zjmainstay原创)
  • php中0,null,empty,空,false,字符串关系的详细介绍
  • PHP中用正则表明式清除字符串的空白
  • PHP清除数组中享有字符串两端空格的艺术
  • php下清空字符串中的HTML标签的代码
  • 详解php中空字符串和0之间的涉及

 

本周,集团付出业务不多,无加班,于是从头思索新职能矫正西班牙语专出名词大小写的实现。

我们生活中时常会触发的自然语言处理的应用,包涵语音识别,语音翻译,通晓句意,精晓特定词语的同义词,以及写出语法正确,句意通畅的语句和段落。

日前,我接过一项任务,必要为客户创立一个 RSS
提要分类子系统。目的是读取几十个甚至几百个 RSS
提要,将它们的诸多篇章自动分拣到几十个预订义的主题领域当中。客户网站的始末、导航和摸索效果都将由那一个每一天活动提要摸索和分类结果驱动。

西班牙(Spain)语专闻名词的多寡来源于

第一,面临的首先个难点是:

斯洛伐克(Slovak)语专闻名词的数码从哪来?

本身第一想到的是 Python 有一个自然语言处理的包
NLTK,那几个包有个名为 pos_tag
的函数,可以用来辨别并标明每个单词的词性,其中被标明为 NNP 或 NNPS
的单词就是专盛名词(Proper Noun)。我猜想,NLTK
数据包里应该有一个相应的专盛名词数据集,可是,苦于能力不难,我平素未曾找到。

上述的路线走不通后,我又经过 谷歌搜索,发现经过网络字典来获取数据是一条有效的方案。通过这一格局,终于在
Wiktionary
找到了意大利语专知名词列表。于是,利用 Python
写了一个爬虫小本子,爬取了对应的数据。

末尾,就是对爬取到的数目进行了一些收拾和筛选。

筛选方案如下:

  • 使用 is_numeric() 方法,剔除诸如 007 等词汇;
  • 使用 '/\W/' 正则,剔除诸如 ǃXóõ 等词汇;
  • 剔除 strlen 方法,剔除 A 等单字节词汇;
  • 去除跟 HTML、CSS、JavaScript 保留字争辩的词汇;

NLP的作用

 

怎么着让使用者定制专出名词数据

初期的代码如下:

/**
 * 专有名词使用正确的大小写
 * Correct English proper nouns.
 *
 * @param $text
 *
 * @return null|string|string[]
 */
public function properNoun($text)
{
    $dict = include __DIR__ . '/../data/dict.php';
    foreach ($dict as $noun) {
        $text = preg_replace("/\b{$noun}\b/i", $noun, $text);
    }
    return $text;
}

从此想到,若是运用那一个格局的开发者想增加或者忽视某些专盛名词,那该怎么办呢?
于是,我又将 properNoun() 方法改造如下:

/**
 * 专有名词使用正确的大小写
 * Correct English proper nouns.
 *
 * @param $text
 * @param array $extend
 * @param array $ignore
 *
 * @return null|string|string[]
 */
public function properNoun($text, array $extend = [], array $ignore = [])
{
    $dict = include __DIR__ . '/../data/dict.php';
    if ($extend) {
        $dict = array_merge($dict, $extend);
    }
    if ($ignore) {
        $dict = array_diff($dict, $ignore);
    }

    foreach ($dict as $noun) {
        $text = preg_replace("/\b{$noun}\b/i", $noun, $text);
    }
    return $text;
}

正如我们所知,每日博客,社交网站和网页会时有暴发数亿字节的雅量数据。

客户提议利用机器学习,或许还会使用 Apache Mahout 和 Hadoop
来完毕该任务,因为客户近日读书了有关这一个技术的文章。可是,客户的支付团队和大家的支出团队都更熟习Ruby,而不是 Java™
技术。本文将介绍解决方案的技艺之旅、学习进程和终极完毕。

如何创新和优化代码逻辑

本身在写那么些功用的时候,也在探讨和参照一些现有开源项目的落到实处逻辑。在见到开源项目
auto-correct 的一个
commit
上后(PS:这么些 PR 是社区大神 overtrue
提交的。),我又将 properNoun() 方法改造如下:

public function properNoun($text, array $extend = [], array $ignore = [])
{
    $dict = include __DIR__ . '/../data/dict.php';
    if ($extend) {
        $dict = array_merge($dict, $extend);
    }
    if ($ignore) {
        $dict = array_diff($dict, $ignore);
    }
    foreach ($dict as $noun) {
        $text = preg_replace("/(?<!\.|[a-z]){$noun}(?!\.|[a-z])/i", $noun, $text);
    }
    return $text;
}

有过多小卖部热衷收集所有这么些多少,以便更好地打听他们的用户和用户对产品的热心,并对她们的出品仍然服务开展适量的调动。

 

怎么样防止过度替换

在本人认为就要水到渠成的时候,我用事先写好的 PHPUnit
单元测试代码举办了测试,结果报出了错误,在上述措施中,假诺传入的参数是富含
HTML 标签的富文本,那么 HTML 的元素、元素属性以及值都有可能会被沟通。

什么样幸免超负荷替换那个题材吗?也就是说:

只替换文本,而忽视 HTML 标签及标签内部的内容?

自己尝试写了少数套匹配方案,都战败了。最终依然请出了 谷歌大神来接济。那里,搜索的关键字很重点,最好想把您要物色的最主要词翻译成对应的英文单词,那样搜索出的结果会令你更惬意。结果我找到了化解方案:Matching
A Word / Characters Outside Of Html
Tags。

Python自然语言处理,机器学习和。由此地点那部文章的提醒,我又将 properNoun() 方法改造如下:

public function properNoun($text, array $extend = [], array $ignore = [])
{
    $dict = include __DIR__ . '/../data/dict.php';
    if ($extend) {
        $dict = array_merge($dict, $extend);
    }
    if ($ignore) {
        $dict = array_diff($dict, $ignore);
    }
    foreach ($dict as $noun) {
        // Matching proper nouns Outside Of Html Tags
        $text = preg_replace("/(?<!\.|[a-z]){$noun}(?!\.|[a-z])(?!([^<]+)?>)/i", $noun, $text);
    }
    return $text;
}

那几个海量数据可以颁发很多场合,打个比方说,巴西人对成品 A
感到满足,而美利坚同盟国人却对产品 B
更感兴趣。通过NLP,那类的音信方可即时得到(即实时结果)。例如,搜索引擎正是一种
NLP,可以在正确的光阴给方便的人提供方便的结果。

哪些是机器学习?

支付总括

  • 学会科学上网;
  • 善用 谷歌(Google)、Github 和
    StackOverflow,那三样“神器”会帮你解决掉开发进度中相遇的多边(或者说所有)问题;
  • 学会一些 Google搜索小技巧。例如将寻找关键字翻译成乌克兰语单词,那样的检索结果会令你更满足;
  • 斯洛伐克共和国(The Slovak Republic)语真的很重大。最起码你应该在 Chrome 浏览器上设置一个 Google
    翻译
    的插件;
  • PHPUnit 真的很有用,更加是在频仍增改作用如故须求代码重构的花色中。
  • 无须让自己仅限于一个编程语言,学习此外一门或多门语言作为支持,有益于拓展思路和开拓眼界。
  • 多逛逛 Laravel China 那样的高格调社区;

唯独搜索引擎并不是自然语言处理(NLP)的唯一利用。还有更好进而美丽的运用。

 

最终的话

若果还有怎么样须要说的话,那就是求 Star
啦,哈哈哈哈哈。项目地址:

NLP的应用

自我的首先个难题是,“究竟怎么着是机械学习?”
我听说过那一个术语,并且隐约知道一级总计机 IBM® 沃特son
方今选拔该技能在一场 Jeopardy
比赛中征服了人类竞争者。作为购物者和应酬互联网移动加入者,我也知晓
亚马逊.com 和 Facebook根据其购物者数据在提供提议(如产品和人)方面显示良好。同理可得,机器学习取决于
IT、数学和自然语言的老婆当军。它紧要关切以下多个主旨,但客户的解决方案最后仅涉及前多个大旨:

以下都是自然语言处理(NLP)的一对得逞选拔:

 

  • 招来引擎,比如谷歌(谷歌),雅虎等等。谷歌(Google)等寻找引擎会通过NLP精通到您是一个科学和技术喉咙疼友,所以它会重回科学和技术相关的结果。
  • 张罗网站音信流,比如 非死不可的音信流。信息馈送算法通过自然语言处理理解到您的兴味,并向您显示相关的广告以及新闻,而不是有的非亲非故的新闻。
  • 语音帮手,诸如苹果 Siri。
  • 垃圾邮件程序,比如 谷歌(Google) 的垃圾邮件过滤程序
    ,这不仅是司空眼惯会用到的一般性的垃圾邮件过滤,现在,垃圾邮件过滤器会对电子邮件的内容开展辨析,看看该邮件是不是是垃圾邮件。

分拣。依照类似项目标一组磨练多少,将相关的项分配到自由预约义的档次

NLP库

提出。根据类似项目的体察来提出使用的项

目前有广大开源的自然语言处理(NLP)库。比如:

集群。在一组数据内确定子组

  • Natural language toolkit (NLTK)
  • Apache OpenNLP
  • Stanford NLP suite
  • Gate NLP library

Mahout 和 Ruby 的选择

自然语言工具包(NLTK)是最受欢迎的自然语言处理(NLP)库。它是用 Python
语言编写的,背后有强大的社区帮忙。

 

NLTK 也很不难入门,实际上,它将是你用到的最简易的自然语言处理(NLP)库。

精通了机器学习是何等之后,下一步是确定什么落实它。依据客户的指出,Mahout
是一个适宜的源点。我从 Apache 下载了代码,并开头了读书使用 Mahout
及其兄弟 Hadoop 达成机械学习的经过。不幸的是,我意识即便对于有经历的
Java 开发人员而言,Mahout
的求学曲线也很陡峭,并且不存在可用的样例代码。同样不幸的是,机器学习缺乏依照Ruby 的框架或 gem。

在这么些 NLP 教程中,我们将选拔 Python NLTK 库。在上马安装  NLTK
以前,我假如你知道有些
Python入门知识。

 

安装 NLTK

发现 Python 和 NLTK

假如您使用的是 Windows , Linux 或 Mac,你可以
使用PIP安装NLTK:
# pip install nltk

 

在本文撰写之时,你可以在 Python 2.7 , 3.4 和 3.5
上都足以动用NLTK。或者可以透过获取tar
举办源码安装。

自己继续搜寻解决方案,并且在结果集中一向蒙受 “Python”。作为一名 Ruby
开发人士,即便自己还未曾学过该语言,但本身也知道 Python
是一个面向相似对象的、基于文本的、可领悟和动态的编程语言。即使两种语言之间存在有的相似之处,但自己多年来都忽略了读书
Python,将它视为一项多余的技巧集。Python 是本人的 “盲点”,我质疑许多 Ruby
开发人员同行都是那般认为的。

要检查 NLTK
是不是正确地设置到位,可以打开你的Python终端并输入以下内容:Import
nltk。即便一切顺遂,那意味你早就打响安装了 NLTK 库。

 

要是你安装了 NLTK,你可以运作上面的代码来设置 NLTK 包:

找寻机器学习的图书,并更长远钻研它们的目录,我发觉,有一定高比例的此类系统在运用
Python 作为其落实语言,并运用了一个被称为 Natural Language
Toolkit(NLTK,自然语言工具包)的库。通过尤其的搜寻,我发觉 Python
的采用比我发现到的还要广泛,如 谷歌(Google) App Engine、YouTube 和使用 Django
框架营造的网站。它竟然还预安装在自我天天都采纳的 Mac OS X
工作站上!其余,Python 为数学、科学和工程提供了妙趣横生的标准库(例如,NumPy
和 SciPy)。

import nltk
nltk.download()

 

那将打开 NLTK 下载器来挑选须求安装的软件包。

自我决定举办一个 Python
解决方案,因为自己找到了老大好的编码示例。例如,上面这一行代码就是经过
HTTP 读取 RSS 提要并打印其情节所需的兼具代码:

您可以挑选设置具有的软件包,因为它们的容量不大,所以并未什么样难题。现在,我们起先上学呢!

 

使用原生 Python 来对文件举行分词

1

先是,大家将抓取一些网页内容。然后来分析网页文本,看看爬下来的网页的宗旨是有关什么。大家将使用
urllib模块来抓取网页:

print feedparser.parse(“”)

import urllib.request
response = urllib.request.urlopen('http://php.net/')
html = response.read()
print (html)

飞速控制 Python

从打印输出中可以看看,结果中蕴藏众多索要清理的HTML标记。大家能够用那么些 
BeautifulSoup 库来对抓取的文件举办处理:

 

from bs4 import BeautifulSoup
import urllib.request
response = urllib.request.urlopen('http://php.net/')
html = response.read()
soup = BeautifulSoup(html,"html5lib")
text = soup.get_text(strip=True)
print (text)

在攻读一门新的编程语言时,最容易的局地往往是学习语言本身。较难的片段是探听它的生态系统:怎么着设置它、添加库、编写代码、构造代码文件、执行它、调试它并编辑单元测试。本节将简单介绍这一个焦点;请务必参阅
参考资料,以获取有关详细音讯的链接。

当今,大家能将抓取的网页转换为彻底的文件。那很棒,不是么?

 

终极,让我们因此以下格局将文件分词:

pip

from bs4 import BeautifulSoup
import urllib.request
response = urllib.request.urlopen('http://php.net/')
html = response.read()
soup = BeautifulSoup(html,"html5lib")
text = soup.get_text(strip=True)
tokens = [t for t in text.split()]
print (tokens)

 

词频计算

Python Package Index (pip) 是 Python
的专业软件包管理器。您可以行使该程序将库添加到你的系统。它相仿于 Ruby
库的 gem。为了将 NLTK 库添加到您的系列,您可以输入以下命令:

近来的文件相比较以前的 html 文本好多了。大家再选用 Python NLTK
来测算每个词的出现频率。NLTK 中的FreqDist( ) 函数可以兑现词频计算的功力

 

from bs4 import BeautifulSoup
import urllib.request
import nltk
response = urllib.request.urlopen('http://php.net/')
html = response.read()
soup = BeautifulSoup(html,"html5lib")
text = soup.get_text(strip=True)
tokens = [t for t in text.split()]
freq = nltk.FreqDist(tokens)
for key,val in freq.items():
  print (str(key) + ':' + str(val))

1

要是你查看输出结果,会意识最常用的辞藻是PHP。

$ pip install nltk

您可以用绘图函数为这一个词频绘制一个图纸: freq.plot(20, cumulative=False)

为了突显在您的连串上已设置的 Python 库的列表,请运行以下命令:

从图中,你可以毫无疑问那篇文章正在谈论 PHP。这很棒!有局地词,如”the,” “of,”
“a,” “an,”
等等。那个词是为止词。一般的话,甘休词语应该被去除,以幸免它们影响大家的结果。

 

行使 NLTK 删除截止词

1

NLTK 具有大多数语言的告一段落词表。要博得英文截至词,你可以应用以下代码:

$ pip freeze

from nltk.corpus import stopwords
stopwords.words('english')

运作程序

今昔,让大家修改大家的代码,并在绘制图形从前清理标记。首先,我们复制一个列表。然后,大家通过对列表中的标记进行遍历并剔除其中的停下词:

 

clean_tokens = tokens[:]
sr = stopwords.words('english')
for token in tokens:
  if token in stopwords.words('english'):
    clean_tokens.remove(token)

履行 Python 程序一样很粗略。得到一个称号为 locomotive_main.py
的主次和多少个参数,然后你就能够使用 Python 程序编译并推行它:

你可以在此间查看Python List
函数, 
明白怎么处理列表。

 

说到底的代码应该是如此的:

1

from bs4 import BeautifulSoup
import urllib.request
import nltk
from nltk.corpus import stopwords
response = urllib.request.urlopen('http://php.net/')
html = response.read()
soup = BeautifulSoup(html,"html5lib")
text = soup.get_text(strip=True)
tokens = [t for t in text.split()]
clean_tokens = tokens[:]
sr = stopwords.words('english')
for token in tokens:
  if token in stopwords.words('english'):
    clean_tokens.remove(token)
freq = nltk.FreqDist(clean_tokens)
for key,val in freq.items():
  print (str(key) + ':' + str(val))

$ python locomotive_main.py arg1 arg2 arg3

固然您现在检查图表,会深感比以前那张图标更加鲜明,因为尚未了为止词的搅和。

Python 使用 清单 1 中的if __name__ ==
“__main__”:语法来规定文件本身是从命令行执行的或者从任何代码导入的。为了让文件变得可以举办,必要添加”__main__”检测。

freq.plot(20,cumulative=False)

 

选用 NLTK 对文本分词

清单 1. Main 检测 

咱俩恰好精晓了何等选拔 split( ) 函数将文件分割为标记
。现在,我们将见到哪些利用 NLTK
对文件举办标记化。对文本进行标记化是很重点的,因为文件无法在平素不进展标记化的景况下被拍卖。标记化意味着将较大的一对分隔成更小的单元。

1

您可以将段落划分为句子,并按照你的急需将句子分割为单词。NLTK
具有内置的句子标记器和词语标记器。

import sys

若果大家有如下的以身作则文本:

2

Hello Adam, how are you? I hope everything is going well.  Today is a
good day, see you dude.

import time

为了将以此文件标记化为句子,我们可以运用句子标记器:

3

from nltk.tokenize import sent_tokenize
mytext = "Hello Adam, how are you? I hope everything is going well. Today is a good day, see you dude."
print(sent_tokenize(mytext))

import locomotive

出口如下:

4

[‘Hello Adam, how are you?’, ‘I hope everything is going well.’,
‘Today is a good day, see you dude.’]

 

你可能会说,那是一件不难的作业。我不须要动用 NLTK
标记器,并且自己可以运用正则表达式来划分句子,因为每个句子前后都有标点符号或者空格。

5

那么,看看下边的文字:

if __name__ == “__main__”:

Hello Mr. Adam, how are you? I hope everything is going well. Today is
a good day, see you dude.

6

呃!Mr. 是一个词,即便带有一个符号。让我们来试试使用 NLTK 进行分词:

    start_time = time.time()

from nltk.tokenize import sent_tokenize
mytext = "Hello Mr. Adam, how are you? I hope everything is going well. Today is a good day, see you dude."
print(sent_tokenize(mytext))

7

出口如下所示:

    if len(sys.argv) > 1:

[‘Hello Mr. Adam, how are you?’, ‘I hope everything is going well.’,
‘Today is a good day, see you dude.’]

8

Great!结果棒极了。然后大家品尝利用词语标记器来探视它是何许做事的:

        app = locomotive.app.Application()

from nltk.tokenize import word_tokenize
mytext = "Hello Mr. Adam, how are you? I hope everything is going well. Today is a good day, see you dude."
print(word_tokenize(mytext))

9

输出如下:

        … additional logic …

[‘Hello’, ‘Mr.’, ‘Adam’, ‘,’, ‘how’, ‘are’, ‘you’, ‘?’, ‘I’, ‘hope’,
‘everything’, ‘is’, ‘going’, ‘well’, ‘.’, ‘Today’, ‘is’, ‘a’, ‘good’,
‘day’, ‘,’, ‘see’, ‘you’, ‘dude’, ‘.’]

virtualenv

正如所料,Mr. 是一个词,也确实被 NLTK 当做一个词。NLTK使用
nltk.tokenize.punkt module 中的  PunktSentenceTokenizer
进行文本分词。那一个标记器经过了精良的陶冶,可以对各种语言进行分词 。

 

标志非意大利语语言文本

大多数 Ruby 开发人员熟稔系统范围的库或 gem
的题材。使用一组系统范围内的库的做法一般是不可取的,因为您的中间一个品类或者借助于某个给定的库的本子
1.0.0,而另一个类型则借助于版本 1.2.7。同样,Java
开发人士都通晓系统范围的 CLASSPATH 存在一样的题材。就如 Ruby
社区动用其rvm工具,而 Python 社区选拔virtualenv工具(请参阅
参考资料,以赢得相关链接)来创建独立的实施环境,其中饱含特定版本的
Python 和一组库。清单 2 中的命令突显了怎么样为您 p1 类型开创一个名为
p1_env 的虚拟环境,其中蕴蓄feedparser、numpy、scipy和nltk库。

为了标记其余语言,可以像这么指定语言:

 

from nltk.tokenize import sent_tokenize
mytext = "Bonjour M. Adam, comment allez-vous? J'espère que tout va bien. Aujourd'hui est un bon jour."
print(sent_tokenize(mytext,"french"))

清单 2. 利用 virualenv 创设一个虚拟环境的命令 

结果将是那样的:

1

[‘Bonjour M. Adam, comment allez-vous?’, “J’espère que tout va
bien.”, “Aujourd’hui est un bon jour.”]

$ sudo pip install virtualenv $ cd ~ $ mkdir p1 $ cd p1 $ virtualenv
p1_env –distribute $ source p1_env/bin/activate  (p1_env)[~/p1]$
pip install feedparser (p1_env)[~/p1]$ pip install numpy
(p1_env)[~/p1]$ pip install scipy (p1_env)[~/p1]$ pip install nltk
(p1_env)[~/p1]$ pip freeze

NLTk 对任何非法语语言的协助也卓殊好!

老是在一个 shell 窗口使用你的类型时,都亟需 “得到”
您的虚拟环境激活脚本。请留心,在激活脚本被获取后,shell
提醒符会改变。当在您的种类上创建和运用 shell
窗口,轻松地导航到您的档次目录,并启动其虚拟环境时,您或许想在您的
~/.bash_profile 文件中加上以下条目:

从 WordNet 获取同义词

 

假定您还记得我们采纳 nltk.download( ) 安装 NLTK
的增加包时。其中一个增添包名为 WordNet。WordNet
是为自然语言处理创设的数据库。它包蕴部分词语的一个同义词组和一个简单易行的概念。

1

经过 NLTK 你可以收获给定词的定义和例句:

$ alias p1=”cd ~/p1 ; source p1_env/bin/activate”

from nltk.corpus import wordnet
syn = wordnet.synsets("pain")
print(syn[0].definition())
print(syn[0].examples())

代码库结构

结果是:

 

a symptom of some physical hurt or disorder
[‘the patient developed severe pain and distension’]

在做到不难的单文件 “Hello World” 程序的编纂之后,Python
开发人员须求掌握什么科学地社团其代码库的目录和文件名。Java 和 Ruby
语言在那下边都有个其余渴求,Python 也远非什么分化。简单的话,Python
使用包
的概念对有关的代码进行分组,并提供了斐然的名目空间。出于演示目标,在本文中,代码存在于某个给定项目标根目录中,例如
~/p1。在这么些目录中,存在一个用以同一名称的 Python 包的 locomotive 目录。
清单 3 彰显了那个目录结构。

WordNet 包涵了成百上千词的定义:

 

from nltk.corpus import wordnet
syn = wordnet.synsets("NLP")
print(syn[0].definition())
syn = wordnet.synsets("Python")
print(syn[0].definition())

清单 3. 演示目录结构 

结果是:

01

the branch of information science that deals with natural language
information
large Old World boas

locomotive_main.py

您可以运用 WordNet 来赢得同义词:

02

from nltk.corpus import wordnet
synonyms = []
for syn in wordnet.synsets('Computer'):
  for lemma in syn.lemmas():
    synonyms.append(lemma.name())
print(synonyms)

locomotive_tests.py

输出是:

03

[‘computer’, ‘computing_machine’, ‘computing_device’,
‘data_processor’, ‘electronic_computer’,
‘information_processing_system’, ‘calculator’, ‘reckoner’,
‘figurer’, ‘estimator’, ‘computer’]

 

Cool!

04

从 WordNet 获取反义词

locomotive/

你可以用同样的主意得到单词的反义词。你唯一要做的是在将 lemmas
的结果参加数组此前,检查结果是不是真的是一个不易的反义词。

05

from nltk.corpus import wordnet
antonyms = []
for syn in wordnet.synsets("small"):
  for l in syn.lemmas():
    if l.antonyms():
      antonyms.append(l.antonyms()[0].name())
print(antonyms)

    __init__.py

输出是:

06

[‘large’, ‘big’, ‘big’]

    app.py

那就是 NLTK 在自然语言处理中的力量。

07

NLTK词干提取

    capture.py

单词词干提取就是从单词中去除词缀并回到词根。(比方说 working 的词干是
work。)搜索引擎在目录页面的时候使用这种技术,所以众五个人经过同一个单词的两样样式展开搜索,再次回到的都是相同的,有关这些词干的页面。

08

词干提取的算法有广大,但最常用的算法是 Porter 提取算法。NLTK 有一个
PorterStemmer 类,使用的就是 Porter 提取算法。

    category_associations.py

from nltk.stem import PorterStemmer
stemmer = PorterStemmer()
print(stemmer.stem('working'))

09

结果是: 

    classify.py

work

10

结果很理解。

    news.py

还有任何部分领取算法,如 Lancaster 提取算法。那些算法的出口同 Porter
算法的结果在多少个单词上差距。你可以尝试他们七个算法来查看有何差异结果。

11

领取非塞尔维亚语单词词干

    recommend.py

SnowballStemmer 类,除了西班牙语外,还足以适用于其余 13
种语言。接济的语言如下:

12

from nltk.stem import SnowballStemmer
print(SnowballStemmer.languages)
'danish', 'dutch', 'english', 'finnish', 'french', 'german', 'hungarian', 'italian', 'norwegian', 'porter', 'portuguese', 'romanian', 'russian', 'spanish', 'swedish'

    rss.py

您可以应用 SnowballStemmer 类的 stem()函数来领取非意国语单词,如下所示:

13

from nltk.stem import SnowballStemmer
french_stemmer = SnowballStemmer('french')
print(french_stemmer.stem("French word"))

 

发源法兰西的情侣欢迎在评论区 poll 出你们测试的结果!

14

使用 WordNet 引入词汇

locomotive_tests/

词汇的词汇化与提取词干类似,但分裂之处在于词汇化的结果是一个当真的词汇。与词干提取差异,当您打算提取部分词干时,有可能会造成那样的图景:

15

from nltk.stem import PorterStemmer
stemmer = PorterStemmer()
print(stemmer.stem('increases'))

    __init__.py

结果是:

16

increas

    app_test.py

现在,倘使大家试图用NLTK WordNet来苏醒同一个词,结果会是不错的:

17

from nltk.stem import WordNetLemmatizer
lemmatizer = WordNetLemmatizer()
print(lemmatizer.lemmatize('increases'))

    category_associations_test.py

结果是:

18

 increase

    feed_item_test.pyc

结果也许是同义词或具有相同含义的两样词语。有时,如果您准备还原一个词,比如
playing,还原的结果要么
playing。这是因为默许还原的结果是名词,如果你想获取动词,可以通过以下的章程指定。

19

from nltk.stem import WordNetLemmatizer
lemmatizer = WordNetLemmatizer()
print(lemmatizer.lemmatize('playing', pos="v"))

    rss_item_test.py

结果是: 

请留心名称古怪的 __init__.py 文件。这一个文件提醒 Python
为你的包加载要求的库和特定的应用程序代码文件,它们都放在同一的目录中。
清单 4 突显了文件 locomotive/__init__.py 的内容。

play

 

实在,那是一个至极好的公文压缩水平。最终减掉到原文本的 50% 到 60%
左右。结果可能是动词,名词,形容词或副词:

清单 4. locomotive/__init__.py 

from nltk.stem import WordNetLemmatizer
lemmatizer = WordNetLemmatizer()
print(lemmatizer.lemmatize('playing', pos="v"))
print(lemmatizer.lemmatize('playing', pos="n"))
print(lemmatizer.lemmatize('playing', pos="a"))
print(lemmatizer.lemmatize('playing', pos="r"))

01

结果是:

# system imports; loads installed packages

play
playing
playing
playing

02

词干化和词化差异

    import codecs

好呢,让我们分别品尝一些单词的词干提取和词形还原:

03

from nltk.stem import WordNetLemmatizer
from nltk.stem import PorterStemmer
stemmer = PorterStemmer()
lemmatizer = WordNetLemmatizer()
print(stemmer.stem('stones'))
print(stemmer.stem('speaking'))
print(stemmer.stem('bedroom'))
print(stemmer.stem('jokes'))
print(stemmer.stem('lisa'))
print(stemmer.stem('purple'))
print('----------------------')
print(lemmatizer.lemmatize('stones'))
print(lemmatizer.lemmatize('speaking'))
print(lemmatizer.lemmatize('bedroom'))
print(lemmatizer.lemmatize('jokes'))
print(lemmatizer.lemmatize('lisa'))
print(lemmatizer.lemmatize('purple'))

    import locale

结果是:

04

stone
speak
bedroom
joke
lisa

purpl

stone
speaking
bedroom
joke
lisa
purple

    import sys

词干提取的不二法门可以在不知晓语境的气象下对词汇使用,那就是干吗它相较词形还原方法速度更快但准确率更低。

05

在我看来,词形还原比提取词干的不二法门更好。词形还原,要是实在不能赶回这么些词的变形,也会重回另一个的确的单词;这些单词可能是一个同义词,但无论怎么样那是一个真正的单词。当有时候,你不爱抚准确度,需求的只是速度。在那种情状下,词干提取的法门更好。

 

我们在本 NLP
教程中钻探的具备手续都事关到文本预处理。在事后的篇章中,大家将商讨使用Python
NLTK举行文本分析。

06

更加多关于Python相关内容感兴趣的读者可查阅本站专题:《Python数学运算技巧统计》、《Python数据结构与算法教程》、《Python函数使用技术统计》、《Python字符串操作技能汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技能汇总Python自然语言处理,机器学习和。》

    # application imports; these load your specific *.py files

期望本文所述对大家Python程序设计具有接济。

07

您可能感兴趣的小说:

  • Python自然语言处理之词干,词形与最大匹配算法代码详解
  • Python编程使用NLTK举行自然语言处理详解
  • 用Python进行局地概括的自然语言处理的课程
  • Python中部分自然语言工具的使用的入门教程
  • python自然语言编码转换模块codecs介绍
  • 在Python中运用NLTK库已毕对词干的领取的科目

    import app

08

    import capture

09

    import category_associations

10

    import classify

11

    import rss

12

    import news

13

    import recommend

有了结构如 清单 4 所示的 locomotive
包之后,在项目标根目录中的主程序就足以导入并利用它。例如,文件
locomotive_main.py 包罗以下导入:

 

1

import sys         # >– system library

2

    import time        # >– system library

3

    importlocomotive  # >– custom application code library in the
“locomotive” directory

测试

 

Pythonunittest标准库提供一个可怜好的测试解决方案。熟稔 JUnit 的 Java
开发人士和熟知 Test::Unit 框架的 Ruby 开发人士应该会以为 清单 5 中的
Pythonunittest代码很简单了解。

 

清单 5. Python unittest 

01

class AppTest(unittest.TestCase):

02

 

03

      def setUp(self):

04

          self.app = locomotive.app.Application()

05

bf88必发唯一官网, 

06

      def tearDown(self):

07

          pass

08

 

09

      def test_development_feeds_list(self):

10

          feeds_list = self.app.development_feeds_list()

11

          self.assertTrue(len(feeds_list) == 15)

12

          self.assertTrue(‘feed://news.yahoo.com/rss/stock-markets’
infeeds_list)

清单 5 中的代码还演示了 Python
的一个强烈的特色:所有的代码必须一律缩进,否则无法得逞编译。tearDown(self)方法也许在上申时看起来有点怪异。您可能会问,为啥测试总是被硬编码为通过?事实上并非如此。那只是在
Python 中编辑空方法的一种方法。

 

工具

 

自家的确需求的是一个兼有语法卓绝显示、代码达成和断点调试功能的集成开发环境
(IDE),用该环境救助自己精通自己的 Python 学习曲线。作为利用 Eclipse IDE 进行Java
开发的一名用户,pyeclipse插件是本身着想的下一个工具。固然该插件有时相比慢,但它工作得至极不错。我最后投资了
PyCharm IDE,它满意了自我的具有 IDE 需求。

 

在控制了 Python
及其生态系统的基本知识之后,终于来到初阶兑现机器学习解决方案的时候。

 

应用 Python 和 NLTK 完结分类

 

已毕解决方案涉及捕获模拟的 RSS
提要、整理其文件、使用一个NaiveBayesClassifier和 kNN
算法对项目举行分拣。上面将会介绍那个操作中的每一个。

 

破获和分析提要

 

该品种专门具有挑战性,因为客户还不曾概念目的 RSS
提要列表。因而,也不设有
“操练多少”。所以,在上马开发时期总得模拟提要和教练多少。

 

我用来收获示例提要多少的首先个方法是只领到在某个文本文件中指定的列表中的
RSS 提要。Python 提供了一个很好的 RSS
提要解析库,其名目为feedparser,它抽象差别的 RSS 和 Atom
格式之间的异样。简单的基于文本的靶子序列化的另一个实惠的库被风趣地叫做pickle(泡菜)。那八个库在
清单 6 的代码中均有应用,清单 6 中的代码将每一个 RSS 提要捕获为
“腌制过的” 对象文件,以备后用。如你所见,Python
代码极度简洁,且成效强大。

 

清单 6. CaptureFeeds 类 

01

import feedparser

02

import pickle

03

 

04

class CaptureFeeds:

05

 

06

    def __init__(self):

07

        for (i, url) in enumerate(self.rss_feeds_list()):

08

            self.capture_as_pickled_feed(url.strip(), i)

09

 

10

    def rss_feeds_list(self):

11

        f = open(‘feeds_list.txt’, ‘r’)

12

        list = f.readlines()

13

        f.close

14

        return list

15

 

16

    def capture_as_pickled_feed(self, url, feed_index):

17

        feed = feedparser.parse(url)

18

        f = open(‘data/feed_’ + str(feed_index) + ‘.pkl’, ‘w’)

19

        pickle.dump(feed, f)

20

        f.close()

21

 

22

if __name__ == “__main__”:

23

    cf = CaptureFeeds()

下一步的挑衅性之大是想获得的。现在,我有了样例提要多少,必须对它举行分拣,以便将它用作训练多少。磨炼数据
是向你的分类算法提供的数据集,以便你能从中举办学习。

 

比如,我动用的样例提要包涵了体育电视机网络商家 ESPN。提要的品种之一是关于
Denver Broncos 橄榄球队的 提姆 Tebow 被转载到 New York Jets
橄榄球队,在同一时间,Broncos 签了她们新的四分卫 Peyton
Manning。提要结果中的另一个类型是 Boeing Company 和它的新喷气式飞机
(jet)。所以,那里的难题是,应该将怎么着具体的类型值分配给第三个故事?tebow、broncos、manning、jets、quarterback、trade和nfl这么些值都是适度的。但唯有一个值可以在陶冶多少中被指定为陶冶多少系列。同样,在其次个故事中,连串应该是boeing照旧jet?困难的局地在于这几个细节。如若您的算法要发生精确的结果,那么大型陶冶数据集的确切手工分类万分首要。要落成那点,不该低估所需的光阴。

 

本身急需选拔越多的多少,而且那么些数量必须已拓展了可相信的归类,那种情景飞快就变得肯定。我得以在哪个地方找到这么的数量吧?进入
Python
NLTK。除了是一个地道的言语文本处理库之外,它仍旧还含有可下载的示范数据集,或是其术语中的文集,
以及可以轻松访问此下载数据的应用程序编程接口。要安装 Reuters
文集,可以运作如下所示的一声令下。会有领先 10,000 篇新闻小说将下载到您的
~/nltk_data/corpora/reuters/ 目录中。与 RSS 提要项目同样,每篇 Reuters
消息小说中都涵盖一个题名和一个正文,所以那么些 NLTK
预分类的数目万分适合于模拟 RSS 提要。

 

1

$ python # enter an interactive Python shell

2

>>> import nltk        # import the nltk library

3

>>> nltk.download()    # run the NLTK Downloader, then enter
‘d’ Download

4

Identifier> reuters    # specify the ‘reuters’ corpus

特意令人感兴趣的是文件
~/nltk_data/corpora/reuters/cats.txt。它包括了一个列表,其中带有小说文件名称,以及为各样篇章文件分配的档次。文件看起来如下所示,所以,子目录
test 中的文件 14828 中的作品与主旨grain有关。

 

1

test/14826 trade

2

test/14828 grain

自然语言是乱套的

 

RSS 提要分类算法的原始输入,当然是以保加列菲律宾语书写的文件。原始,确实如此。

 

从电脑处理的角度来看,塞尔维亚语或其余自然语言(口语或一般的言语)都是极不规范和不确切的。首先,存在大小写的题目。单词
Bronco 是不是等于
bronco?答案是,也许是。接下来,您要虚应故事标点和空格。bronco. 是还是不是等于
bronco 或 bronco,?算是吧。然后,有复数方式和一般的单词。run、running 和
ran 是还是不是等于?那取决不一致的情景。那八个词有一个同步的
词根。如若将自然语言词汇嵌入在标记语言(如
HTML)中,景况会如何呢?在那种情状下,您必须处理像<strong>bronco</strong>那样的文件。最后,还有一个标题,就是这几个常常利用但差不离毫无意义的单词,像
a、and 和
the。这个所谓的停用词卓殊麻烦。自然语言格外混乱;在拍卖之前,须要对它们举办整治。

 

幸运的是,Python 和 NLTK 让您可以处以这几个烂摊子。在 清单 7
中,RssItem类的normalized_words方法可以拍卖所有那些题目。请尤其注意
NLTK 怎样只行使一行代码就可见净化嵌入式 HTML
标记的原始小说文本!使用一个正则表明式删除标点,然后每个单词被拆分,并规范化为小写。

 

清单 7. RssItem 类 

01

class RssItem:

02

    …

03

    regex = re.compile(‘[%s]’ % re.escape(string.punctuation))

04

    …

05

    def normalized_words(self, article_text):

06

        words   = []

07

        oneline = article_text.replace(‘\n’, ‘ ‘)

08

        cleaned = nltk.clean_html(oneline.strip())

09

        toks1   = cleaned.split()

10

        for t1 in toks1:

11

            translated = self.regex.sub(”, t1)

12

            toks2 = translated.split()

13

            for t2 in toks2:

14

                t2s = t2.strip().lower()

15

                if self.stop_words.has_key(t2s):

16

                    pass

17

                else:

18

                    words.append(t2s)

19

        return words

只需这一行代码就可以从 NLTK 得到停用词列表;并且还协助任何自然语言:

 

1

nltk.corpus.stopwords.words(‘english’)

NLTK 还提供了一部分 “词干分析器”
类,以便更为规范化单词。请查看有关词干、词形归并、句子结构和语法的
NLTK 文档,了然有关的越多音信。

 

动用 Naive Bayes 算法举行分拣

 

算法在 NLTK 中被周边选拔并运用nltk.NaiveBayesClassifier类落成。Bayes
算法根据特性在其数据汇总的每个存在或不存在对项目开展分类。在 RSS
提要项目标情状下,每一个特点都是自然语言的一个加以的(清洁过的)单词。该算法是
“朴实” 的,因为它假设特性(在本例中,单词)之间一贯不其他关系。

 

唯独,意国语这种语言蕴涵领先 250,000 个单词。当然,我不期望为了将 RSS
提要项目传递给算法就要为每个 RSS 提要项目创设一个饱含 250,000
个布尔值的靶子。那么,我会使用什么单词?简单的话,答案是在培养数据组中除去停用词之外最广大的单词。NLTK
提供了一个完好无损的类,即nltk.probability.FreqDist,我得以用它来甄别那么些最常用的单词。在
清单 8
中,collect_all_words方法再次回到来自所有培训文章的有着单词的一个数组。

 

下一场,此数组被传送给identify_top_words方法,以确定最频仍的单词。nltk.FreqDist类的一个实惠的特征是,它实质上是一个散列,不过它的键按其对应的值或计数
排序。由此,使用[:1000]Python 语法可以轻松获取最频仍的 1000 个单词。

 

清单 8. 使用 nltk.FreqDist 类 

01

def collect_all_words(self, items):

02

      all_words = []

03

      for item in items:

04

          for w in item.all_words:

05

              words.append(w)

06

      return all_words

07

 

08

  def identify_top_words(self, all_words):

09

      freq_dist = nltk.FreqDist(w.lower() for w in all_words)

10

      return freq_dist.keys()[:1000]

对于使用 NLTK Reuters 小说数据模拟的 RSS
提要项目,我需求确定每个类其他花色。为此,我读取前边提到的
~/nltk_data/corpora/reuters/cats.txt 文件。用 Python
读取一个文书格外不难,如下所示:

 

1

def read_reuters_metadata(self, cats_file):

2

      f = open(cats_file, ‘r’)

3

      lines = f.readlines()

4

      f.close()

5

      return lines

接下去的手续是收获每个 RSS
提要项目标表征。RssItem类的features方法(如下所示)能够成功那或多或少。在该办法中,在小说中的all_words数组首先被核减到一个较小的set对象,以清除重复的单词。然后会遍历top_words,并在该
set 中开展相比较,确定是或不是存在重复的单词。随后重临 1000
个布尔值组成的一个散列,以w_为键,前面是单词本身。那么些 Python
分外简短。

 

1

def features(self, top_words):

2

      word_set = set(self.all_words)

3

      features = {}

4

      for w in top_words:

5

          features[“w_%s” % w] = (w in word_set)

6

      return features

接下去,我搜集了陶冶集的 RSS
提要项目和它们各自的特色,并将它们传递给算法。清单 9
中的代码演示了这些义务。请留意,分类器被教练成为唯有一行代码。

 

1

def classify_reuters(self):

2

        …

3

        training_set = []

4

        for item in rss_items:

5

            features = item.features(top_words)

6

            tup = (features, item.category)  # tup is a 2-element tuple

7

            featuresets.append(tup)

8

        classifier = nltk.NaiveBayesClassifier.train(training_set)

NaiveBayesClassifier在运作中的 Python
程序的内存中,它现在是经过操练的。现在,我只需遍历须要开展分拣的 RSS
提要项目集,并要求分类器推测每个门类的档次。那很简单。

 

1

for item in rss_items_to_classify:

2

      features = item.features(top_words)

3

      category = classifier.classify(feat)

变得不那么踏实

 

如前所述,算法即使每个特性之间是不曾提到的。由此,像 “machine learning”
和 “learning machine”,或者 “New York Jet” 和 “jet to New York”
那样的短语是一致的(to
是一个停用词)。在当然的语言上下文中,这么些单词之间有明显的涉嫌。所以,我怎么会让算法变得
“不那么天真”,并识别那个单词的关联?

 

其中一个技术是在特点集内包蕴周边的双字词(多个单词为一组)和三字词(五个单词为一组)。NLTK
以nltk.bigrams(…)和nltk.trigrams(…)的情势对此提供了支撑,现在咱们对此应当不再感到讶异了。正如可以从训练数据组收集最常用的
n 个单词那样,也得以识别最常用的双字词和三字词,并将它们作为特性。

 

你的结果会有所差别

 

对数据和算法进行完善是一门艺术。您是还是不是合宜更为规范化单词集,也许应该包罗词根?或者包含超越1000
个最常用单词?少一些是还是不是适用?或者是或不是应当利用更大的锻练多少集?是或不是合宜加上越多信用词或
“停用词根”?那几个都是你要问自己的不易难题。使用它们举行尝试,通过试错法,您可以会为你的数据达成最佳算法。我发现,85%
是一个很好的归类成功率。

 

选取 k-Nearest Neighbors 算法指出提出

 

客户愿意彰显在选定系列或一般体系中的 RSS 提要项目。现在,这几个系列早就用
Naive Bayes
算法进行分拣,这一渴求的率先有的已得到了满意。较难的部分是促成
“或相似序列”
的渴求。那是机器学习提出器系统发轫发挥作用的地点。提出器系统
根据其余品类的相似性来提议一个门类。亚马逊(Amazon).com 的产品提出和 Facebook的对象指出就是此成效的很好的言传身教。

 

k-Nearest Neighbors (kNN)
是最常用的提议算法。思路是向它提供一组标签(即体系),
并且每个标签都对应一个数目集。然后,该算法对各数据集举行了比较,以识别相似的档次。数据集由三个数值数组构成,数值的限定往往被规范化为从
0 到 1。然后,它可以从数据集识别相似的竹签。与只暴发一个结果的 Naive
Bayes 不一致,kNN 能够生出一个有名次的列表,其中带有若干(即,k
的值)个提议。

 

本人发觉,建议器算法比分类算法更易于明白和促成,但对于本文来说,其代码过于冗长,并且有复杂的数学,不能在那边详述。请参阅由
Manning 出版的一本很好的新书 Machine Learning in Action,获取 kNN
编码示例(请参阅 参考资料 中的链接)。在 RSS
提要项目落实的长河中,标签值是体系序列,而数据集是最常用的 1000
个单词的值数组。同样,在打造那些数组时,一部分属于科学范畴,一部分属于数学范畴,还有一对属于艺术范畴。在数组中,每个单词的值都能够是简单的
0 或 1
的布尔值、文章中单词出现次数的百分比、该比例的指数值,或一些此外值。

 

结束语

 

追究 Python、NLTK 和机械学习一向是一个好玩的、令人愉悦的阅历。Python
语言强大而又简单,现在已成为自己的开发工具包的中坚部分。它万分适合于机器学习、自然语言和数学/科学应用程序。即便本文中并从未提到,但我还发现
Python 对于图片和制图格外实惠。若是 Python
同样是你的盲点,我提出您领悟一下它。

 

简介: 机器学习取决于
IT、数学和自然语言的老婆当军,在大数额应用程序中会日常用到机械学习。本文将研究Python 编程语言和它的 NLTK 库,然后将它们选用于一个机器学习项目。

 

挑衅:使用机器学习对 RSS 提要进行分类

 

近年,我接过一项职务,须求为客户创制一个 RSS
提要分类子系统。目的是读取几十个甚至几百个 RSS
提要,将它们的好多稿子自动分类到几十个预订义的主题领域当中。客户网站的内容、导航和搜索作用都将由那些每一天活动提要物色和归类结果驱动。

 

客户提议利用机器学习,或许还会拔取 Apache Mahout 和 Hadoop
来贯彻该义务,因为客户近期读书了有关这一个技巧的稿子。可是,客户的开发协会和大家的开发团队都更熟谙Ruby,而不是 Java™
技术。本文将介绍解决方案的技艺之旅、学习进程和结尾完成。

 

什么样是机械学习?

 

本身的率先个难点是,“究竟怎么着是机械学习?”
我听说过那几个术语,并且隐隐知道一流总括机 IBM® 沃特son
近期应用该技能在一场 Jeopardy
竞赛中克服了人类竞争者。作为购物者和社交网络移动插足者,我也知晓
亚马逊.com 和 非死不可依据其购物者数据在提供指出(如产品和人)方面表现不错。同理可得,机器学习取决于
IT、数学和自然语言的鱼目混珠。它最主要关心之下多个主题,但客户的缓解方案最终仅涉及前七个焦点:

 

分拣。按照类似项目的一组陶冶多少,将有关的项分配到自由预约义的序列

指出。按照类似项目的观望来提出选取的项

集群。在一组数据内确定子组

Mahout 和 Ruby 的选择

 

知道了机械学习是何等之后,下一步是规定如何落到实处它。根据客户的提议,Mahout
是一个适度的源点。我从 Apache 下载了代码,并发轫了读书应用 Mahout
及其兄弟 Hadoop 达成机器学习的经过。不幸的是,我发觉即使对于有经历的
Java 开发人员而言,Mahout
的求学曲线也很陡峭,并且不设有可用的样例代码。同样不幸的是,机器学习缺少依照Ruby 的框架或 gem。

 

发现 Python 和 NLTK

 

自身一连寻找解决方案,并且在结果集中平昔碰到 “Python”。作为一名 Ruby
开发人士,固然自己还没有学过该语言,但我也掌握 Python
是一个面向相似对象的、基于文本的、可见晓和动态的编程语言。即使二种语言之间存在部分相似之处,但本身多年来都忽视了上学
Python,将它视为一项多余的技能集。Python 是本人的 “盲点”,我猜忌许多 Ruby
开发人员同行都是这般认为的。

 

搜索机器学习的书本,并更透彻钻研它们的目录,我意识,有一定高比例的此类系统在利用
Python 作为其完结语言,并接纳了一个被誉为 Natural Language
Toolkit(NLTK,自然语言工具包)的库。通过尤其的检索,我发觉 Python
的运用比我发觉到的还要广泛,如 谷歌 App Engine、YouTube 和动用 Django
框架创设的网站。它仍然还预安装在自己每一天都使用的 Mac OS X
工作站上!此外,Python 为数学、科学和工程提供了幽默的标准库(例如,NumPy
和 SciPy)。

 

自家说了算实施一个 Python
解决方案,因为我找到了极度好的编码示例。例如,上面这一行代码就是经过
HTTP 读取 RSS 提要并打印其内容所需的兼具代码:

 

1

print feedparser.parse(“”)

很快精晓 Python

 

在就学一门新的编程语言时,最不难的有的往往是学习语言本身。较难的局地是驾驭它的生态系统:如何设置它、添加库、编写代码、构造代码文件、执行它、调试它并编写单元测试。本节将简单介绍这么些主旨;请务必参阅
参考资料,以博得有关详细信息的链接。

 

pip

 

Python Package Index (pip) 是 Python
的正儿八经软件包管理器。您可以行使该程序将库添加到你的系统。它似乎于 Ruby
库的 gem。为了将 NLTK 库添加到您的系列,您可以输入以下命令:

 

1

$ pip install nltk

为了浮现在您的种类上已安装的 Python 库的列表,请运行以下命令:

 

1

$ pip freeze

运作程序

 

实践 Python 程序一样很简短。得到一个称呼为 locomotive_main.py
的次第和三个参数,然后你就可以运用 Python 程序编译并执行它:

 

1

$ python locomotive_main.py arg1 arg2 arg3

Python 使用 清单 1 中的if __name__ ==
“__main__”:语法来规定文件本身是从命令行执行的依旧从其它代码导入的。为了让文件变得可以执行,必要足够”__main__”检测。

 

清单 1. Main 检测 

1

import sys

2

import time

3

import locomotive

4

 

5

if __name__ == “__main__”:

6

    start_time = time.time()

7

    if len(sys.argv) > 1:

8

        app = locomotive.app.Application()

9

        … additional logic …

virtualenv

 

多数 Ruby 开发人员熟练系统范围的库或 gem
的难题。使用一组系统范围内的库的做法一般是不可取的,因为您的中间一个项目或者借助于某个给定的库的版本
1.0.0,而另一个档次则依靠于版本 1.2.7。同样,Java
开发人士都清楚系统范围的 CLASSPATH 存在一样的问题。似乎 Ruby
社区应用其rvm工具,而 Python 社区利用virtualenv工具(请参阅
参考资料,以获取有关链接)来创立独立的实践环境,其中包蕴特定版本的
Python 和一组库。清单 2 中的命令显示了怎么为你 p1 品种创建一个名为
p1_env 的虚拟环境,其中饱含feedparser、numpy、scipy和nltk库。

 

清单 2. 使用 virualenv 创立一个虚拟环境的命令 

1

$ sudo pip install virtualenv $ cd ~ $ mkdir p1 $ cd p1 $ virtualenv
p1_env –distribute $ source p1_env/bin/activate  (p1_env)[~/p1]$
pip install feedparser (p1_env)[~/p1]$ pip install numpy
(p1_env)[~/p1]$ pip install scipy (p1_env)[~/p1]$ pip install nltk
(p1_env)[~/p1]$ pip freeze

历次在一个 shell 窗口使用你的项目时,都亟待 “获得”
您的虚拟环境激活脚本。请小心,在激活脚本被拿走后,shell
提醒符会改变。当在你的系统上创办和选择 shell
窗口,轻松地导航到您的种类目录,并启动其虚拟环境时,您可能想在您的
~/.bash_profile 文件中拉长以下条目:

 

1

$ alias p1=”cd ~/p1 ; source p1_env/bin/activate”

代码库结构

 

在完毕简单的单文件 “Hello World” 程序的编写之后,Python
开发人员要求驾驭什么正确地协会其代码库的目录和文书名。Java 和 Ruby
语言在这下边都有各自的需求,Python 也未曾怎么两样。一言以蔽之,Python
使用包
的定义对相关的代码举办分组,并提供了分明的称号空间。出于演示指标,在本文中,代码存在于某个给定项目标根目录中,例如
~/p1。在这几个目录中,存在一个用来同一名称的 Python 包的 locomotive 目录。
清单 3 突显了这么些目录结构。

 

清单 3. 示范目录结构 

01

locomotive_main.py

02

locomotive_tests.py

03

 

04

locomotive/

05

    __init__.py

06

    app.py

07

    capture.py

08

    category_associations.py

09

    classify.py

10

    news.py

11

    recommend.py

12

    rss.py

13

 

14

locomotive_tests/

15

    __init__.py

16

    app_test.py

17

    category_associations_test.py

18

    feed_item_test.pyc

19

    rss_item_test.py

请小心名称古怪的 __init__.py 文件。那几个文件提醒 Python
为你的包加载要求的库和一定的应用程序代码文件,它们都位于同一的目录中。
清单 4 呈现了文本 locomotive/__init__.py 的内容。

 

清单 4. locomotive/__init__.py 

01

# system imports; loads installed packages

02

    import codecs

03

    import locale

04

    import sys

05

 

06

    # application imports; these load your specific *.py files

07

    import app

08

    import capture

09

    import category_associations

10

    import classify

11

    import rss

12

    import news

13

    import recommend

有了结构如 清单 4 所示的 locomotive
包之后,在品种的根目录中的主程序就可以导入并采取它。例如,文件
locomotive_main.py 包罗以下导入:

 

1

import sys         # >– system library

2

    import time        # >– system library

3

    importlocomotive  # >– custom application code library in the
“locomotive” directory

测试

 

Pythonunittest标准库提供一个可怜好的测试解决方案。熟谙 JUnit 的 Java
开发人士和熟习 Test::Unit 框架的 Ruby 开发人士应该会以为 清单 5 中的
Pythonunittest代码很不难领会。

 

清单 5. Python unittest 

01

class AppTest(unittest.TestCase):

02

 

03

      def setUp(self):

04

          self.app = locomotive.app.Application()

05

 

06

      def tearDown(self):

07

          pass

08

 

09

      def test_development_feeds_list(self):

10

          feeds_list = self.app.development_feeds_list()

11

          self.assertTrue(len(feeds_list) == 15)

12

          self.assertTrue(‘feed://news.yahoo.com/rss/stock-markets’
infeeds_list)

清单 5 中的代码还演示了 Python
的一个引人侧目标特点:所有的代码必须一律缩进,否则无法得逞编译。tearDown(self)方法或者在开班时看起来有点怪异。您可能会问,为何测试总是被硬编码为通过?事实上并非如此。这只是在
Python 中编辑空方法的一种办法。

 

工具

 

自己的确必要的是一个所有语法良好体现、代码已毕和断点调试成效的融会开发环境
(IDE),用该条件救助自己控制自己的 Python 学习曲线。作为利用 Eclipse IDE 举行Java
开发的一名用户,pyeclipse插件是本人设想的下一个工具。即使该插件有时相比较慢,但它工作得一定不错。我最终投资了
PyCharm IDE,它满足了自身的具有 IDE 要求。

 

在左右了 Python
及其生态系统的基本知识之后,终于来临起始落到实处机器学习解决方案的时候。

 

利用 Python 和 NLTK 落成分类

 

落到实处解决方案涉及捕获模拟的 RSS
提要、整理其文件、使用一个NaiveBayesClassifier和 kNN
算法对品种进行分拣。上边将会介绍那些操作中的每一个。

 

破获和剖析提要

 

该项目越发具有挑战性,因为客户还平昔不概念目标 RSS
提要列表。因而,也不设有
“陶冶多少”。所以,在初阶开发时期必须模拟提要和教练多少。

 

我用来取得示例提要多少的第三个措施是只领到在某个文本文件中指定的列表中的
RSS 提要。Python 提供了一个很好的 RSS
提要解析库,其名称为feedparser,它抽象不相同的 RSS 和 Atom
格式之间的差距。不难的按照文本的目的体系化的另一个立见成效的库被风趣地喻为pickle(泡菜)。那八个库在
清单 6 的代码中均有使用,清单 6 中的代码将每一个 RSS 提要捕获为
“腌制过的” 对象文件,以备后用。如您所见,Python
代码万分简短,且功用强大。

 

清单 6. CaptureFeeds 类 

01

import feedparser

02

import pickle

03

 

04

class CaptureFeeds:

05

 

06

    def __init__(self):

07

        for (i, url) in enumerate(self.rss_feeds_list()):

08

            self.capture_as_pickled_feed(url.strip(), i)

09

 

10

    def rss_feeds_list(self):

11

        f = open(‘feeds_list.txt’, ‘r’)

12

        list = f.readlines()

13

        f.close

14

        return list

15

 

16

    def capture_as_pickled_feed(self, url, feed_index):

17

        feed = feedparser.parse(url)

18

        f = open(‘data/feed_’ + str(feed_index) + ‘.pkl’, ‘w’)

19

        pickle.dump(feed, f)

20

        f.close()

21

 

22

if __name__ == “__main__”:

23

    cf = CaptureFeeds()

下一步的挑衅性之大是出乎意料的。现在,我有了样例提要多少,必须对它进行归类,以便将它用作陶冶多少。磨炼数据
是向你的归类算法提供的数据集,以便你能从中举办学习。

 

譬如说,我使用的样例提要包蕴了体育电视机网络商家 ESPN。提要的体系之一是有关
Denver Broncos 橄榄球队的 提姆 Tebow 被转接到 New York Jets
橄榄球队,在同一时间,Broncos 签了她们新的四分卫 Peyton
Manning。提要结果中的另一个门类是 Boeing Company 和它的新喷气式飞机
(jet)。所以,那里的难题是,应该将什么实际的品种值分配给第二个故事?tebow、broncos、manning、jets、quarterback、trade和nfl这么些值都是适量的。但只有一个值可以在陶冶多少中被指定为教练多少序列。同样,在第四个故事中,种类应该是boeing依旧jet?困难的局地在于那么些细节。假如你的算法要发生精确的结果,那么大型磨炼数据集的纯正手工分类分外重大。要到位那或多或少,不应当低估所需的时光。

 

自身要求动用越多的数额,而且那么些数据必须已展开了标准的分类,那种景色很快就变得精晓。我可以在何地找到那样的数量吧?进入
Python
NLTK。除了是一个上佳的语言文本处理库之外,它甚至还蕴藏可下载的演示数据集,或是其术语中的文集,
以及可以轻松访问此下载数据的应用程序编程接口。要安装 Reuters
文集,能够运作如下所示的下令。会有超常 10,000 篇新闻小说将下载到您的
~/nltk_data/corpora/reuters/ 目录中。与 RSS 提要项目同样,每篇 Reuters
音信小说中都涵盖一个题名和一个正文,所以这一个 NLTK
预分类的数码极度适合于模拟 RSS 提要。

 

1

$ python # enter an interactive Python shell

2

>>> import nltk        # import the nltk library

3

>>> nltk.download()    # run the NLTK Downloader, then enter
‘d’ Download

4

Identifier> reuters    # specify the ‘reuters’ corpus

专程令人感兴趣的是文件
~/nltk_data/corpora/reuters/cats.txt。它蕴涵了一个列表,其中富含文章文件名称,以及为各种篇章文件分配的类型。文件看起来如下所示,所以,子目录
test 中的文件 14828 中的小说与大旨grain有关。

 

1

test/14826 trade

2

test/14828 grain

自然语言是无规律的

 

RSS 提要分类算法的固有输入,当然是以保加乌鲁木齐语书写的文书。原始,确实如此。

 

从电脑处理的角度来看,丹麦语或其它自然语言(口语或普通的语言)都是极不规范和不标准的。首先,存在大小写的题材。单词
Bronco 是或不是等于
bronco?答案是,也许是。接下来,您要虚应故事标点和空格。bronco. 是还是不是等于
bronco 或 bronco,?算是吧。然后,有复数情势和一般的单词。run、running 和
ran 是不是等于?那有赖于不一致的场馆。那多个词有一个合伙的
词根。如若将自然语言词汇嵌入在标记语言(如
HTML)中,情况会怎么啊?在那种气象下,您必须处理像<strong>bronco</strong>那样的公文。最终,还有一个题目,就是那多少个平常使用但大约毫无意义的单词,像
a、and 和
the。这么些所谓的停用词卓殊不便。自然语言相当混乱;在处理在此之前,必要对它们举办规整。

 

侥幸的是,Python 和 NLTK 让您可以处以那些烂摊子。在 清单 7
中,RssItem类的normalized_words方法能够处理所有那个题目。请越发注意
NLTK 如何只行使一行代码就可以净化嵌入式 HTML
标记的原始小说文本!使用一个正则表明式删除标点,然后每个单词被拆分,并规范化为小写。

 

清单 7. RssItem 类 

01

class RssItem:

02

    …

03

    regex = re.compile(‘[%s]’ % re.escape(string.punctuation))

04

    …

05

    def normalized_words(self, article_text):

06

        words   = []

07

        oneline = article_text.replace(‘\n’, ‘ ‘)

08

        cleaned = nltk.clean_html(oneline.strip())

09

        toks1   = cleaned.split()

10

        for t1 in toks1:

11

            translated = self.regex.sub(”, t1)

12

            toks2 = translated.split()

13

            for t2 in toks2:

14

                t2s = t2.strip().lower()

15

                if self.stop_words.has_key(t2s):

16

                    pass

17

                else:

18

                    words.append(t2s)

19

        return words

只需这一行代码就可以从 NLTK 得到停用词列表;并且还帮忙任何自然语言:

 

1

nltk.corpus.stopwords.words(‘english’)

NLTK 还提供了有的 “词干分析器”
类,以便进一步规范化单词。请查看有关词干、词形归并、句子结构和语法的
NLTK 文档,精通关于的愈来愈多音信。

 

应用 Naive Bayes 算法举办分拣

 

算法在 NLTK 中被广大应用并选拔nltk.NaiveBayesClassifier类完结。Bayes
算法依据特性在其数据集中的每个存在或不设有对项目开展分拣。在 RSS
提要项目标境况下,每一个特征都是自然语言的一个加以的(清洁过的)单词。该算法是
“朴实” 的,因为它假如特性(在本例中,单词)之间一贯不任何涉及。

 

只是,朝鲜语那种语言蕴含当先 250,000 个单词。当然,我不愿意为了将 RSS
提要项目传递给算法就要为每个 RSS 提要项目创立一个富含 250,000
个布尔值的对象。那么,我会使用什么单词?简单的说,答案是在作育数据组中除了停用词之外最广大的单词。NLTK
提供了一个卓越的类,即nltk.probability.FreqDist,我得以用它来甄别这么些最常用的单词。在
清单 8
中,collect_all_words方法再次来到来自所有培训小说的有着单词的一个数组。

 

接下来,此数组被传送给identify_top_words方法,以确定最频仍的单词。nltk.FreqDist类的一个使得的特征是,它实质上是一个散列,可是它的键按其对应的值或计数
排序。由此,使用[:1000]Python 语法可以轻松取得最频仍的 1000 个单词。

 

清单 8. 使用 nltk.FreqDist 类 

01

def collect_all_words(self, items):

02

      all_words = []

03

      for item in items:

04

          for w in item.all_words:

05

              words.append(w)

06

      return all_words

07

 

08

  def identify_top_words(self, all_words):

09

      freq_dist = nltk.FreqDist(w.lower() for w in all_words)

10

      return freq_dist.keys()[:1000]

对此利用 NLTK Reuters 著作数据模拟的 RSS
提要项目,我急需规定每个项目标序列。为此,我读取前边提到的
~/nltk_data/corpora/reuters/cats.txt 文件。用 Python
读取一个文本分外简单,如下所示:

 

1

def read_reuters_metadata(self, cats_file):

2

      f = open(cats_file, ‘r’)

3

      lines = f.readlines()

4

      f.close()

5

      return lines

接下去的手续是收获每个 RSS
提要项目的特性。RssItem类的features方法(如下所示)可以成功那或多或少。在该办法中,在小说中的all_words数组首先被减去到一个较小的set对象,以排除重复的单词。然后会遍历top_words,并在该
set 中开展比较,确定是还是不是留存双重的单词。随后重返 1000
个布尔值组成的一个散列,以w_为键,前面是单词本身。那么些 Python
至极简单。

 

1

def features(self, top_words):

2

      word_set = set(self.all_words)

3

      features = {}

4

      for w in top_words:

5

          features[“w_%s” % w] = (w in word_set)

6

      return features

接下去,我搜集了陶冶集的 RSS
提要项目和它们分其他特色,并将它们传递给算法。清单 9
中的代码演示了那一个任务。请留意,分类器被陶冶成为只有一行代码。

 

1

def classify_reuters(self):

2

        …

3

        training_set = []

4

        for item in rss_items:

5

            features = item.features(top_words)

6

            tup = (features, item.category)  # tup is a 2-element tuple

7

            featuresets.append(tup)

8

        classifier = nltk.NaiveBayesClassifier.train(training_set)

NaiveBayesClassifier在运作中的 Python
程序的内存中,它现在是经过陶冶的。现在,我只需遍历要求开展分拣的 RSS
提要项目集,并要求分类器推断每个门类的品种。那很不难。

 

1

for item in rss_items_to_classify:

2

      features = item.features(top_words)

3

      category = classifier.classify(feat)

变得不那么踏实

 

如前所述,算法假使每个特性之间是未曾涉及的。因而,像 “machine learning”
和 “learning machine”,或者 “New York Jet” 和 “jet to New York”
那样的短语是一模一样的(to
是一个停用词)。在当然的言语上下文中,这一个单词之间有满世界瞩目的涉嫌。所以,我怎么会让算法变得
“不那么天真”,并识别这个单词的关联?

 

其间一个技术是在特色集内包涵广大的双字词(五个单词为一组)和三字词(多少个单词为一组)。NLTK
以nltk.bigrams(…)和nltk.trigrams(…)的款式对此提供了帮助,现在我们对此相应不再感觉奇怪了。正如可以从磨练数据组收集最常用的
n 个单词那样,也得以辨别最常用的双字词和三字词,并将它们作为特性。

 

你的结果会有所差别

 

对数码和算法进行宏观是一门艺术。您是或不是应该更为规范化单词集,也许应该包含词根?或者包含超过1000
个最常用单词?少一点是或不是合适?或者是还是不是相应选择更大的教练多少集?是还是不是应该加上越多信用词或
“停用词根”?那一个都是您要问自己的正确难题。使用它们举行实验,通过试错法,您可以会为您的数目完毕最佳算法。我发觉,85%
是一个很好的归类成功率。

 

使用 k-Nearest Neighbors 算法指出提议

 

客户愿意突显在选定体系或貌似种类中的 RSS 提要项目。现在,这个品种现已用
Naive Bayes
算法举办分类,这一要求的率先部分已获得了满意。较难的有的是兑现
“或一般连串”
的渴求。那是机械学习提议器系统初阶发挥功能的地点。提出器系统
按照其余门类的相似性来提议一个项目。亚马逊(Amazon).com 的出品指出和 非死不可的情人提议就是此功效的很好的演示。 www.2cto.com

 

k-Nearest Neighbors (kNN)
是最常用的指出算法。思路是向它提供一组标签(即连串),
并且每个标签都对应一个数量集。然后,该算法对各数据集举行了比较,以识别相似的档次。数据集由四个数值数组构成,数值的限制往往被规范化为从
0 到 1。然后,它可以从数额集识别相似的价签。与只暴发一个结出的 Naive
Bayes 差异,kNN 能够发生一个有排行的列表,其中富含若干(即,k
的值)个指出。

 

我意识,指出器算法比分类算法更便于领悟和已毕,但对于本文来说,其代码过于冗长,并且有千丝万缕的数学,无法在此地详述。请参阅由
Manning 出版的一本很好的新书 Machine Learning in Action,获取 kNN
编码示例(请参阅 参考资料 中的链接)。在 RSS
提要项目已毕的长河中,标签值是项目项目,而数据集是最常用的 1000
个单词的值数组。同样,在营造这几个数组时,一部分属于科学范畴,一部分属于数学范畴,还有一对属于艺术范畴。在数组中,每个单词的值都得以是差不多的
0 或 1
的布尔值、小说中单词出现次数的百分比、该比例的指数值,或部分其余值。

机器学习取决于
IT、数学和自然语言的纵横交叉,在大数据应用程序中会经常用到机械学习。本文将商量Python 编程语言和它的 NLTK 库,…

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图