python : 文檔比較


 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']))

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM