“释放文本的潜力:对预嵌入文本清理方法的深入研究”

Exploring Pre-embedded Text Cleaning Methods to Unleash the Potential of Text

本文将讨论不同的清洗技术,这些技术对于从文本数据中获得最佳性能至关重要。

Photo by Amador Loureiro on Unsplash

为了演示文本清洗方法,我们将使用来自Kaggle的名为“metamorphosis”的文本数据集。

让我们从导入清洗过程所需的Python库开始。

import nltk, re, stringfrom nltk.corpus import stopwordsfrom nltk.stem.porter import PorterStemmer

现在让我们加载数据集。

file_directory = '链接到数据集本地目录'file = open(file_directory, 'rt', encoding='utf-8')text = file.read()file.close()

请注意,为了使上面的代码单元格正常工作,您需要放置数据文件的本地目录路径。

将文本数据按空格拆分为单词

words = text.split()print(words[:120])

在这里,我们看到标点符号被保留(例如armour-like和wasn’t),这很好。我们还可以看到句子结束的标点符号与最后一个单词保持在一起(例如,thought.),这不太好。

因此,这次让我们尝试使用非单词字符来拆分数据。

words = re.split(r'\W+', text)print(words[:120])

在这里,我们可以看到像‘thought.’这样的单词已被转换为‘thought’。但问题在于像‘wasn’t’这样的单词被转换为‘wasn’和‘t’两个单词。我们需要修复它。

在Python中,我们可以使用string.punctuation一次获取一堆标点符号。我们将使用它来从文本中删除标点符号。

print(string.punctuation)

所以现在我们将通过空格拆分单词,然后删除在数据中记录的所有标点符号

words = text.split()re_punc = re.compile('[%s]' % re.escape(string.punctuation))stripped = [re_punc.sub('', word) for word in words]print(stripped[:120])

在这里,我们可以看到没有像‘thought.’这样的单词,但我们也有像‘wasn’t’这样的单词,这是正确的。

有时文本还包含不可打印的字符。我们也需要过滤掉这些字符。为此,我们可以使用Python的‘string.printable’,它给出了一堆可以打印的字符。因此,我们将删除不在此列表中的字符。

re_print = re.compile('[^%s]' % re.escape(string.printable))result = [re_print.sub('', word) for word in stripped]print(result[:120])

现在让我们将所有单词变为小写。这将减少我们的词汇量。但这也有一些缺点。在这样做之后,像作为公司的‘Apple’和作为水果的‘apple’将被视为相同的实体。

result = [word.lower() for word in result]print(result[:120])

此外,只有一个字符的单词对大多数NLP任务没有贡献。因此,我们也会将它们删除。

result = [word for word in result if len(word) > 1]print(result[:120])

在NLP中,像’is’、’as’、’the’这样的频繁单词对模型训练的贡献不大。因此,这些单词被称为停用词,并建议在文本清理过程中将其删除。

import nltkfrom nltk.corpus import stopwordsstop_words = stopwords.words('english')print(stop_words)

result = [word for word in result if word not in set(stop_words)]print(words[:110])

现在,在此时点上,我们将具有相同意图的单词缩减为一个单词。例如,我们将’running’、’run’和’runs’这三个单词缩减为只有一个单词’run’,因为这三个单词在模型训练期间给出相同的意义。可以使用nltk库中的PorterStemmer类来执行此操作。

from nltk.stem.porter import PorterStemmerps = PorterStemmer()result = [ps.stem(word) for word in result]print(words[:110])

词干化的单词可能有意义,也可能没有意义。如果您希望单词有意义,那么可以使用词形还原技术,它保证转换后的单词具有意义。

现在让我们删除不只由字母组成的单词

result = [word for word in result if word.isalpha()]print(result[:110])

在这个阶段,文本数据看起来足够好,可以用于词嵌入技术。但请注意,对于某些特殊类型的数据(例如HTML代码),可能还有一些额外的步骤。

希望您喜欢这篇文章。如果对文章有任何想法,请告诉我。非常感谢任何建设性的反馈。

与我联系LinkedIn。

给我发邮件 [email protected]

祝您有美好的一天!