1 def read_file(filename):#讀入文件 2 try: 3 fp=open(filename) #打開文件 4 L=fp.readlines() #按行讀入 5 except IOError: #如果沒找到文件 6 print("Error opening or reading input file: ",filename) #輸出顯示沒找到的文件名 7 sys.exit() #提前import sys 8 return L #讀到文件的每一行 9 10 def get_word_from_string(line):#將字符組合成單詞 #輸入一行 11 word_list=[] #創建空列表,用來存單詞 12 character_list=[] #空列表 13 for c in line: 14 if c.isalnum(): #通過isalnum()函數檢測字符串是否由字母和數字組成 15 character_list.append(c) #將數字和字母串添加到character_list列表中 16 elif len(character_list)>0: 17 word="".join(character_list) #如果遇到非數字或字母,將character_list中的字符通過函數join連接成word 18 word=str.lower(word) #如果輸入line='a cat a 12',輸出為['a','cat','a','12'] 19 word_list.append(word) 20 if len(character_list)>0: 21 word="".join(character_list) 22 word=str.lower(word) 23 word_list.append(word) 24 return word_list 25 26 def get_word_from_line_list(L):#得到文檔單詞 27 word_list=[] 28 for line in L: 29 words_in_line=get_word_from_string(line) #調用get_word_from_string()函數得到一行單詞 30 #word_list=word_list+words_in_line 31 word_list.extend(word_in_line) #將一行中的各個單詞存於word_list中 32 return word_list 33 34 def count_frequency(word_list):#利用字典數據結構計算每一個單詞出現的頻次 35 D={} 36 for new_word in word_list: 37 if new_word in D: 38 D[new_word]=D[new_word]+1 39 else: 40 D[new_word]=1 41 return D.items() 42 43 44 def word_frequencies_for_file(filename):#對向量內的元素進行排序預處理 45 line_list=read_file(filename) 46 word_list=get_word_from_line_list(filename) 47 freq_mapping=count_frequency(word_list) 48 sortde_freq_mapping=sorted(freq_mapping) 49 return sortde_freq_mapping 50 51 52 def inner_product(L1,L2): #計算倆向量內積 53 sum=0.0 54 i=0 55 j=0 56 while i<len(L1) and j<len(L2): 57 if L1[i][0]==L2[j][0]: 58 #兩個都有的單詞才計算內積 59 sum+=L1[i][1]*L2[j][1] 60 i+=1 61 j+=1 62 elif L1[i][0]<L2[j][0]: 63 #單詞L1[i][0]在L1不在L2 64 i+=1 65 else: 66 j+=1 67 return sum 68 69 70 71 def vector_angle(L1,L2):#計算倆向量夾角 72 numerator=inner_product_product(L1,L2) 73 denominator=math.sqrt(inner_product(L1,L1)*inner_product(L2,L2)) 74 return math.acos(numerator/denominator) 75 76 77 78 def main():#文檔比較主函數 79 filename_1="t1.verne.txt" 80 filename_2="t1.verne.txt" 81 sorted_word_list_1=word_frequencies_for_file(filename_1) 82 sorted_word_list_2=word_frequencies_for_file(filename_2) 83 distance=vector_angle(sorted_word_list_1,sorted_word_list_2) 84 print("The distance bewteen the documents is: %0.6f(radians)"%distance) 85 86 if __name__=="__main__": 87 import cProfile #調用import cProfile查看每個函數占用的處理時間 88 import sys 89 cProfile.run("main()") 90 91 92 93 print(count_frequency(word_list=['to','be','or','not','to','be']))