1. 程式人生 > >python 進行文字相似性對比

python 進行文字相似性對比

糾正:在機器學習系統設計一書中,關於求歐幾里得範數是使用scipy下的linagl.norm來求的,在實際中用的應該是numpy中的linalg.norm來求的,當然也可能是我下載的scipy包和書中的不一樣 一種文字相似性度量的方式叫做 --Levenshtein距離,也叫做編輯距離 也就是是表示從一個單詞轉換到另一個單詞所有的最小距離 比較編輯距離的一種方法叫做詞袋方法 , 他是基於詞頻統計的 ------------------------------------------------------------------------------------------------------- 這是關於詞頻統計的用的包的一些練習程式碼
CountVectorizer(analyzer=u'word', binary=False, decode_error=u'strict',         dtype=<type 'numpy.int64'>, encoding=u'utf-8', input=u'content',         lowercase=True, max_df=1.0, max_features=None, min_df=1,         ngram_range=(1, 1), preprocessor=None, stop_words=None,         strip_accents=None, token_pattern=u'(?u)\\b\\w\\w+\\b',         tokenizer=None, vocabulary=None) 統計詞頻可以使用這個包 from sklearn.feature_extraction.text import CountVectorizer vectorizer = CountVectorizer(min_df=1)    設定引數,出現小於一次的就刪了 ------------------------------------------ 實驗部分: vectorizer = CountVectorizer(min_df=1) #print vectorizer contex = [r'how to format my hard disk' , r'hard disk format problems'] X = vectorizer.fit_transform(contex) print vectorizer.get_feature_names() print X.toarray().transpose() ++++++++++++++++++++++++++++ result: [u'disk', u'format', u'hard', u'how', u'my', u'problems', u'to'] [[1 1]  [1 1]  [1 1]  [1 0]  [1 0]  [0 1]  [1 0]] ------------------------------------------------------ 讀取檔案見檔案方法,使用os包 DIRs = r'D:\workspace\bulid_ML_system\src\first\toy' post = [open
(os.path.join(DIRs ,f)).read()  for f in os.listdir(DIRs)] --------------------------------------------------------- 計算歐幾里得範數 def dist_raw(v1, v2):     delta = v1 - v2     return np.linalg.norm(delta.toarray()) ------------------------------------------------------------ 通過相似度來測量相似的文字: best_doc = None best_dist = sys.maxint best_i = None #print range(0 , num_sample) for i in range( 0 , num_sample):     contexs = contex[i]     if contexs == new_contex:         continue     cocnt_vec = x_train.getrow(i)     d = dist_raw(cocnt_vec, new_contex_vec)     print '=====%i=======%.2f====:%s'%(i,d,contexs)     if d<best_dist:         best_dist = d         best_i = i print 'best=%i====is===%.2f'%(best_i,best_dist) ------------------------------------------------------------------------- 刪去一些無關緊要的詞: 可以使用vectorize = CountVectorizer(min_df=1 , stop_words=['interesting'])設定stop_word來設定,他可以是一個list,也可以直接輸入english,假如輸入的english,那麼他會過濾掉318個常見的單詞(一般是出現頻率高,而沒有什麼實際用處的詞)
這是使用了stop_word之前和之後的對比: [u'about', u'actually', u'capabilities', u'contains', u'data', u'databases', u'images', u'imaging', u'interesting', u'is', u'it', u'learning', u'machine', u'most', u'much', u'not', u'permanently', u'post', u'provide', u'safe', u'storage', u'store', u'stuff', u'this', u'toy'] [u'actually', u'capabilities', u'contains', u'data', u'databases', u'images', u'imaging', u'interesting', u'learning', u'machine', u'permanently', u'post', u'provide', u'safe', u'storage', u'store', u'stuff', u'toy'] 這是使用個list來排除interesting的結果: [u'about', u'actually', u'capabilities', u'contains', u'data', u'databases', u'images', u'imaging', u'is', u'it', u'learning', u'machine', u'most', u'much', u'not', u'permanently', u'post', u'provide', u'safe', u'storage', u'store', u'stuff', u'this', u'toy']