Python 文本清洗和预处理的 15 项技术

文摘   2024-11-02 06:34   江苏  

文本清洗和预处理是自然语言处理(NLP)中的重要步骤。无论你是处理社交媒体数据、新闻文章还是用户评论,都需要先对文本进行清洗和预处理,以确保后续的分析或建模能够顺利进行。本文将详细介绍15项Python文本清洗和预处理技术,并通过实际代码示例来帮助你更好地理解和应用这些技术。

1. 去除空白字符

空白字符包括空格、制表符、换行符等,这些字符通常不会影响文本内容的意义,但会增加数据的复杂性。使用 strip()replace() 方法可以轻松去除这些字符。

text = "  Hello, World! \n"
clean_text = text.strip()  # 去除首尾空白字符
print(clean_text)  # 输出: Hello, World!

text_with_tabs = "Hello\tWorld!"
clean_text = text_with_tabs.replace("\t"" ")  # 将制表符替换为空格
print(clean_text)  # 输出: Hello World!

2. 转换为小写

将所有文本转换为小写可以避免因大小写不同而引起的不一致问题。

text = "Hello, World!"
lower_text = text.lower()
print(lower_text)  # 输出: hello, world!

3. 去除标点符号

标点符号通常不会对文本的语义产生实质性的影响,但在某些情况下(如情感分析)可能会有影响。使用 string 模块中的 punctuation 可以轻松去除标点符号。

import string

