Python自然语言处理 NLTK 库用法入门教程【经典】

本周,公司付出工作不多,无加班,于是从头研究新职能更正塞尔维亚(Република Србија)语专有名词大小写的实现。

你只怕会说,那是一件简单的事务。作者不要求使用 NLTK
标记器,并且小编得以应用正则表明式来划分句子,因为种种句子前后都有标点符号或许空格。

何以革新和优化代码逻辑

本身在写那几个意义的时候,也在探讨和参照一些现有开源项目标落到实处逻辑。在旁观开源项目
auto-correct 的一个
commit
上后(PS:这几个 PKuga 是社区大神 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;
}
from nltk.stem import PorterStemmer
stemmer = PorterStemmer()
print(stemmer.stem('increases'))

什么防止超负荷替换

在小编认为就要马到功成的时候,小编用事先写好的 PHPUnit
单元测试代码进行了测试,结果报出了不当,在上述方法中,如若传入的参数是带有
HTML 标签的富文本,那么 HTML 的因素、成分属性以及值都有大概会被替换。

什么避免超负荷替换这么些题材吗?相当于说:

只替换文本,而忽略 HTML 标签及标签内部的故事情节?

本人尝试写了一些套匹配方案,都失败了。最终依旧请出了 谷歌(Google)大神来扶持。那里,搜索的关键字很重点,最好想把您要寻找的首要性词翻译成对应的英文单词,那样搜索出的结果会令你更中意。结果自个儿找到了化解方案:Matching
A Word / Characters Outside Of Html
Tags。

经过地方那部小说的唤起,作者又将 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;
}

work

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

咱俩在本 NLP
教程中切磋的有所手续都涉及到文本预处理。在以往的小说中,大家将研商使用Python
NLTK进行文本分析。

说到底的话

一经还有何样需求说的话,那就是求 Star
啦,哈哈哈哈哈。项目地址:

可是搜索引擎并不是自然语言处理(NLP)的唯一运用。还有更好进而出彩的行使。

开发总括

  • 学会科学上网;
  • 擅长 谷歌、Github 和
    StackOverflow,那三样“神器”会帮你解决掉开发进程中遇到的多边(只怕说所有)问题;
  • 学会一些 谷歌搜索小技巧。例如将追寻关键字翻译成土耳其(Turkey)语单词,那样的寻找结果会令你更惬意;
  • 斯洛伐克(Slovak)语真的很主要。最起码你应有在 Chrome 浏览器上安装三个 Google
    翻译
    的插件;
  • PHPUnit 真的很有用,尤其是在频仍增改作用如故需求代码重构的体系中。
  • 毫无让自个儿仅限于多少个编程语言,学习其余一门或多门语言作为帮衬,有益于拓展思路和开辟眼界。
  • 多逛逛 Laravel China 那样的高格调社区;

结果是:

葡萄牙语专盛名词的数码出自

率先,面临的率先个难题是:

乌克兰语专出名词的数据从哪来?

自个儿第3想到的是 Python 有3个自然语言处理的包
NLTK,那几个包有个名为 pos_tag
的函数,可以用来鉴别并标注每一个单词的词性,其中被标明为 NNP 或 NNPS
的单词就是专有名词(Proper Noun)。小编估算,NLTK
数据包里应该有三个对应的专盛名词数据集,但是,苦于能力简单,作者一直尚未找到。

上述的门道走不通后,小编又经过 谷歌搜索,发现经过互连网字典来获取数据是一条有效的方案。通过这一措施,终于在
Wiktionary
找到了韩文专闻名词列表。于是,利用 Python
写了二个爬虫小本子,爬取了相应的多少。

末段,就是对爬取到的数量开展了一些打点和筛选。

筛选方案如下:

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

本篇小说不是为着记开发流水账,而是想把付出进程的相逢的标题以及缓解思路和大家展开交流和上学。我是一名普通的
PHP
工程师,希望对初级开发同学有所支持。具体的心得体会师襄子末的总结

