#Datawhale_NLP Task02:数据读取与数据分析

学习链接

文章目录

  • 1、笔记
  • 2、作业

1、笔记

# 分析句子长度
train_df['text_len'] = train_df['text'].apply(lambda x: len(x.split(' ')))
print(train_df['text_len'].describe())

关于代码块的详注:

  • 函数式编程:python允许利用关键字lambda创建匿名函数
def f(x):
    return 2 * x + 1


print(f(5))
# 11

lambda x: 2 * x + 1
g = lambda x: 2 * x + 1
print(g(5))
# 11

lambda基本语法是用冒号分割函数的参数及返回值,冒号左边是函数的参数,若有多个,就用逗号分割。

train_df['text_len'] = train_df['text'].apply(lambda x: len(x.split(' ')))
print(train_df['text_len'].describe())
  • apply()方法

函数f(x)的参数x值存在一个列表里,用apply()方法,按列表的存储顺序,以此对f进行传参。

apply(func,*args,**kwargs) 

func可以是匿名函数
参考笔记:apply()参数详解1(举例),apply()参数详解2

# 统计字符分布
all_lines = ' '.join(list(train_df['text']))
word_count = Counter(all_lines.split(" "))
word_count = sorted(word_count.items(), key = lambda d: d[1], reversed = True)
  • join() 方法
 str.join(sequence)

str用来给定分隔符的形式
参数sequence:可以是字符串、元组、列表
用途:以指定的字符(分隔符)将sequence中的元素连接起来生成一个新的字符串,返回连接后的字符串

 a = ['1', '2', '3', '4', '5']
print(' '.join(a))
# 1 2 3 4 5
print(' :'.join(a))
# 1 :2 :3 :4 :5
print('; '.join(a))
# 1; 2; 3; 4; 5
print('. '.join(a))
# 1. 2. 3. 4. 5
print(type('. '.join(a)))
# 

用join()相对应的一个方法是split()

  • split() 方法
string.split(str=" ", num=string.count(str))

str 给定分隔符,默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等。
num 给定分割次数。默认为 -1, 即分隔所有。
用途:通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则分隔 num+1 个子字符串,返回分割后的字符串列表

a = "a bcd.efg;hijk:lmn aaa"
print(a.split(' '))
# ['a', 'bcd.efg;hijk:lmn', 'aaa']
print(a.split(':'))
# ['a bcd.efg;hijk', 'lmn aaa']
print(a.split(';'))
# ['a bcd.efg', 'hijk:lmn aaa']
print(a.split('.'))
# ['a bcd', 'efg;hijk:lmn aaa']
print(type(a.split('.')))
# 

Counter的详细用法

# 统计字在每个句子中出现的情况
train_df['text_unique'] = train_df['text'].apply(lambda x: ' '.join(list(set(x.split(' ')))))
all_lines = ' '.join(list(train_df['text_unique']))
word_count = Counter(all_lines.split(" "))
word_count = sorted(word_count.items(),key = lambda d:int(d[1]), reverse = True)

set() 函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等。

2、作业

1、假设字符3750,字符900和字符648是句子的标点符号,请分析赛题每篇新闻平均由多少个句子构成?

biaodian_count1 = []
biaodian_count2 = []
biaodian_count3 = []
for each in train_df['text']:  # 把每一行的标点次数打印出来
    biaodian_count1.append(each.count('3750'))  # 每个标点出现的次数
    biaodian_count2.append(each.count('900'))
    biaodian_count3.append(each.count('648'))

print(mean(biaodian_count1) + mean(biaodian_count2) + mean(biaodian_count3))  # 所有标点出现的平均次数
# 79.80237

自己的方法有点笨笨,看别人闪闪发光的代码
举一反三的机灵鬼!!
一行顶十行!!
2、统计每类新闻中出现次数最多的字符

def getRows(label1, trainData):  # 获得包含新闻1的行名
    col_label = []
    i1 = 0
    for each in trainData['label']:
        if label1 == each:
            col_label.append(i1)
        i1 = i1 + 1
    return col_label

别人一行代码就够了额

grouped = train_df.groupby('label')
# 统计每类新闻中出现次数最多的字符
def getRows(label1, trainData):  # 获得包含新闻1abel的行名
    col_label = []
    i1 = 0
    for each in trainData['label']:
        if label1 == each:
            col_label.append(i1)
        i1 = i1 + 1
    return col_label


def countNews(x1):
    all_lines = ' '.join(str(x1))  # 将所有文本拼接起来
    word_count = Counter(all_lines.split(' '))
    word_count = sorted(word_count.items(), key = lambda d: int(d[1]), reverse = True)
    return word_count[0]


x = []
y = []
for i in range(14):
    z = x.append(getRows(i + 1, train_df))
    w = y.append(countNews(z))
    print("第" + str(i + 1) + "类新闻出现次数最多的字符:" + str(w))

#Datawhale_NLP Task02:数据读取与数据分析_第1张图片
我累了 不知道哪出问题了 先把卡打上吧 哎

问题:第一个def输出的是行号,
第二个def的输入是按照上述行号重新提取的文本
中间省略了按照一定行号提取并构建新的数据框的步骤。
今天改好啦,进度缓慢呀

# 统计每类新闻中出现次数最多的字符
def getRows(label, trainData):  # 获得包含新闻1的行号
    col_label = []
    i = 0
    for each in trainData['label']:
        if label == each:
            col_label.append(i)
        i = i + 1
    return col_label


def countNews(newDf):
    all_lines = ' '.join(list(newDf['text']))  # 将所有文本拼接起来
    word_count = Counter(all_lines.split(' '))
    word_count = sorted(word_count.items(), key = lambda d: int(d[1]), reverse = True)
    return word_count


train_df['text'] = train_df['text'].apply(lambda x: x.replace(' 3750', "").replace(' 900', "").replace(' 648', ""))
key = ['科技', '股票', '体育', '娱乐', '时政', '社会', '教育', '财经', '家居', '游戏', '房产', '时尚', '彩票', '星座']
for k in range(0, 14):
    col_Label = []
    col_Label = getRows(k, train_df)
    newdf = train_df.iloc[col_Label]
    w = countNews(newdf)
    print("%s类新闻出现次数最多的字符%s,出现次数为%d" % (key[k], w[0][0], int(w[0][1])))
# 科技类新闻出现次数最多的字符3370,出现次数为501748
# 股票类新闻出现次数最多的字符3370,出现次数为625287
# 体育类新闻出现次数最多的字符7399,出现次数为351851
# 娱乐类新闻出现次数最多的字符6122,出现次数为187882
# 时政类新闻出现次数最多的字符4411,出现次数为120317
# 社会类新闻出现次数最多的字符6122,出现次数为159089
# 教育类新闻出现次数最多的字符6248,出现次数为193738
# 财经类新闻出现次数最多的字符3370,出现次数为158886
# 家居类新闻出现次数最多的字符6122,出现次数为57290
# 游戏类新闻出现次数最多的字符7328,出现次数为46466
# 房产类新闻出现次数最多的字符3370,出现次数为67703
# 时尚类新闻出现次数最多的字符4939,出现次数为18587
# 彩票类新闻出现次数最多的字符4464,出现次数为51420
# 星座类新闻出现次数最多的字符4939,出现次数为9648

关于数据分组:
pandas 数据框loc和iloc用法总结
这个案例使用了loc分组
python中有一个内置函数groupby,可以分组,或者按标签值直接提取

你可能感兴趣的:(Datawhale_NLP)