請編寫程式,對一段英文文字,統計其中所有不同單詞的個數,以及詞頻最大的前10%的單詞。
所謂「單詞」,是指由不超過80個單詞字元組成的連續字串,但長度超過15的單詞將只擷取保留前15個單詞字元。而合法的「單詞字元」為大小寫字母、數字和下劃線,其它字元均認為是單詞分隔符。
輸入給出一段非空文字,最後以符號#結尾。輸入保證存在至少10個不同的單詞。
在第一行中輸出文字中所有不同單詞的個數。注意「單詞」不區分英文大小寫,例如「pat」和「pat」被認為是同乙個單詞。
隨後按照詞頻遞減的順序,按照詞頻:單詞的格式輸出詞頻最大的前10%的單詞。若有並列,則按遞增字典序輸出。
this is a test.
the word "this"
is the word with the highest frequency.
longlonglonglongword should be cut off, so is considered as the same as longlonglonglonee. but this_8 is different than this,
and this,
and this...
#this line should be ignored.
23
5:this4:
is
1.輸入:
由於輸入有多行,為方便處理,直接用系統標準輸入模組,sys.stdin將所有文字一次讀入。find()函式找到「#"所在下標並切片。
2:處理:
遍歷字串,將所有非法字元(非數字、字母、下劃線)記錄到乙個集合中。隨後將字串中所有這些非法字元用replace替換空格,作為分隔符。
由於不區分大小寫,因此字串先轉為小寫,用split以空格作為分割建立乙個單詞列表(注意,因為存在多個連續空格,所以會有空串""存在)
建立字典,將所有單詞(前15個切片)和其詞頻存放到字典中,最後需要del刪除空串項。之後用sorted,以詞頻為主要關鍵字,單詞字典序為次要關鍵字,將字典中的每一項排序。
import sys
s=sys.stdin.read(
)s=s[
:s.find(
"#")
]#構建乙個字串中所有非數字、字母、下劃線的字元的集合
t=set
([i if i.isalnum()==
false
and i!=
'_'else
" "for i in s ]
)for i in t:
#將字串中所有非法字元替換為空格
s=s.replace(i,
" ")
#所有字元轉小寫,並將字串以空格為分割建立乙個列表,每一項為乙個小寫單詞
word=s.lower(
).split(
" ")
dic=
for i in word:
#取長度為15的單詞
i=i[:15
] dic[i]
=dic.get(i,0)
+1#由於初始字串中有多個連續空格,因此split()時會有空字串存在,需要刪除
del dic[""]
#排序,以詞頻為主要關鍵字,字典序為次要關鍵序,'-'表示降序
result=
sorted
(dic.items(
),key=
lambda x:
(-x[1]
,x[0])
)print
(len
(result)
)all
=int
(0.1
*len
(result)
)for i in
range(0
,all):
print
(str
(result[i][1
])+":"
+result[i][0
])
7 35 詞頻統計 (30 分)
7 35 詞頻統計 30 分 請編寫程式,對一段英文文字,統計其中所有不同單詞的個數,以及詞頻最大的前10 的單詞。所謂 單詞 是指由不超過80個單詞字元組成的連續字串,但長度超過15的單詞將只擷取保留前15個單詞字元。而合法的 單詞字元 為大小寫字母 數字和下劃線,其它字元均認為是單詞分隔符。輸入...
7 35 詞頻統計 (30 分)
請編寫程式,對一段英文文字,統計其中所有不同單詞的個數,以及詞頻最大的前10 的單詞。所謂 單詞 是指由不超過80個單詞字元組成的連續字串,但長度超過15的單詞將只擷取保留前15個單詞字元。而合法的 單詞字元 為大小寫字母 數字和下劃線,其它字元均認為是單詞分隔符。輸入格式 輸入給出一段非空文字,最...
7 1 詞頻統計 30 分
請編寫程式,對一段英文文字,統計其中所有不同單詞的個數,以及詞頻最大的前10 的單詞。所謂 單詞 是指由不超過80個單詞字元組成的連續字串,但長度超過15的單詞將只擷取保留前15個單詞字元。而合法的 單詞字元 為大小寫字母 數字和下劃線,其它字元均認為是單詞分隔符。輸入給出一段非空文字,最後以符號 ...