智客公社

标题: 机器如何理解人类的语言:自然语言处理入门 [打印本页]

作者: VGOD喹    时间: 2022-7-14 09:22
标题: 机器如何理解人类的语言:自然语言处理入门

点击上方关注,All in AI中国

作者:Emma Grimaldi

[attach]767714[/attach]

自然语言处理(NLP)的应用是无止境的。例如机器将对电子邮件是否为垃圾邮件进行分类,分析评论是否正面的还是负面的,以及搜索引擎根据查询内容识别人员类型以相应地自定义响应。

自然语言处理对我来说是最吸引人的数据科学领域之一。机器能够以一定的准确度理解文本内容的事实令人着迷,有时甚至是可怕的。

但是这在实践中如何操作?这篇文章介绍了自然语言处理基础上的概念,并重点介绍了在Python中使用的nltk包。

注意:要运行下面的示例,你需要安装nltk库。如果没有,只需在你的shell中运行pip install nltk,然后在你的记事本中运行nltk.download(),然后再开始。

无论文本或句子被送入机器,都需要先进行简化,这可以通过词语切分(tokenization)和词形还原(lemmatization)来完成。这些复杂的单词意味着非常简单:词语切分意味着我们根据具体情况将文本拆分为单词或分组单词。词形还原意味着我们将一些单词转换为它们的根词,即复数单词变为单数单词,共轭动词变为基础动词,依此类推。在这些操作之前,我们还清除了所有不带有实际信息的单词,即所谓的停用词。

让我们看看下面的句子,通过一个例子来理解这一切意味着什么。

[attach]767715[/attach]

ngrams的词语切分和词形还原的示例

在词语切分文本时,重要的是相应地选择ngram。它是指定我们在每次词语切分想要多少个单词,在大多数情况下(如上例所示),此数字等于1。但如果在商业评论网站上运行情绪分析,可能是文本可能包含"不开心"或"不喜欢"这样的陈述,并且不希望这些词语传达文章内容的负面情绪。在这种情况下,你可能需要考虑增加ngram并查看它对分析的影响。

在词语切分时还需要考虑其他事项,例如标点符号。大多数时候,你可能想丢弃任何标点符号,因为它不包含任何信息,除非文本中有意义的数字。在这种情况下,你可能需要考虑保留标点符号或文本中包含的可以在任何地方拆分的数字。

在下面显示的代码中,使用了正则表达式标记符RegexpTokenizer。对于那些不熟悉正则表达式的人来说,在形式语言理论中,它是一个定义模式的字符序列,并且取决于在RegexpTokenizer函数中传递的参数,它将根据该参数拆分文本。在正则表达式中,\w +字面意思是将长度大于或等于1的所有单词字符分组,丢弃空格(并因此标记单个单词)和所有非单词字符,即标点符号。

[attach]767716[/attach]

这段代码产生的令牌列表是:tokens = ['Rome', 'was', 'founded', 'in', '753BC', 'by', 'its', 'first', 'king', 'Romulus']

一开始还不错,我们发现令牌中的标点符号消失了!现在我们必须从令牌中消除停用词:幸运的是,对于许多不同的语言,nltk中包含一个停用词列表。但是,根据单个案例,你可能需要自定义此单词列表。例如,本文在默认情况下包含在这样的列表中,如果你正在分析电影或音乐数据库,可能希望保留它,因为在这种情况下,它确实会发生变化(例如Helpand和 Help!,这是两部不同的电影)。

[attach]767717[/attach]

丢弃文本中的停用词

新的令牌列表是:

clean_tokens = ['Rome', 'founded', '753BC', 'first', 'king', 'Romulus']

我们从10个单词减少到6个单词,现在终于到了复习的时候了!到目前为止,已经测试了两个具有相同目的的对象:WordNetLemmatizer和PorterStemmer,后者肯定比前者更残酷,如下面的例子所示。

[attach]767718[/attach]

使用WordNetLemmatizer的词形还原示例。

最后一个列表理解的输出是:

['rome', 'found', '753bc', 'first', 'king', 'romulu']

这什么也没有改变!这是因为WordNetLemmatizer只对复数单词和其他一些内容起作用,在这种特殊情况下,没有任何单词实际上被词形转化。另一方面,PorterStemmer转换复数和派生词,共轭动词并使所有单词变成小写,如下所示:

[attach]767719[/attach]

PorterStemmer的简化示例。

列表理解的输出是:['rome', 'found', '753bc', 'first', 'king', 'romulu']

在这种情况下,不再有大写单词,这对我们来说没问题,因为仅仅根据小写或大写区分相同的单词是没有意义的,它们具有相同的含义。创建的found已被改为find,甚至Romulus也丢失了名字的最后一个字母,可能是因为PorterStemmer认为这是一个复数单词。

这些词形还原函数是非常不同的,根据具体情况,一个将比另一个更合适。

在建模之前,有许多不同的方法可以从文本中收集和组织单词,这些只是可用选项的一小部分。在将文本输入机器学习模型之前,对所有文字进行清洁都是必要的,以尽可能地简化它。当你在预测模型中分析大量单词时,在完成上述步骤后,你很可能会依赖于sklearn方法(如CountVectorizer,TfidfVectorizer或HashingVectorizer)将原始文本转换为令牌计数矩阵以训练测模型。

[attach]767720[/attach]
作者: haichaoy    时间: 2022-7-14 09:23
转发了
作者: 摄氏十三度    时间: 2022-7-14 09:23
转发了
作者: 在孤独中    时间: 2022-7-16 07:58
看起来不错
作者: 卤蛋等你60岁    时间: 2022-7-17 08:06
我是个凑数的。。。




欢迎光临 智客公社 (http://bbs.cnaiplus.com/) Powered by Discuz! X3.4