2012-02-15 20 views
5

我需要對文本中的單詞進行分段。有些時候,帶連字符的單詞不帶連字符,而撇號單詞不帶撇號。也有類似的問題,例如相同單詞的不同拼寫問題(例如:顏色,顏色)或用單詞間隔寫入的單個單詞(例如:直到,空白,空格)。我需要將這些變體作爲一個單獨的表示進行分組,並將其插入到set/hashmap或其他位置。沒有重音字符的重音字符單詞也可能存在問題(儘管我還沒有面對過它們)。目前,在任何空白字符和每個非字母數字中切出單詞,然後對其進行填塞並省略停用詞。將文字分段,並將文字中的連字符和撇號文字分組

這些索引稍後將用於文檔相似性檢查和搜索等。任何建議如何解決這些問題?我想到了一個將掃描的單詞與單詞表匹配的想法,但問題是專有名詞和非字典單詞將被省略。

信息:我的代碼是用Java

+0

這是不是一個搜索引擎呢?你能不能說安裝Apache Solr,然後通過你的文件運行它來執行tbnis任務?或者我錯過了什麼? – PurplePilot 2012-02-15 13:22:24

+0

@PurplePilot:我需要手動進行處理,所以你可以建議一個API或相關算法。 – phoxis 2012-02-15 14:09:27

+0

你可以試試這個http://tipsandtricks.runicsoft.com/Other/JavaStemmer.html – PurplePilot 2012-02-15 14:31:10

回答

3

我想你應該申請的技術的組合。

1)對於常見的拼寫變體,我會使用基於字典的方法。由於它們很常見,我不會擔心丟失非字典詞彙。這應該解決顏色/顏色問題。

2)對於拼寫錯誤和其他非標準拼寫變體,您可以應用Metaphone(http://en.wikipedia.org/wiki/Metaphone)算法將標記轉換爲其英語發音的表示形式。類似的變體聽起來很相似,因此您可以將它們相互匹配(例如,Jon到John)。您還可以在查詢過程中使用基於編輯距離的匹配算法來將非常相似的標記與只有一對字符並置或字符刪除(例如,Huseyin與Housein)相匹配。

3)對於撇號和複合詞之間的連字符,可以存儲兩個變體。例如,「John's」將被索引爲「John s」和「Johns」。 「空格」可以轉換爲(或與「空格」和「空格」一起存儲)。

4)對於沒有任何連字符的複合詞,可以使用外部庫,例如Solr的HyphenationCompoundWordTokenFilterFactory類(http://lucene.apache.org/solr/api/org/apache/solr/analysis/ HyphenationCompoundWordTokenFilterFactory.html)。儘管它可以使用字典,但並不一定。它旨在處理在德語和類似語言中經常遇到的複合詞。我看不出有什麼理由不能將它應用到英文中(您需要提供英文字典和連字規則文件)。

其實最後一點引發了一個重要的問題。我認爲你不需要從頭開始構建自己的搜索庫。如果這是真的,那麼爲什麼不使用Lucene(或基於Lucene的Solr),這是一個基於Java的搜索庫,它已經有處理這些問題的方法和方法?例如,注射技術允許您在文檔中的同一位置對顏色和顏色進行索引;因此,無論您是搜索「彩色汽車」還是「彩色汽車」(假設您注意干擾),都無關緊要。有語音索引的過濾器(http://lucene.apache.org/solr/api/org/apache/solr/analysis/PhoneticFilterFactory.html)。甚至還有一個FuzzyQuery組件,它允許你允許一定量的編輯距離來匹配類似的術語(http://lucene.apache.org/core/old_versioned_docs/versions/3_2_0/api/all/org/apache/lucene/ search/FuzzyQuery.html)

您還需要決定要在哪個點處理這些問題:一種極端方法是在索引期間對這些術語的所有可能變體進行索引,並按原樣使用這些查詢。這將保持您的查詢處理輕鬆,但會花費你一個更大的索引(因爲你需要存儲的所有變種)。另一個極端是將文檔編入索引並在搜索期間擴展查詢。這將允許您保持索引精簡,但需要更重的查詢處理。語音索引會要求您在索引過程中處理文檔和在搜索過程中處理查詢。模糊匹配只有在搜索時間內纔可行,因爲大概你無法在索引中存儲所有術語的所有編輯變體。

相關問題