鍍金池/ 問答/Java  網(wǎng)絡(luò)安全/ 如何確定A段文字是由B段文字修改而來?

如何確定A段文字是由B段文字修改而來?

我在印象筆記中有近萬條筆記,因害怕印象筆記出bug或自己誤操作,導致筆記丟失,所以想定期(一周一次)導出所有筆記
的標題,用印象筆記自帶功能可以完成標題導出,導出到一個html文件中,然后用代碼讀取到一個文本文件。

筆記的題目示例如下。

《本地人兩千都不要 炒房者七千買 | 怎么在9個月把房價炒高兩三倍 | 匯率、房貸、外匯儲備…… 杠桿》
《為什么2016美國大選大數(shù)據(jù)預測普遍失靈》
《市面上有一款android的按鍵精靈,他是基于什么原理實現(xiàn)的實現(xiàn)? - 知乎》
《linux route 使用詳解》
《linux sort 命令詳解》

使用印象筆記的過程中,我可能會修改筆記的標題,比如將如上第三個標題的"- 知乎"刪掉。
也可能將不同筆記合并,比如如上的第四條和第五條,合并成《linux route 使用詳解 | linux sort 命令詳解》
如果單單基于如上這些標題的話,很難對一條筆記做唯一性判斷,比如如下刪掉了

",他是基于什么原理實現(xiàn)的實現(xiàn)? - 知乎"

后的《市面上有一款android的按鍵精靈》和原標題為《市面上有一款android的按鍵精靈,他是基于什么原理實現(xiàn)的實現(xiàn)? - 知乎》很難在代碼層面100%確定兩條筆記是同一條筆記(只是基于題目難以確定,實際上,兩條筆記內(nèi)容是完全一樣的,只是題目變了,但是現(xiàn)階段只能基于標題判斷)。

我的初步想法是為每個筆記的標題加上唯一id,如下所示,這樣就能基于id來判斷:

《id1本地人兩千都不要 炒房者七千買 | 怎么在9個月把房價炒高兩三倍 | 匯率、房貸、外匯儲備…… 杠桿》
《id2為什么2016美國大選大數(shù)據(jù)預測普遍失靈》
《id3市面上有一款android的按鍵精靈,他是基于什么原理實現(xiàn)的實現(xiàn)? - 知乎》

這樣搞,原理簡單,但是有個缺點,需要手動更改大量筆記的標題,工作量大。

我的問題是,還有其他辦法,能讓我如上這么修改了筆記標題后,100%確定改過標題后的筆記,實際上與未改過標題的筆記,實際上是同一條。

回答
編輯回答
憶往昔

不知道你為什么只選擇導出標題?明明可以全部導出成一個文件然后備份啊。

跟蹤標題修改,是為了想知道某條筆記是否被誤刪了(最關(guān)心的是這個)

這樣的話,結(jié)果必然只能是近似的,這一點你必須接受,否則就只能全部導出了。

接下來就是盡量提升結(jié)果的準確性,想了一下,下面是我的思路:

  1. 將兩次導出的標題看成兩個集合,A、B
  2. 先確認哪些是可以完全匹配的,即標題完全相同,將其從A和B中移除
  3. 再確認包含匹配的,包含匹配的意思是標題1包含標題2或反之。例如:“市面上有一款android的按鍵精靈,他是基于什么原理實現(xiàn)的實現(xiàn)? - 知乎”包含“市面上有一款android的按鍵精靈,他是基于什么原理實現(xiàn)的實現(xiàn)?”或“市面上有一款android的按鍵精靈”。包含匹配有極大的可能是由原標題修改得到的,例如去掉首尾一些內(nèi)容,或在首尾增加一些內(nèi)容等。
  4. 剩下的就是通過相似度來匹配,類似于搜索引擎的關(guān)鍵字搜索。相似度的含義需要花點心思來定義(找到符合自己應(yīng)用場景的)。我想到的有以下幾種:

    • 長度相似,比如誤差必須在50%以內(nèi)。也就是說,兩個標題之間最多相差一半的大小。當然,實際的閾值需要你自己嘗試。
    • 按順序匹配60%以上的標題內(nèi)容。比如“我的和你的以及他的”這個標題,與“我和你以及他的”相似,但與“他的你的和我的”不相似。雖然后者包含原標題的所有字符,但順序明顯不同。這一條的出發(fā)點在于一般改標題很少會修改順序,常見的只是增加或刪除一些內(nèi)容而已。(同樣,閾值需要實際測試)
  5. 剩下的就是難以匹配的了,可以按刪除(存在于A但不存在于B)和新增(存在于B但不存在于A)來對待。
2017年5月22日 05:19