Python 为什么要为语言分析标记化/预处理单词?

Python 为什么要为语言分析标记化/预处理单词?,python,nltk,tweepy,analysis,Python,Nltk,Tweepy,Analysis,我目前正在开发一个Python tweet分析器,其中一部分内容是统计常用词。我已经看过很多关于如何做到这一点的教程,大多数都是在进一步分析之前对文本字符串进行标记化 当然,避免预处理的这一阶段并直接从字符串中计算单词会更容易——那么为什么要这样做呢?这种方法是必要的,以便能够告诉哪些单词占向量中以数字表示字符串的哪个维度。此外,它有时还使用额外的编辑,如小写单词和删除标点符号。让我们来看看下面的例子: from collections import Counter import re sent

我目前正在开发一个Python tweet分析器,其中一部分内容是统计常用词。我已经看过很多关于如何做到这一点的教程,大多数都是在进一步分析之前对文本字符串进行标记化


当然,避免预处理的这一阶段并直接从字符串中计算单词会更容易——那么为什么要这样做呢?

这种方法是必要的,以便能够告诉哪些单词占向量中以数字表示字符串的哪个维度。此外,它有时还使用额外的编辑,如小写单词和删除标点符号。让我们来看看下面的例子:

from collections import Counter
import re
sentence = 'This is just some sentence, which is nice.'
tokens = sentence.split(' ')
tokens = [re.sub(r'[,.]', '', t).lower() for t in tokens]
print(Counter(tokens))

# Output:
#   Counter({'is': 2, 'just': 1, 'nice': 1, 'sentence': 1, 'some': 1, 'this': 1, 'which': 1})
首先将句子拆分为一个列表,删除符号
以及
,并确保字符串为小写。接下来是通过
计数器
对单词进行计数。您可以将此结果解释为向量
[2 1]
(用
2
表示
1
这个词就是
等等)。如果你的字典越来越大,因为你使用的语料库越来越大,向量也越来越多,这意味着它们包含越来越多的零,其中包含的信息可以以更压缩的方式存储

因此,如果你想用数字表示一个句子,首先需要创建一个语料库词典,就像上面用一个句子所做的那样,这样你就可以知道哪个单词代表哪个维度


您可以尝试用数据格式(如JSON)表示上述数据,但会发现这本身并不是数据的良好压缩表示。这种方法可以与加载前或保存后(取消)压缩数据相结合,但这会导致性能损失多次,而构建字典只需一次性成本。

尝试以下句子:

text = "We like the cake you did this week, we didn't like the cakes you cooked last week"
不使用nltk令牌直接计数:

Counter(text.split())
返回:

Counter({'We': 1,
     'cake': 1,
     'cakes': 1,
     'cooked': 1,
     'did': 1,
     "didn't": 1,
     'last': 1,
     'like': 2,
     'the': 2,
     'this': 1,
     'we': 1,
     'week': 1,
     'week,': 1,
     'you': 2})
我们看到我们对结果不满意。did和not(是did not的缩写)被算作不同的词,“week”和“week”也被算作不同的词

当您使用nltk标记化时,这是固定的(分割实际上是一种简单的标记化方法):

返回

Counter({',': 1,
     'We': 1,
     'cake': 1,
     'cakes': 1,
     'cooked': 1,
     'did': 2,
     'last': 1,
     'like': 2,
     "n't": 1,
     'the': 2,
     'this': 1,
     'we': 1,
     'week': 2,
     'you': 2})
Counter({',': 1,
     'cake': 2,
     'cooked': 1,
     'did': 2,
     'last': 1,
     'like': 2,
     "n't": 1,
     'the': 2,
     'this': 1,
     'we': 2,
     'week': 2,
     'you': 2})
如果您想将“蛋糕”和“蛋糕”算作同一个词,您还可以将其柠檬化:

Counter([lemmatizer.lemmatize(w).lower() for w in nltk.word_tokenize(text)])
返回

Counter({',': 1,
     'We': 1,
     'cake': 1,
     'cakes': 1,
     'cooked': 1,
     'did': 2,
     'last': 1,
     'like': 2,
     "n't": 1,
     'the': 2,
     'this': 1,
     'we': 1,
     'week': 2,
     'you': 2})
Counter({',': 1,
     'cake': 2,
     'cooked': 1,
     'did': 2,
     'last': 1,
     'like': 2,
     "n't": 1,
     'the': 2,
     'this': 1,
     'we': 2,
     'week': 2,
     'you': 2})

也许我说得太对了,但标记化不是简单地指基于分隔符分割输入流(在本例中为字符)以接收任何被视为“标记”的内容吗

您的标记可以是任意的:您可以在单词级别执行分析,其中标记是单词,分隔符是任何空格或标点符号。您也可能分析n-gram,其中您的标记对应于一组单词,并通过滑动窗口等方式进行定界

简言之,为了分析文本流中的单词,您需要标记以接收“原始”单词进行操作


然而,标记化之后通常是词干化和柠檬化,以减少噪声。在考虑情绪分析时,这一点变得非常清楚:如果你看到标记
快乐
快乐
快乐
,你是想分别对待它们,还是想将它们组合成三个
快乐
的实例,以更好地传达“快乐”的更强烈概念?标记化是理解文本处理中词汇/词汇的一种简单方法

分析文本中的语言或模式的基本第一步是删除符号/标点符号并停止单词。通过标记化,您可以分割大块文本,以识别和删除可能不会增加价值的文本。在许多情况下,“the”、“a”、“and”等停止词在识别感兴趣的词时不会增加太多价值

词频在理解文本中单词的用法时也很常见,谷歌的Ngram允许进行语言分析,并绘制出一个单词多年来的流行程度/频率。如果不标记或拆分字符串,则无法计算文本中出现的单词


标记化还允许您运行更高级的分析,例如标记词性或为某些单词指定情感。同样对于机器学习,文本大多经过预处理,以将其转换为阵列,用于神经网络的不同层。如果没有标记化,输入将变得非常独特,无法运行任何分析。

引入停止字删除将减少结果的噪音,那么在没有标记化的情况下如何“计算单词数”?我想在
中使用
for I在技术上是标记化的,但它不会将单词分成单独的部分,声明的列表。您可能还希望将句子首字母
“We”
规范化为
“We”