2012-09-17 79 views
1

我有一個人字典文件,看起來像eng.dic(圖像中有接近billion單詞的列表)。我必須經常運行不同的單詞查詢。從文件中搜索一個字符串 - python

apple 
pear 
foo 
bar 
foo bar 
dictionary 
sentence 

我有一個字符串讓我們說「富巴」,有沒有更好的(更有效的方式)通過的文件搜索,看看它是否存在,如果它返回存在的,如果它不存在,追加字典文件

dic_file = open('en_dic', 'ra', 'utf8') 
query = "foo-bar" 
wordlist = list(dic_file.readlines().replace(" ","-")) 
en_dic = map(str.strip, wordlist) 

if query in en_dic: 
    return 1 
else: 
    print>>dic_file, query 

python中是否有內置的搜索函數?或者我可以導入的任何庫來運行這樣的搜索而沒有太多的開銷?

+1

我懷疑你可以,如果你僅僅是不是像一個一個實現,你必須做的更好用一個詞做這個。但是,如果您要循環並執行此功能很多次,則可以使用更高效的查找方式來存儲字符串。一個非常簡單的例子就是保持列表排序。 –

+0

億字?真?您將在大約一百萬用完的英語單詞.. – wim

+0

@wim,事實並非如此。將「foo」看作1個單詞,將「bar」看作1個單詞,將「foo bar」看作不同的單詞。所以詞列表是在某種意義上幾乎是無限的,但僅限於我有什麼樣的數據輸入,目前它在一個十億字語料,所以我列出的最壞情況。 – alvas

回答

2

正如我已經提到的,在整個文件中去時,其大小爲重要的,不是一個好主意。相反,你應該使用既有的解決方案和:

  1. 索引文件中的話,
  2. 店索引在適當的形式(我建議數據庫)的結果,
  3. 檢查該文件中存在的話(通過檢查數據庫),
  4. ,如果它不存在,將其添加到文件和數據庫,數據庫

存儲數據是真的有很多比試圖重新發明輪子更有效。如果你將使用SQLite,數據庫也將是一個文件,所以安裝程序是最小的。

所以,我建議在SQLite數據庫中存儲單詞,並詢問您何時需要檢查文件中是否存在該單詞,然後在添加它時更新它

要了解更多的解決方案看這個問題的答案:

The most efficient way to index words in a document

0

最有效的方法取決於您使用此字典執行的最常見操作。

如果您需要每次讀取文件,您可以逐行使用while循環讀取文件,直到結果爲您的文字結尾爲止。如果您有幾個可以同時更新文件的併發工作人員,則這是必需的。

如果您不需要讀取文件中的每個時間(例如,你只有一個過程,與字典工作),你絕對可以寫出更高效的實現:1)閱讀所有線路,set(而不是list) 2)爲每個「新」字執行這兩個操作 - 更新setadd操作並將文字寫入文件。

0

如果是「相當大」的文件,然後訪問線依次不讀整個文件到內存:

with open('largeFile', 'r') as inF: 
for line in inF: 
    if 'myString' in line: 
     # do_something 
+0

但我必須經常訪問字典,所以順序搜索當然不能選擇。 – alvas

相關問題