2015-09-01 36 views
2

我試圖在10個左右文檔的集合中構建一個類似句子的列表。我在Python中使用FuzzyWuzzy庫來確定相似性,儘管我目前的算法可行,但它效率不高,需要永遠運行。高效模糊地匹配文檔集合中的每個句子

for doc in docs: 
     for sentence in doc.sentences: 
      if len(sentence) > 8: 
       for document in docs: 
        if similarity(document,doc)["ratio"] < 100: 
         for sentn in document.sentences: 
          if len(sentn) > 8: 
           simil = similarity(sentence,sentn) 
           if simil["ratio"] > 60: 
            count+=1 
            print count 
            pairs.append([sentence,sentn,simil]) 

如果你不喜歡閱讀的代碼一塌糊塗,它需要在列表中的每個文件,然後在它的每個句子迭代,那麼它需要的那句話和它比較,所有其他句子所有其他文件,這意味着它正在處理數十億種可能的組合,其中許多相似度低於5%,這非常低效且浪費處理能力,是否有更高效的算法或處理文檔的方式?

編輯:

在斯塔克斯建議我加入這行代碼

if abs(len(sentence)-len(sentn))<10: 
    simil = similarity(sentence,sentn) 
    ... 

有顯着的性能提升,但我還是不禁覺得算法是低效

注意:這不是一個重複的問題,另一個問題是如何弄清楚兩個句子是否相似,我已經可以做到這一點,我需要知道的是如何有效地做到這一點,很多次

+0

你需要一些指標來衡量s並且只比較在一定範圍內具有度量的句子。可能是「最大字長」或「x的總數」,但應基於某些對您正在進行的比較類型有意義的特徵。 – stark

+0

@stark我不完全清楚你在說什麼,你的意思是我應該在運行'smiliarity()'之前檢查每個語句是否符合標準?像檢查以確保句子的長度相似? –

+0

[如何計算餘弦相似度給出2個句子字符串? - Python](http://stackoverflow.com/questions/15173225/how-to-calculate-cosine-similarity-given-2-sentence-strings-python) –

回答

0

該循環至少有兩個問題導致主要瓶頸。

首先,您從第一個文檔中取出第一個句子,並對照每個文檔的每個句子(包括其自身)進行檢查。因此,而不是

for doc in docs: 
    for sentence in doc.sentences: 
     if len(sentence) > 8: 
      for document in docs: 

嘗試

for doc in docs: 
     for document in docs: 
       for sentence in doc.sentences: 
        if len(sentence) > 8: 

其次,

if similarity(document,doc)["ratio"] < 100: 

是不是很有效,你並不需要使用模糊匹配說,如果兩個文件是相同的,你可以只用

if document.text == doc.text: