<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ### 6.4.3 編程案例:文本文件分析 本節討論一個文件分析程序,其功能是輸入一個文本文件,對文件內容進行分詞(將字符流劃分為單詞),然后統計文件中的字符數、單詞數、每個單詞的出現次數以及行數,最 后輸出統計結果。按出現頻率前 n 名的單詞。這種分析在很多應用中都會用到,例如自然語 言處理、文檔相似性比較、搜索引擎等。 分析程序的算法設計是直接了當的,其核心是對多個指標進行累積計數。其中,對字符 數和行數的計數可以利用文件操作的結果直接得到:read()可將整個文件的內容作為一個字 符串返回,字符串長度就是字符總數;readlines()將文件的所有行構成一個列表返回,列表 長度就是行數。至于單詞總數,需要先將文件內容(字符串)劃分成單詞,這可以利用 string 庫中的 split 函數實現。既可以對 read()返回的整個字符串分詞,也可以通過循環來對 readlines() 返回的每一行字符串分詞,我們將采用更簡單的前一種方法。下面是實現這一部分工作的示 意代碼,其中 f 表示被分析的文件對象: ``` numchars = len(f.read()) numlines = len(f.readlines()) numwords = len(string.split(f.read())) ``` 分析程序中最麻煩的是對每個單詞出現次數的累積計數。按照過去介紹的累積算法模式,需要為每一個累積量定義一個累積變量,并在循環中不斷更新該變量。然而,這種做法 并不適合現在的場合,因為為文件中可能出現的成千上萬個單詞各定義一個累積變量顯然太 笨拙了,更何況文件中到底有哪些單詞是不能預知的。編程解決問題的訣竅之一是使用合適 的數據類型,6.1.2 中介紹的字典正可以在這個場合派上用場。 我們將建立一個字典 worddict,其關鍵字是文件中出現的單詞,值是該單詞在文件中出 現的次數,即 worddict[w]等于 w 在文件中出現的次數。在讀文件單詞的過程中,每當遇到 單詞 w,就用下面的語句遞增 w 的計數值: ``` worddict[w] = worddict[w] + 1 ``` 不過這里還有一個小麻煩:當首次遇到單詞 w 時,字典 worddict 中尚未建立相應的詞條, 即 worddict[w]無定義,因此上述遞增計數的語句將導致錯誤(KeyError)。為解決這個小麻 煩,最容易想到的是用條件語句來檢測單詞 w 是否已經存在于字典中,代碼如下: ``` if worddict.has_key(w): worddict[w] = worddict[w] + 1 else: worddict[w] = 1 ``` 另一種做法是利用例外處理,通過捕獲關鍵字錯誤(KeyError)來決定是遞增計數還是 首次建立詞條。代碼如下: ``` try: worddict[w] = worddict[w] + 1 except KeyError: worddict[w] = 1 ``` 這個做法在使用字典的程序中很常用,我們的分析程序也采用了這個做法。 除了核心代碼,還需補充一些在分詞之前對文件字符串進行預處理的代碼。其一,將文件內容中的字母都轉換成小寫,以使單詞"WORD"和"word"被識別為同一單詞;其二,將文 件內容中的各種標點符號都替換成空格,以使單詞"one,two"能被正確地劃分為兩個單詞 "one"和"two",以及"one, two"不被劃分為"one,"和"two"①。做這兩件事的代碼如下: ``` text = string.lower(text) for ch in "`~!@#$%^&*()-_=+[{]}\\|;:'\",&lt;.&gt;/?": text = string.replace(text,ch," ") ``` 接下來即可劃分單詞,并對所有單詞進行循環,在循環過程中構造字典 worddict。代碼如下: ``` wordlist = string.split(text) worddict = {} for w in wordlist: try: worddict[w] = worddict[w] + 1 except KeyError: worddict[w] = 1 ``` 最后輸出分析結果。由于單詞可能很多,我們的分析程序只示意性地輸出了 5 個單詞及 其出現次數。更好的做法是根據出現次數對單詞排名,并輸出最頻繁的前 n 名單詞,有興趣 的讀者可以試著完善這個功能。 將以上討論綜合起來,即得完整的文件分析程序。 > ① 這里的細微差別在于逗號后是否有空格。 【程序 6.2】textanalysis.py ``` import string def main(): fname = raw_input("File to analyze: ") f = open(fname,"r") text = f.read() numchars = len(text) f.seek(0) numlines = len(f.readlines()) text = string.lower(text) for ch in "`~!@#$%^&*()-_=+[{]}\\|;:'\",&lt;.&gt;/?": text = string.replace(text,ch," ") wordlist = string.split(text) numwords = len(wordlist) worddict = {} for w in wordlist: try: worddict[w] = worddict[w] + 1 except KeyError: worddict[w] = 1 print "Number of characters:",numchars print "Number of lines:",numlines print "Number of words:",numwords pairlist = worddict.items() for i in range(10): print pairlist[i], main() ``` 注意,由于需要兩次讀文件(read 和 readlines),所以在第二次讀文件之前應將“讀寫頭” 移動到文件開始處,這就是第 8 行的 f.seek(0)所做的事情。 假設有文件 yours.txt,其內容如下: ``` The life that I have Is all that I have, And the life that I have Is yours. The love that I have Of the life that I have Is yours, and yours, and yours. A sleep I shall have, A rest I shall have, Yet death will be but a pause. For the peace of my years In the long green grass, Will be yours, and yours, and yours. ``` 則運行程序 6.2 后,將得到如下結果: ``` File to analyze: yours.txt Number of characters: 315 Number of lines: 14 Number of words: 70 ('and', 5) ('all', 1) ('peace', 1) ('love', 1) ('is', 3) ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看