学习笔记

499 阅读6分钟

baseline:TFIDF统计特征

TF-IDF(Term Frequency-Inverse Document Frequency)是一种常用的文本特征表示方法,用于衡量一个词在文本中的重要性。TF-IDF结合了词频(TF)和逆文档频率(IDF),用于对每个词赋予一个权重,从而将文本数据转换为数值形式,便于在机器学习算法中使用。

下面对TF和IDF进行简单的解释:

  1. 词频(Term Frequency, TF): 词频指的是某个词在文本中出现的频率。TF可以通过以下公式计算:

TF(word, document) = (词word在文档document中出现的次数) / (文档document中的总词数)

词频衡量了一个词在文本中的重要程度,词频越高表示该词越重要。

  1. 逆文档频率(Inverse Document Frequency, IDF): IDF用于衡量一个词的稀有程度。它通过对整个文本数据集中包含该词的文档数量进行倒数处理,再取对数得到的值。IDF可以通过以下公式计算:

IDF(word) = log(文本数据集中的总文档数 / (包含词word的文档数 + 1))

IDF的值高表示该词较为稀有,可能具有更好的区分性。

  1. TF-IDF: TF-IDF是TF和IDF的乘积,用于综合考虑一个词在文本中的频率和在整个文本数据集中的稀有程度。TF-IDF可以通过以下公式计算:

TF-IDF(word, document) = TF(word, document) * IDF(word)

TF-IDF将词频和逆文档频率结合起来,能够突出每个词对文本的重要性。对于一个给定的文本,TF-IDF将计算出每个词的TF-IDF值,从而形成一个向量表示该文本。

TF-IDF在文本分类、信息检索、搜索引擎以及文本挖掘等任务中广泛应用。它能够有效地对文本进行特征表示,使得模型能够更好地捕捉文本的重要信息,从而提高文本分类和相关任务的性能。

TfidfVectorizer是scikit-learn库中用于将文本数据转换为TF-IDF特征表示的工具。它是一个方便而强大的文本特征提取器。下面介绍一些常用的TfidfVectorizer中的参数:

  1. stop_words(默认为None):停用词列表。停用词是那些在文本处理中经常被过滤掉的常见词汇,例如"a"、"the"、"and"等。可以传入一个列表,其中包含要过滤的停用词,TfidfVectorizer会自动在处理文本时忽略这些词汇。
  2. max_df(默认为1.0):用于设置词频的阈值。表示忽略在文档中出现频率超过max_df的词汇。可以是绝对的词频计数,也可以是相对的词频比例(例如0.8表示忽略在80%以上的文档中出现的词汇)。
  3. min_df(默认为1):用于设置词频的下限。表示忽略在文档中出现频率低于min_df的词汇。可以是绝对的词频计数,也可以是相对的词频比例。
  4. max_features(默认为None):指定最大特征数。根据TF-IDF值对所有特征进行排序,选择TF-IDF值最大的前max_features个特征。
  5. ngram_range(默认为(1, 1)):指定要考虑的n-gram范围。n-gram是连续的n个词组成的序列。例如,ngram_range=(1, 2)表示同时考虑单个词和相邻的两个词的组合。
  6. norm(默认为'l2'):用于对特征向量进行归一化的方式。'l2'表示欧几里得范数(即将向量缩放到单位范数),'l1'表示曼哈顿范数,None表示不归一化。
  7. use_idf(默认为True):是否使用逆文档频率(IDF)。如果为True,则计算TF-IDF特征;如果为False,则只计算TF特征。
  8. smooth_idf(默认为True):是否平滑逆文档频率(IDF)。如果为True,则在计算IDF时避免除以0,避免出现无穷大值。
  9. sublinear_tf(默认为False):是否使用子线性TF缩放。如果为True,则使用1 + log(TF)来替代普通的TF计算。
import glob
import numpy as np
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import cross_val_predict
from sklearn.metrics import classification_report

train_data = pd.read_csv('./ChatGPT生成文本检测器公开数据-更新/train.csv')
test_data = pd.read_csv('./ChatGPT生成文本检测器公开数据-更新/test.csv')

train_data['content'] = train_data['content'].apply(lambda x: x[1:-1])
test_data['content'] = test_data['content'].apply(lambda x: x[1:-1])

# 第1种tfidf参数
tfidf = TfidfVectorizer(token_pattern=r'\w{1}', max_features=2000)
train_tfidf = tfidf.fit_transform(train_data['content'])
test_tfidf = tfidf.fit_transform(test_data['content'])
print(classification_report(
    cross_val_predict(
        LogisticRegression(),
        train_tfidf,
        train_data['label']
    ),
    train_data['label'],
    digits=4
))

