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