text = "Hello, World!"
clean_text = text.translate(str.maketrans("""", string.punctuation))
print(clean_text)  # 输出: Hello World

4. 分词

分词是将文本分割成单词或短语的过程。使用 nltk 库的 word_tokenize 方法可以实现这一点。

import nltk
from nltk.tokenize import word_tokenize

nltk.download('punkt')
text = "Hello, World! This is a test."
tokens = word_tokenize(text)
print(tokens)  # 输出: ['Hello', ',', 'World', '!', 'This', 'is', 'a', 'test', '.']

5. 去除停用词

停用词是那些在文本中频繁出现但对语义贡献不大的词汇,如“the”、“is”等。使用 nltk 库的 stopwords 模块可以去除这些词。

from nltk.corpus import stopwords

nltk.download('stopwords')
stop_words = set(stopwords.words('english'))
tokens = ['Hello''World''This''is''a''test']
filtered_tokens = [token for token in tokens if token not in stop_words]
print(filtered_tokens)  # 输出: ['Hello', 'World', 'test']

6. 词干提取

词干提取是将单词还原为其基本形式的过程。使用 nltk 库的 PorterStemmer 可以实现这一点。

from nltk.stem import PorterStemmer

stemmer = PorterStemmer()
words = ['running''jumps''easily']
stemmed_words = [stemmer.stem(word) for word in words]
print(stemmed_words)  # 输出: ['run', 'jump', 'easili']

7. 词形还原

词形还原是将单词还原为其词典形式的过程。使用 nltk 库的 WordNetLemmatizer 可以实现这一点。

from nltk.stem import WordNetLemmatizer

nltk.download('wordnet')
lemmatizer = WordNetLemmatizer()
words = ['running''jumps''easily']
lemmatized_words = [lemmatizer.lemmatize(word) for word in words]
print(lemmatized_words)  # 输出: ['running', 'jump', 'easily']

8. 去除数字

数字通常不会对文本的语义产生实质性的影响。使用正则表达式可以轻松去除数字。

import re

text = "Hello, World! 123"
clean_text = re.sub(r'\d+''', text)
print(clean_text)  # 输出: Hello, World! 

9. 去除特殊字符

特殊字符如 @#$ 等通常不会对文本的语义产生实质性的影响。使用正则表达式可以轻松去除这些字符。

text = "Hello, @World! #Python $123"
clean_text = re.sub(r'[^\w\s]''', text)
print(clean_text)  # 输出: Hello  World  Python 123

10. 去除 HTML 标签

如果文本来自网页,可能包含 HTML 标签。使用 BeautifulSoup 库可以轻松去除这些标签。

from bs4 import BeautifulSoup

html_text = "<html><body><h1>Hello, World!</h1></body></html>"
soup = BeautifulSoup(html_text, 'html.parser')
clean_text = soup.get_text()
print(clean_text)  # 输出: Hello, World!

11. 去除 URL

URL 通常不会对文本的语义产生实质性的影响。使用正则表达式可以轻松去除 URL。

text = "Check out this link: https://example.com"
clean_text = re.sub(r'http\S+|www.\S+''', text)
print(clean_text)  # 输出: Check out this link: 

12. 去除重复单词

重复单词可能会增加文本的复杂性。使用集合可以轻松去除重复单词。

tokens = ['Hello''World''Hello''Python''Python']
unique_tokens = list(set(tokens))
print(unique_tokens)  # 输出: ['Hello', 'Python', 'World']

13. 去除短词

短词通常不会对文本的语义产生实质性的影响。可以设置一个阈值来去除长度小于该阈值的单词。

tokens = ['Hello''World''a''is''Python']
min_length = 3
filtered_tokens = [token for token in tokens if len(token) >= min_length]
print(filtered_tokens)  # 输出: ['Hello', 'World', 'Python']

14. 去除罕见词

罕见词可能会增加文本的复杂性。可以设置一个频率阈值来去除出现次数少于该阈值的单词。

from collections import Counter

tokens = ['Hello''World''Hello''Python''Python''test''test''test']
word_counts = Counter(tokens)
min_frequency = 2
filtered_tokens = [token for token in tokens if word_counts[token] >= min_frequency]
print(filtered_tokens)  # 输出: ['Hello', 'Hello', 'Python', 'Python', 'test', 'test', 'test']

15. 使用正则表达式进行复杂清洗

正则表达式是一种强大的工具,可以用于复杂的文本清洗任务。例如,去除特定模式的字符串。

text = "Hello, World! 123-456-7890"
clean_text = re.sub(r'\d{3}-\d{3}-\d{4}''PHONE', text)
print(clean_text)  # 输出: Hello, World! PHONE

实战案例:清洗社交媒体评论

假设你有一个包含社交媒体评论的数据集,需要对其进行清洗和预处理。我们将综合运用上述技术来完成这个任务。

import pandas as pd
import re
import string
from nltk.tokenize import word_tokenize
from nltk.corpus import stopwords
from nltk.stem import WordNetLemmatizer
from bs4 import BeautifulSoup

# 下载必要的NLTK资源
nltk.download('punkt')
nltk.download('stopwords')
nltk.download('wordnet')

# 示例数据
data = {
    'comment': [
        "Check out this link: https://example.com",
        "Hello, @World! #Python $123",
        "<html><body><h1>Hello, World!</h1></body></html>",
        "Running jumps easily 123-456-7890"
    ]
}

df = pd.DataFrame(data)

def clean_text(text):
    # 去除HTML标签
    text = BeautifulSoup(text, 'html.parser').get_text()
    
    # 去除URL
    text = re.sub(r'http\S+|www.\S+''', text)
    
    # 去除特殊字符
    text = re.sub(r'[^\w\s]''', text)
    
    # 去除数字
    text = re.sub(r'\d+''', text)
    
    # 转换为小写
    text = text.lower()
    
    # 分词
    tokens = word_tokenize(text)
    
    # 去除停用词
    stop_words = set(stopwords.words('english'))
    tokens = [token for token in tokens if token not in stop_words]
    
    # 词形还原
    lemmatizer = WordNetLemmatizer()
    tokens = [lemmatizer.lemmatize(token) for token in tokens]
    
    # 去除短词
    tokens = [token for token in tokens if len(token) >= 3]
    
    # 去除罕见词
    word_counts = Counter(tokens)
    min_frequency = 2
    tokens = [token for token in tokens if word_counts[token] >= min_frequency]
    
    return ' '.join(tokens)

# 应用清洗函数
df['cleaned_comment'] = df['comment'].apply(clean_text)
print(df)

总结

本文详细介绍了15项Python文本清洗和预处理技术,包括去除空白字符、转换为小写、去除标点符号、分词、去除停用词、词干提取、词形还原、去除数字、去除特殊字符、去除HTML标签、去除URL、去除重复单词、去除短词、去除罕见词以及使用正则表达式进行复杂清洗。通过实际代码示例,我们展示了如何应用这些技术来清洗和预处理文本数据。最后,我们通过一个实战案例,综合运用这些技术对社交媒体评论进行了清洗和预处理。

好了,今天的分享就到这里了,我们下期见。如果本文对你有帮助,请动动你可爱的小手指点赞、转发、在看吧!

付费合集推荐

Python编程基础

Python办公自动化-Excel

微信公众号批量上传发布系统

文末福利

公众号消息窗口回复“编程资料”,获取Python编程、人工智能、爬虫等100+本精品电子书。

精品系统

微信公众号批量上传发布系统

关注我👇,精彩不再错过


手把手PythonAI编程
分享与人工智能和python编程语言相关的笔记和项目经历。
 最新文章