# 第2种tfidf参数
tfidf = TfidfVectorizer(token_pattern=r'\w{1}', max_features=5000)
train_tfidf = tfidf.fit_transform(train_data['content'])
test_tfidf = tfidf.fit_transform(test_data['content'])
print(classification_report(
    cross_val_predict(
        LogisticRegression(),
        train_tfidf,
        train_data['label']
    ),
    train_data['label'],
    digits=4
))

# 第3种tfidf参数
tfidf = TfidfVectorizer(token_pattern=r'\w{1}', max_features=5000, ngram_range=(1,2))
train_tfidf = tfidf.fit_transform(train_data['content'])
test_tfidf = tfidf.fit_transform(test_data['content'])
print(classification_report(
    cross_val_predict(
        LogisticRegression(),
        train_tfidf,
        train_data['label']
    ),
    train_data['label'],
    digits=4
))

m = LogisticRegression()
m.fit(
    train_tfidf,
    train_data['label']
)
test_data['label'] = m.predict(test_tfidf)
test_data[['name', 'label']].to_csv('tfidf.csv', index=None)

mycode:CountVectorizer统计特征

CountVectorizer是一种在自然语言处理中常用的文本特征提取方法,它可以将文本数据转化为词频矩阵。在Python的Scikit-Learn库中,CountVectorizer类用于实现这一功能。以下是一些常用参数的介绍:

  1. input (default='content'): 输入的数据,可以是列表、数组或文件路径。如果设置为'filename',则表示输入是文件路径,可以是一个文件路径的列表。如果设置为'text',则表示输入是文本数据。

  2. stop_words (default=None): 停用词表。可以传入一个字符串,表示使用内置的停用词表,也可以传入自定义的停用词表,或者设置为None表示不使用停用词。

  3. tokenizer (default=None): 分词器。可以传入一个自定义的函数来进行分词,如果不设置则使用内置的分词器。

  4. analyzer (default='word'): 分析器。可以选择'word'表示基于词的分析器,或'char'表示基于字符的分析器。

  5. ngram_range (default=(1, 1)): 用于生成多个词组的范围。比如,(1, 2)表示生成单个词和两个词组合的特征。

  6. max_df (default=1.0): 用于过滤过于频繁的词语。如果一个词在超过max_df比例的文档中出现,则被认为是无效词,不会被计入特征向量。

  7. min_df (default=1): 用于过滤过于稀少的词语。如果一个词在少于min_df个文档中出现,则被认为是无效词,不会被计入特征向量。

  8. max_features (default=None): 最大特征数。如果设置为整数,则只保留出现频率最高的max_features个特征。

  9. vocabulary (default=None): 自定义词汇表。可以传入一个字典,将词语映射到特定的索引。

  10. binary (default=False): 是否将词频转化为二进制特征。如果设置为True,则只有词是否出现过,而不考虑词频。

  11. dtype (default=np.int64): 特征矩阵的数据类型。

  12. lowercase (default=True): 是否将文本转为小写。

  13. preprocessor (default=None): 预处理函数。可以传入一个自定义的函数来预处理文本数据。

  14. tokenizer (default=None): 分词器。可以传入一个自定义的函数来进行分词。

  15. strip_accents (default=None): 是否去除文本中的重音符号。

  16. decode_error (default='strict'): 解码错误处理方式。

import numpy as np
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.model_selection import cross_val_predict
from sklearn.metrics import classification_report

# 读取训练和测试数据
train_data = pd.read_csv('./ChatGPT生成文本检测器公开数据-更新/train.csv')
test_data = pd.read_csv('./ChatGPT生成文本检测器公开数据-更新/test.csv')

# 移除内容列中的第一个和最后一个字符
train_data['content'] = train_data['content'].apply(lambda x: x[1:-1])
test_data['content'] = test_data['content'].apply(lambda x: x[1:-1])

# 使用CountVectorizer进行特征提取
count_vectorizer = CountVectorizer(token_pattern=r'\w{1}', max_features=5000, ngram_range=(1,2))
train_count = count_vectorizer.fit_transform(train_data['content'])
test_count = count_vectorizer.transform(test_data['content'])

# 使用交叉验证进行预测,并打印分类报告
print(classification_report(
    cross_val_predict(
        LogisticRegression(),
        train_count,
        train_data['label'],
    ),
    train_data['label'],
    digits=4
))

# 使用CountVectorizer训练逻辑回归模型,并进行预测
m = LogisticRegression()
m.fit(
    train_count,
    train_data['label']
)
test_data['label'] = m.predict(test_count)

# 将预测结果保存到CSV文件
test_data[['name', 'label']].to_csv('count_vectorizer.csv', index=None)

结果

微信图片_20230809222039.png