Python レベル 2 プログラミングの質問「清華大学から MIT まで」

1. トピック

data.txt ファイルを取得し、「清華大学から MIT へ」という記事を読み、jieba ライブラリの関数 Icut のフル モードを使用して単語の分割を行い、統計的な語彙の長さは 2 です。

単語の出現数、出現数の多い上位 10 単語と出現数を出力します。

2.エフェクト表示

例 1 : ‫‬

输入:从data.txt文件读入
输出:"
大学:21‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬
设计:20‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬
美国:16‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬
清华:15‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬
学生:14‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬
教授:12‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬
课程:11‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬
一个:10‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬
国大:8‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬
计算:8

3. コード表示

1. 公式コード

import jieba        # 导入jieba中文分词库
dk = {}             # 定义dk字典变量 type(dk):<class 'dict'>

#使用with后不管with中的代码出现什么错误,都会进行对当前对象进行清理工作。
#例如file的file.close()方法,无论with中出现任何错误,都会执行file.close()方法

#以指定utf-8编码只读方式打开data.txt文件,文件句柄命名为f
with open('data.txt','r',encoding = "utf-8") as f:  
    sl = f.readlines()

#print(type(f))    f是<class '_io.TextIOWrapper'>文件句柄的类型
#print(type(sl))   sl是一个列表,包含了文件中每一行内容
#print(type(sl[0]))  sl[0]是列表sl中第一个元素,是文件中第一行所有内容

for s in sl:        #循环读取列表元素
    k =jieba.lcut(s, cut_all = True)
    #对每个s,使用jieba.lcut函数以全模式方式返回一个列表(由词语组成)
    for wo in k:    #对每个词语进行筛选
        if len(wo) == 2:    #如果词语的长度为2,进行统计
           dk[wo] = dk.get(wo,0) + 1
           #逐步构建统计字典,形式如{"大学":1,"设计":2,...},备注,这里的1、2是逐渐变化中

dp = list(dk.items())   #转换为列表,列表中元素为元组。
dp.sort(key= lambda x:int(x[1]), reverse = True)

for i in range(10):   #输出排序后的内容
   print("{}:{}".format(dp[i][0],dp[i][1]))

2. 個人的な解決策

import jieba
dk = {}
with open('data.txt','r',encoding="utf-8") as f:
    text = f.read()
    lst = jieba.lcut(text,cut_all=True)
    for elm in lst:  
        if len(elm) == 2:
            dk[elm] = dk.get(elm,0)+1
dp = list(dk.items())
dp.sort(key= lambda x:int(x[1]), reverse = True)
for k,v in dp[:11]:  #这里列表只取前10个,因为已经排过序了。
    print(k+":"+str(v))

3. 最適化されたバージョン

import jieba
dk = {}
with open('data.txt','r',encoding="utf-8") as f:
    text = f.read()
    lst = [elm for elm in jieba.lcut(text,cut_all=True) if len(elm) ==2]
    for i in lst:  
        dk[elm] = dk.get(elm,0)+1
dp = list(dk.items())
dp.sort(key= lambda x:int(x[1]), reverse = True)
for k,v in dp[:11]:  #这里列表只取前10个,因为已经排过序了。
    print(k+":"+str(v))

4. 放課後の振り返り

  1. Python の二次辞書のソートはほぼ必須、sort、lambda、jieba をうまく使いこなす必要がある、単語分割結果が完全パターンかどうかに注意する。
  2. ソートとソートの使用法の違いに注意してください。ソートはリストを変更すること、ソートは元のリストを変更せずにコピーを生成することです。

おすすめ

転載: blog.csdn.net/henanlion/article/details/130889864