为什么对词进行标记/预处理以进行语言分析?

时间:2018-10-21 15:08:59

标签: python nltk tweepy analysis

我目前正在使用Python Tweet分析器,其中一部分将是计算常用词。我已经看过许多有关如何执行此操作的教程,并且大多数在进一步分析之前将文本字符串标记化。

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

4 个答案:

答案 0 :(得分:1)

需要这种方法,以便能够分辨出哪个单词占矢量中以数字表示字符串的哪个维度。此外,它有时还会使用其他编辑功能,例如小写单词和删除标点符号。让我们看下面的示例:

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

首先将句子分成一个列表,并删除符号,.,并确保字符串为小写。接下来是通过Counter对单词进行计数。您可以将此结果解释为向量[2 1 1 1 1 1 1]2代表is1代表单词just,依此类推)。如果您的词典越来越大,因为您正在利用更大的语料库,向量将越来越sparse,这意味着它们包含越来越多的零,并且其中包含的信息可以以更压缩的方式存储。

因此,如果您有一个要用数字表示的句子,则需要首先创建您的语料库字典,就像上面用一个句子完成的那样,这样您就可以分辨出哪个单词代表哪个维度。

您可以尝试以semi-structured数据格式表示上面的数据,例如JSON,但是会发现这本身并不是对数据的良好压缩表示。这种方法可以与在加载之前或保存之后对数据进行(解压缩)组合,但是这将多次导致性能下降,而构建字典仅需花费一次成本。

答案 1 :(得分:1)

尝试使用此句子:

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

我们看到我们对结果不满意。做了和没做(这是不做的缩略语)被视为不同的单词,“周”和“周”也是如此,

使用nltk标记时,此问题已得到解决(实际上,拆分是标记的一种幼稚方式):

Counter(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})

如果您想将“ cake”和“ cakes”视为同一个词,还可以对词进行定形:

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

返回

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

答案 2 :(得分:1)

也许我是非常正确的,但是令牌化不是简单地指的是基于定界符将输入流(在这种情况下为字符)拆分为接收任何被视为“令牌”的内容吗?

您的令牌可以是任意的:您可以在单词级别执行分析,其中令牌是单词,而分隔符是任何空格或标点符号。分析n-gram的可能性很高,其中您的标记对应于一组单词,并且完成了定界,例如通过滑动一个窗口。

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

然而,

标记化之后通常是词干和词根化处理,以减少噪声。考虑情感分析时,这一点变得很清楚:如果您看到令牌 happyhappilyhappiness,您是否希望分别对待它们,或者您是否愿意将它们结合到happy的三个实例中,以更好地传达更强的“变得幸福”的概念?

答案 3 :(得分:0)

标记化是理解文本处理中词典/词汇的一种简便方法。

分析文本中语言或模式的基本第一步是删除符号/标点和停用词。使用令牌化,您可以拆分大块文本来识别和删除可能不会增加价值的文本,在很多情况下,停用词(例如“ the”,“ a”,“ and”等)在识别过程中不会增加太多价值感兴趣的话。

单词频率在理解文本中单词的用法时也很常见,Google的Ngram允许进行语言分析,并列出多年来单词的流行度/频率。如果不对字符串进行标记化或拆分,则将没有基础来计算文本中出现的单词。

标记化还使您可以进行更高级的分析,例如标记语音部分或为某些单词分配情感。同样对于机器学习,文本大多经过预处理,以将它们转换为用于神经网络不同层的数组。如果不进行标记化,则输入将完全不同以至于无法进行任何分析。