3、Python基础回顾:数据类型、字符串操作、列表与字典、函数定义、文件读写

说实话,很多同学一上来就急着搞情感分析模型,结果连Python基础都磕磕绊绊。我见过太多人写代码时被一个列表切片卡住半天。别急,咱们花点时间把地基打牢。

这一章我会带你快速过一遍Python最核心的几个知识点。都是我在实际项目中天天用的东西。你想想看,如果连字符串都不会处理,怎么清洗用户评论?如果连字典都不会用,怎么存储情感得分?

3.1 数据类型:你得知道自己在跟什么打交道

Python里最常用的数据类型就那么几种。我习惯把它们分成两类:不可变类型可变类型

类型 示例 是否可变 我常用的场景
int 42, -1, 0 不可变 计数、索引
float 3.14, -0.5 不可变 情感得分、概率值
str "你好", 'positive' 不可变 文本数据、标签
list [1, 2, 3] 可变 批量数据、特征向量
dict {"name": "张三"} 可变 键值对存储、配置参数
bool True, False 不可变 条件判断、分类结果
小技巧:type() 函数随时检查变量类型。我在调试时经常这么干,省得猜来猜去。

3.2 字符串操作:处理文本的基本功

情感分析说白了就是跟文本打交道。字符串操作要是不过关,后面寸步难行。

常用操作一览:

text = "  这个电影真好看!  "

# 去除空白
clean = text.strip()
print(clean)  # "这个电影真好看!"

# 分割
words = "我,喜欢,Python".split(",")
print(words)  # ['我', '喜欢', 'Python']

# 拼接
sentence = " ".join(["今天", "天气", "不错"])
print(sentence)  # "今天 天气 不错"

# 大小写转换(英文场景常用)
label = "POSITIVE"
print(label.lower())  # "positive"

# 查找与替换
comment = "这个产品太差了"
if "差" in comment:
    print("检测到负面词")

重点:字符串是不可变的。你做的任何操作都会返回一个新字符串,原字符串不变。我刚开始学的时候老忘记这点,结果调试了半天。

我在项目中遇到过一个问题:用户评论里夹杂着各种标点符号和空格。直接用 split() 会得到一堆空字符串。后来我养成了习惯,先 strip()split(),干净利落。

3.3 列表与字典:数据结构的左膀右臂

列表和字典是我用得最多的两种数据结构。说白了,列表管顺序,字典管映射。

列表:有序的集合

# 创建
scores = [0.8, 0.2, 0.9, 0.1]

# 索引(从0开始)
print(scores[0])   # 0.8
print(scores[-1])  # 0.1(最后一个)

# 切片
print(scores[1:3])  # [0.2, 0.9]

# 添加
scores.append(0.5)
print(scores)  # [0.8, 0.2, 0.9, 0.1, 0.5]

# 列表推导式(我超爱这个)
positive_scores = [s for s in scores if s > 0.5]
print(positive_scores)  # [0.8, 0.9]
注意:列表是可变类型。你修改一个列表时,所有引用它的变量都会受影响。我曾经因为这个bug排查了一下午,后来改用 copy() 才解决。

字典:键值对的天下

字典在情感分析里太重要了。情感词典、配置参数、统计结果,全得靠它。

# 创建情感词典
sentiment_dict = {
    "好": 1.0,
    "棒": 0.8,
    "差": -1.0,
    "烂": -0.9
}

# 访问
print(sentiment_dict["好"])  # 1.0

# 安全访问(推荐)
score = sentiment_dict.get("一般", 0.0)
print(score)  # 0.0(没有就返回默认值)

# 遍历
for word, score in sentiment_dict.items():
    print(f"{word}: {score}")

# 更新
sentiment_dict["赞"] = 0.9

嗯,这里要注意:字典的键必须是不可变类型。字符串和数字没问题,但列表不行。我见过有人用列表当键,直接报错,一脸懵。

3.4 函数定义:把逻辑封装起来

写情感分析系统,你不可能把所有代码都堆在一起。函数就是你的积木块。

def analyze_sentiment(text, lexicon):
    """
    分析文本情感
    :param text: 输入文本
    :param lexicon: 情感词典
    :return: 情感得分
    """
    words = text.split()
    total_score = 0.0
    
    for word in words:
        score = lexicon.get(word, 0.0)
        total_score += score
    
    return total_score

# 调用
my_lexicon = {"开心": 1.0, "难过": -1.0}
result = analyze_sentiment("我今天很开心", my_lexicon)
print(result)  # 1.0
我的习惯:每个函数都写文档字符串(docstring)。别嫌麻烦,过两周你自己回来看代码,就知道有多香了。

函数参数这块,我建议你掌握三种:位置参数默认参数关键字参数。默认参数特别实用,比如给情感分析函数设一个默认词典。

def analyze(text, lexicon=None):
    if lexicon is None:
        lexicon = {"好": 1.0, "差": -1.0}
    # ... 处理逻辑
避坑指南:默认参数不要用可变对象!比如 def func(lst=[]) 这种写法,多次调用会累积数据。我曾经被这个坑过,后来一律用 None 加内部判断。

3.5 文件读写:数据进出的通道

情感分析离不开数据。你得从文件里读训练数据,也得把结果写回文件。

读文件:

# 推荐写法(with语句自动关闭文件)
with open("comments.txt", "r", encoding="utf-8") as f:
    content = f.read()  # 全部读取
    # 或者逐行读取
    # for line in f:
    #     print(line.strip())

写文件:

results = ["正面", "负面", "正面"]

with open("results.txt", "w", encoding="utf-8") as f:
    for result in results:
        f.write(result + "\n")
模式 说明 我什么时候用
"r" 只读 读取训练数据
"w" 写入(覆盖) 保存新结果
"a" 追加 日志记录
"r+" 读写 更新配置文件

重要提醒:处理中文文件时,一定要指定 encoding="utf-8"。我刚开始做项目时没注意,结果读出来的全是乱码,差点把电脑砸了。

我个人习惯把文件读写封装成函数。比如一个 load_data() 专门读数据,一个 save_results() 专门写结果。这样主逻辑干净,调试也方便。

好了,Python基础就回顾到这里。这些内容看着简单,但都是后面搭建情感分析系统的基石。你想想看,如果连这些都不熟练,后面处理几万条评论数据时,光调试就能把你逼疯。

下一章咱们开始真正动手,用这些基础知识搭建一个简单的情感分析原型。到时候你会发现,原来这些基础操作组合起来,能做出这么酷的东西。