结果是:

chinese-typesetting
包涵以下职能:

采纳 NLTK 对文本分词

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

最初的代码如下:

/**
 * 专有名词使用正确的大小写
 * 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;
}

从 WordNet 获取反义词

本月底,作者在 GitHub
上开源了一个协调的小品种:chinese-typesetting。这是2个校订普通话文案排版的
Composer 包。

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'))
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))

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

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)

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

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

在本文撰写之时,你可以在 Python 2.7 , 3.4 和 3.5
上都可以利用NLTK。可能可以由此得到tar
进行源码安装。

可以吗,让我们独家品尝一些单词的词干提取和词形还原:

词频统计

你可以应用 SnowballStemmer 类的 stem()函数来领取非斯洛伐克语单词,如下所示:

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

你可以在那边查看Python List
函数, 
了然怎么处理列表。

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

NLTK 具有一大半语言的平息词表。要赢得英文截止词,你可以利用以下代码:

简单易行的说,自然语言处理( NLP
)就是支付可以了然人类语言的应用程序和服务。

愿意本文所述对我们Python程序设计有着辅助。

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

play
playing
playing
playing

import nltk
nltk.download()

以下都是自然语言处理(NLP)的有的得逞使用:

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

最后,让大家通过以下方法将文件分词:

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))

在这么些 NLP 教程中,我们将使用 Python NLTK 库。在初步安装  NLTK
此前,我倘诺你知道有些
Python入门知识。

NLP的作用

由此 NLTK 你可以取得给定词的概念和例句:

还有别的一些领取算法,如 Lancaster 提取算法。这几个算法的出口同 Porter算法的结果在多少个单词上不同。你可以品尝他们多个算法来查看有怎么着不相同结果。

安装 NLTK

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

当今有许多开源的自然语言处理(NLP)库。比如:

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

结果将是这么的:

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"))
import urllib.request
response = urllib.request.urlopen('http://php.net/')
html = response.read()
print (html)

NLP的应用

您可以挑选安装具有的软件包,因为它们的体量不大,所以没有何样难点。今后,我们起初攻读呢!

正如大家所知,天天博客,社交网站和网页会时有暴发数亿字节的海量数据。

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

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

NLTK词干提取

如果你还记得大家接纳 nltk.download( ) 安装 NLTK
的恢宏包时。其中八个伸张包名为 WordNet。WordNet
是为自然语言处理打造的数据库。它包涵部分词语的三个同义词组和二个简易的概念。

你可以采纳 WordNet 来收获同义词:

结果是: 

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))
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)

词干化和词化差距

有诸多集团热衷收集全部那些数据,以便更好地明白他们的用户和用户对成品的心潮澎湃,并对他们的产品或然服务举办适宜的调整。

输出如下:

结果可能是同义词或有所同等含义的两样词语。有时,借使你准备还原三个词,比如
playing,还原的结果要么
playing。那是因为暗中认同还原的结果是名词,倘诺您想取得动词,可以透过以下的措施钦点。

SnowballStemmer 类,除了葡萄牙语外,还足以适用于其它 13
种语言。协助的言语如下:

首先,大家将抓取一些网页内容。然后来分析网页文本,看看爬下来的网页的主旨是有关怎么样。我们将应用
urllib模块来抓取网页:

在作者看来,词形还原比提取词干的法门更好。词形还原,假诺实在心有余而力不足回去那么些词的变形,也会回来另1个的确的单词;那些单词只怕是3个同义词,但不管如何那是三个真的的单词。当有时候,你不关怀准确度,须要的只是速度。在那种意况下,词干提取的法子更好。

呃!Mr. 是几个词,纵然涵盖多少个标记。让我们来试试看使用 NLTK 举办分词:

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

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

stone
speak
bedroom
joke
lisa

purpl

stone
speaking
bedroom
joke
lisa
purple

接纳 WordNet 引入词汇

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

输出是:

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))

相关文章