2012-04-11 25 views
0

希望標題不要太混亂。如果字符串列表不在裏面

我有一個充滿包含故事的文件的目錄。我需要獲取兩個句子之間的字符串列表(總是向前),僅當它們之間的字符串不包含另一個列表中包含的任何句子時。每個故事。

因此,舉例來說,我有一個列表的「大狗」,「她跟着他去」,安妮咬了咬嘴脣」等

然後,我有一個文件,它可以是包含一個故事誰我想找到「他跳過她」和「她吻了他」之間的字符串,但前提是它們之間的字符串不包含第一個列表中的任何句子或它們自己。已經找到了一些方法來做到這一點,但大多數是如此之慢,它需要將近一個小時才能完成一個文件,我相信一定有更好更快的方法來做到這一點注意我沒有在這裏添加它,因爲我不想限制我正在做的事情的解決方案可能不是最好的方法。

+1

CAn您向我們展示了方法,或者至少向我們解釋了您嘗試了哪些方法? – gbianchi 2012-04-11 01:14:03

+0

爲什麼它需要一個小時才能完成一個文件?那裏有多少個文件?你以什麼速度得到新文件,或者輸入(比如單詞列表)的速度是多少?你需要什麼樣的週轉時間,以及現實世界的需求是什麼(除了「我想看到電腦走得快」)。 :) – Kaz 2012-04-11 01:17:41

+0

這是一個程序,檢查學生工作遵循該周規定的規則,並檢查plagerism。因此,教師必須在一個晚上使用超過100個文件。這只是該計劃的一小部分,但是非常重要,因爲還有很多其他步驟需要儘快完成每個文件。 – SpectralEdge 2012-04-11 01:23:27

回答

1

不知道什麼是您使用來解決你所描述的問題的算法,但是這是我將在這樣的情況下做

前處理:

  • 確保任何空白字符序列減少到一個(空格,製表符等)。
  • 使整個文本爲低或大寫。

過程:

  • 預緊所有標記的單詞記憶(有序列表使用二進制搜索,理論上這個過程應該只消耗時間創建列表中的第一次,繼續訂購條目並以一種您稍後可以加載的格式保存這些條目,任何進一步添加都應執行二進制搜索以確定該單詞是否在列表中,並將條目放置在相應的位置/插槽中)。
  • 將所有catch語句預加載到內存中(這裏我們可以使用與加載單詞相同的方法)。
  • 穿過文件並保留與標記列表相匹配的任何單詞的偏移/位置和長度。爲了考慮大文件,偏移量應該很長。
  • 查找帶標記的單詞序列。第一個單詞之後的任何匹配都是序列的候選對象,因爲我們刪除了所有空白字符序列,所以如果該單詞的偏移等於前一個單詞加上前一個單詞的偏移量,我們確信WordN是序列的一部分長度加1,這裏的1代表分隔兩個單詞的空白字符。 word2Offset = word1Offset + word1Length + 1.
  • 檢查是否有任何發現的序列匹配開始或匹配catch語句。

實現資產:

  • 字:一個簡單的字符串就足夠代表的話。所有單詞必須以低或大寫形式存儲。
  • 組件:的成分是保持一個字和它被在文件中找到的文件的偏移的結構
  • 短語:是兩種或多種組分的組合物,一個簡單的列表將是足夠。
  • 在文件中讀取一個字符有助於快速確定單詞和單詞的順序。例如,每個空白區域意味着一個新的組件被讀取,基本上是一個單詞,所以如果匹配或不匹配,我們可以在那裏使用檢查,如果它匹配並且是第一個匹配,我們不知道它是否是一個序列,但是一旦我們讀了第二個或第三個單詞,並且我們知道是否匹配,我們可以檢查當前的偏移量是否符合我們之前描述的規則。

檢查階段

  • 如果沒有標記的話,沒有短語匹配。幾乎不可能,但誰知道。
  • 文件中的任何單詞匹配序列都表示短語檢查的候選對象。
  • 檢查單詞長度和後面的單詞內容以檢查單詞和候選詞之間的匹配。在這裏你可以檢查部分或全部詞組是否匹配。

在兩個序列階段之間獲取文本。

由於相位只是我們只需要從總和讀取文件組件列表偏移和第一句話的最後一個字的長度,第二句話的第一個字的偏移量。

從= PhaseALastWordOffset + PhaseALastWordLength
要= PhaseBFirstWordOffset
內容= StoryFile.readSegment(從,到);

希望它有幫助。

+0

爲什麼要一次一個地閱讀它,而不是簡單地按時間分割然後循環遍歷它們?只是想學更多。 – SpectralEdge 2012-04-11 04:25:31

+0

如果循環遍歷所有文件,您將同時在內存中保留所有文件的相關數據,從而導致性能問題。同樣,從處理一個文件並從該文件繼續恢復更容易,而不必從頭開始重新啓動該過程,因爲您一次處理所有文件。在閱讀整個文件的過程中,通過塊讀取更加明智,節省資源的原理相同。你可以讀取N個字符/字節或讀取一個,但我不會去閱讀整個文件。請記住,您需要一個緩衝區來保留內容。 – XecP277 2012-04-11 07:01:55

相關問題