为什么 tokenize/preprocess 词进行语言分析?
Why tokenize/preprocess words for language analysis?
我目前正在研究 Python 推文分析器,其中一部分将计算常用词。我看过很多关于如何做到这一点的教程,并且大多数在进一步分析之前标记文本字符串。
当然,避免这个预处理阶段并直接从字符串中计算单词会更容易 - 那么为什么要这样做?
需要这种方法,以便能够分辨出哪个单词占向量中以数字表示字符串的哪个维度。此外,它有时会使用额外的编辑,如小写单词和删除标点符号。让我们看看下面的例子:
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
表示 is
、1
单词 just
等等)。如果你的字典越来越大,因为你使用的是一个更大的语料库,向量会变得越来越多 sparse,这意味着它们包含越来越多的零,并且其中包含的信息可以以更压缩的方式存储。
因此,如果您有一个想要用数字表示的句子,则需要首先为您的语料库创建一个字典,就像上面用单个句子所做的那样,这样您就可以分辨出哪个词代表哪个维度。
您可以尝试以 semi-structured 数据格式表示上述数据,例如 JSON,但您会发现这本身并不是数据的良好压缩表示。这种方法可以在加载之前或保存之后与(取消)压缩数据相结合,但这会多次导致性能损失,而构建字典只会产生一次性成本。
尝试用这句话:
text = "We like the cake you did this week, we didn't like the cakes you cooked last week"
不使用 nltk 令牌直接计数:
Counter(text.split())
Returns :
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 和 didn't(did not 的缩写)被算作不同的词,'week' 和 'week,'
也是如此
当您使用 nltk 进行分词时,此问题已修复(拆分实际上是一种简单的分词方式):
Counter(nltk.word_tokenize(text))
Returns
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'算作同一个词,你也可以lemmatize:
Counter([lemmatizer.lemmatize(w).lower() for w in nltk.word_tokenize(text)])
Returns
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})
也许我说得太对了,但标记化不只是指根据分隔符拆分输入流(在本例中为字符)以接收任何被视为 "token" 的内容吗?
您的标记可以是任意的:您可以在单词级别执行分析,其中您的标记是单词,分隔符是任何 space 或标点符号。您分析 n-gram 的可能性也一样,其中您的标记对应于一组单词并完成定界,例如通过滑动 window.
所以简而言之,为了分析文本流中的单词,您需要标记化以接收 "raw" 个单词进行操作。
然而,标记化之后通常会进行词干提取和词形还原以减少噪音。在考虑情绪分析时,这一点变得非常清楚:如果您看到 标记 happy
、happily
和 happiness
,您是否想分别对待它们分开,或者您宁愿将它们组合成 happy
的三个实例以更好地传达更强烈的 "being happy" 概念?
标记化是理解文本处理中 lexicon/vocabulary 的简单方法。
分析文本中的语言或模式的基本第一步是删除 symbols/punctuations 和停用词。通过标记化,您可以拆分大块文本以识别和删除可能不会增加价值的文本,在许多情况下,停用词如 'the'、'a'、'and' 等可以在识别感兴趣的词方面没有太大价值。
单词频率在理解文本中单词的用法方面也很常见,Google 的 Ngram 允许进行语言分析并绘制出多年来单词的 popularity/frequency。如果不对字符串进行分词或拆分,就没有统计出现在文本中的单词的依据。
标记化还允许您 运行 更高级的分析,例如标记词性或为某些词分配情感。同样对于机器学习,文本大多被预处理以将它们转换为数组,这些数组用于神经网络的不同层。如果没有标记化,输入将完全不同 运行 任何分析。
我目前正在研究 Python 推文分析器,其中一部分将计算常用词。我看过很多关于如何做到这一点的教程,并且大多数在进一步分析之前标记文本字符串。
当然,避免这个预处理阶段并直接从字符串中计算单词会更容易 - 那么为什么要这样做?
需要这种方法,以便能够分辨出哪个单词占向量中以数字表示字符串的哪个维度。此外,它有时会使用额外的编辑,如小写单词和删除标点符号。让我们看看下面的例子:
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
表示 is
、1
单词 just
等等)。如果你的字典越来越大,因为你使用的是一个更大的语料库,向量会变得越来越多 sparse,这意味着它们包含越来越多的零,并且其中包含的信息可以以更压缩的方式存储。
因此,如果您有一个想要用数字表示的句子,则需要首先为您的语料库创建一个字典,就像上面用单个句子所做的那样,这样您就可以分辨出哪个词代表哪个维度。
您可以尝试以 semi-structured 数据格式表示上述数据,例如 JSON,但您会发现这本身并不是数据的良好压缩表示。这种方法可以在加载之前或保存之后与(取消)压缩数据相结合,但这会多次导致性能损失,而构建字典只会产生一次性成本。
尝试用这句话:
text = "We like the cake you did this week, we didn't like the cakes you cooked last week"
不使用 nltk 令牌直接计数:
Counter(text.split())
Returns :
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 和 didn't(did not 的缩写)被算作不同的词,'week' 和 'week,'
也是如此当您使用 nltk 进行分词时,此问题已修复(拆分实际上是一种简单的分词方式):
Counter(nltk.word_tokenize(text))
Returns
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'算作同一个词,你也可以lemmatize:
Counter([lemmatizer.lemmatize(w).lower() for w in nltk.word_tokenize(text)])
Returns
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})
也许我说得太对了,但标记化不只是指根据分隔符拆分输入流(在本例中为字符)以接收任何被视为 "token" 的内容吗?
您的标记可以是任意的:您可以在单词级别执行分析,其中您的标记是单词,分隔符是任何 space 或标点符号。您分析 n-gram 的可能性也一样,其中您的标记对应于一组单词并完成定界,例如通过滑动 window.
所以简而言之,为了分析文本流中的单词,您需要标记化以接收 "raw" 个单词进行操作。
然而,标记化之后通常会进行词干提取和词形还原以减少噪音。在考虑情绪分析时,这一点变得非常清楚:如果您看到 标记 happy
、happily
和 happiness
,您是否想分别对待它们分开,或者您宁愿将它们组合成 happy
的三个实例以更好地传达更强烈的 "being happy" 概念?
标记化是理解文本处理中 lexicon/vocabulary 的简单方法。
分析文本中的语言或模式的基本第一步是删除 symbols/punctuations 和停用词。通过标记化,您可以拆分大块文本以识别和删除可能不会增加价值的文本,在许多情况下,停用词如 'the'、'a'、'and' 等可以在识别感兴趣的词方面没有太大价值。
单词频率在理解文本中单词的用法方面也很常见,Google 的 Ngram 允许进行语言分析并绘制出多年来单词的 popularity/frequency。如果不对字符串进行分词或拆分,就没有统计出现在文本中的单词的依据。
标记化还允许您 运行 更高级的分析,例如标记词性或为某些词分配情感。同样对于机器学习,文本大多被预处理以将它们转换为数组,这些数组用于神经网络的不同层。如果没有标记化,输入将完全不同 运行 任何分析。