- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章用Python进行一些简单的自然语言处理的教程由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
本月的每月挑战会主题是NLP,我们会在本文帮你开启一种可能:使用pandas和python的自然语言工具包分析你Gmail邮箱中的内容.
NLP-风格的项目充满无限可能:
将Gmail收件箱加载到pandas 。
让我们从项目实例开始!首先我们需要一些数据。准备你的Gmail的数据存档(包括你最近的垃圾邮件和垃圾文件夹).
https://www.google.com/settings/takeout 。
现在去散步吧,对于5.1G大小的信箱,我2.8G的存档需要发送一个多小时.
当你得到数据并为工程配置好本地环境之后好,使用下面的脚本将数据读入到pandas(强烈建议使用IPython进行数据分析) 。
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
34
35
36
37
38
|
from
mailbox
import
mbox
import
pandas as pd
def
store_content(message, body
=
None
):
if
not
body:
body
=
message.get_payload(decode
=
True
)
if
len
(message):
contents
=
{
"subject"
: message[
'subject'
]
or
"",
"body"
: body,
"from"
: message[
'from'
],
"to"
: message[
'to'
],
"date"
: message[
'date'
],
"labels"
: message[
'X-Gmail-Labels'
],
"epilogue"
: message.epilogue,
}
return
df.append(contents, ignore_index
=
True
)
# Create an empty DataFrame with the relevant columns
df
=
pd.DataFrame(
columns
=
(
"subject"
,
"body"
,
"from"
,
"to"
,
"date"
,
"labels"
,
"epilogue"
))
# Import your downloaded mbox file
box
=
mbox(
'All mail Including Spam and Trash.mbox'
)
fails
=
[]
for
message
in
box:
try
:
if
message.get_content_type()
=
=
'text/plain'
:
df
=
store_content(message)
elif
message.is_multipart():
# Grab any plaintext from multipart messages
for
part
in
message.get_payload():
if
part.get_content_type()
=
=
'text/plain'
:
df
=
store_content(message, part.get_payload(decode
=
True
))
break
except
:
fails.append(message)
|
上面使用Python的mailbox模块读取并解析mbox格式的邮件。当然还可以使用更加优雅的方法来完成(比如,邮件中包含大量冗余、重复的数据,像回复中嵌入的“>>>”符号)。另外一个问题是无法处理一些特殊的字符,简单起见,我们进行丢弃处理;确认你在这一步没有忽略信箱中重要的部分.
需要注意的是,除了主题行,我们实际上并不打算利用其它内容。但是你可以对时间戳、邮件正文进行各种各样有趣的分析,通过标签进行分类等等。鉴于这只是帮助你入门的文章(碰巧会显示来自我自己信箱中的结果),我不想去考虑太多细节.
查找常用词语 。
现在我们已经得到了一些数据,那么来找出所有标题行中最常用的10个词语: 。
1
2
3
4
5
6
7
8
|
# Top 10 most common subject words
from
collections
import
Counter
subject_word_bag
=
df.subject.
apply
(
lambda
t: t.lower()
+
" "
).
sum
()
Counter(subject_word_bag.split()).most_common()[:
10
]
[(
're:'
,
8508
), (
'-'
,
1188
), (
'the'
,
819
), (
'fwd:'
,
666
), (
'to'
,
572
), (
'new'
,
530
), (
'your'
,
528
), (
'for'
,
498
), (
'a'
,
463
), (
'course'
,
452
)]
|
嗯,那些太常见了,下面尝试对常用词语做些限制: 。
1
2
3
4
5
6
|
from
nltk.corpus
import
stopwords
stops
=
[
unicode
(word)
for
word
in
stopwords.words(
'english'
)]
+
[
're:'
,
'fwd:'
,
'-'
]
subject_words
=
[word
for
word
in
subject_word_bag.split()
if
word.lower()
not
in
stops]
Counter(subject_words).most_common()[:
10
]
[(
'new'
,
530
), (
'course'
,
452
), (
'trackmaven'
,
334
), (
'question'
,
334
), (
'post'
,
286
), (
'content'
,
245
), (
'payment'
,
244
), (
'blog'
,
241
), (
'forum'
,
236
), (
'update'
,
220
)]
|
除了人工移除几个最没价值的词语,我们也使用了NLTK的停用词语料库,使用前需要进行傻瓜式安装。现在可以看到我收件箱中的一些典型词语,但通常来讲在英文文本中并不一定同样是典型的.
二元词组和搭配词 。
NLTK可以进行另外一个有趣的测量是搭配原则。首先,我们来看下常用的“二元词组”,即经常一起成对出现的两个单词的集合: 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
from
nltk
import
collocations
bigram_measures
=
collocations.BigramAssocMeasures()
bigram_finder
=
collocations.BigramCollocationFinder.from_words(subject_words)
# Filter to top 20 results; otherwise this will take a LONG time to analyze
bigram_finder.apply_freq_filter(
20
)
for
bigram
in
bigram_finder.score_ngrams(bigram_measures.raw_freq)[:
10
]:
print
bigram
((
'forum'
,
'content'
),
0.005839453284373725
)
((
'new'
,
'forum'
),
0.005839453284373725
)
((
'blog'
,
'post'
),
0.00538045695634435
)
((
'domain'
,
'names'
),
0.004870461036311709
)
((
'alpha'
,
'release'
),
0.0028304773561811506
)
((
'default'
,
'widget.'
),
0.0026519787841697267
)
((
'purechat:'
,
'question'
),
0.0026519787841697267
)
((
'using'
,
'default'
),
0.0026519787841697267
)
((
'release'
,
'third'
),
0.002575479396164831
)
((
'trackmaven'
,
'application'
),
0.002524479804161567
)
|
我们可以对三元词组(或n元词组)重复相同的步骤来查找更长的短语。这个例子中,“new forum content”是出现次数最多的三元词组,但是在上面例子的列表中,它却被分割成两部分并位居二元词组列表的前列.
另外一个稍微不同类型的搭配词的度量是基于点间互信息(pointwise mutual information)的。本质上,它所度量的是给定一个我们在指定文本中看到的单词,相对于他们通常在全部文档中单独出现的频率,另外一个单词出现的可能性。举例来说,通常,如果我的邮件主题使用单词“blog”与/或“post”很多,那么二元组“blog post”并不是一个有趣的信号,因为一个单词仍然可能不和另一个单词同时出现。根据这条准则,我们得到一个不同的二元组的集合。 。
1
2
3
4
5
6
7
8
|
for
bigram
in
bigram_finder.nbest(bigram_measures.pmi,
5
):
print
bigram
(
'4:30pm'
,
'5pm'
)
(
'motley'
,
'fool'
)
(
'60,'
,
'900,'
)
(
'population'
,
'cap'
)
(
'simple'
,
'goods'
)
|
因此,我没有收到很多提到单词“motley”或者“fool”的邮件主题,但是当我看到其中任意一个,那么“Motley Fool”可能是相关联的.
情感分析 。
最后,让我们尝试一些情感分析。为了快速入门,我们可以使用以NLTK为基础的TextBlob库,它提供了对于大量的常用NLP任务的简单访问。我们可以使用它内建的情感分析(基于模式)来计算主题的“极性(polarity)”。从,表示高度负面情绪的-1到表示正面情绪的1,其中0为中性(缺乏一个明确的信号) 。
接下来:分析一段时间内的你的收件箱;看看是否能够通过邮件分类,确定正文的发送者/标签/垃圾这些基本属性。使用潜在语义索引去揭示所涵盖的最常用的常规主题。将你的发件文件夹输入到马尔科夫模型(Markov model)中,结合词性标注生成看起来连贯的自动回复 。
请让我们知道你是否使用NLP尝试了有趣的项目分支,包含一份开源库将作为加分点。你可以在challenge.hackpad.com看下前面的展示,以找到更多的灵感! 。
最后此篇关于用Python进行一些简单的自然语言处理的教程的文章就讲到这里了,如果你想了解更多关于用Python进行一些简单的自然语言处理的教程的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有一套使用两种语言的文档:英语和德语。关于这些文档没有可用的元信息,程序只能查看其内容。基于此,程序必须决定用哪种语言编写文档。 是否有可以在几个小时内实现的针对该问题的“标准”算法?或者,一个免费
背景 我有一个日志系统,可以将记录输出到 std::ostream .每条记录都用一个计数器进行注释,该计数器随着每个输出而增加 1,如下所示: ===== Batch # 5 ===== T
用户可能希望根据需要分隔数字。 从字符串中提取所有(自然)数字的最有效(或简单的标准函数)是什么? 最佳答案 您可以使用正则表达式。我从 Sun's regex matcher tutorial 修改
我认为如果表有代理键而没有(自然)替代键是没有意义的(请记住,代理键的属性之一是它在数据库之外没有意义环境)。 例如假设我有下表: 假设 employee_id 是代理主键,表中没有(自然)备用键。
我想将屏幕方向锁定为其默认方向。我在实现这一点时遇到问题。最初我将屏幕锁定为 list 中的肖像。它适用于纵向默认设备。但是许多平板电脑默认为横向,因此在这些设备中锁定纵向是不合适的,我想检测此默认方
我已将笔记本电脑上的触摸板滚动设置为倒置(自然)。它适用于任何地方(pdf、浏览器等),但在 vscode 中,它坚持正常滚动。通过 vscode 的设置文件没有显示适当的条目。 系统:Ubuntu
在我发现的许多在上限集合上使用可尾游标的示例中,代码包括: hint( { $natural: 1 } ) (例如 here ),包括官方文档 ( here ),以“确保我们不使用任何索引”,并且结果
@override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: T
一些上下文:Node.js、Bot、natural module . 我想构建一个机器人,并且我正在使用自然模块来解析用户输入并对其进行总体分类。 var classifier = new natur
我是一名优秀的程序员,十分优秀!