程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

【星海隨筆】0基礎學,python算法推薦功能

編輯:Python
pip install nltk
pip install cufflinks

nltk是一個python工具包, 用來處理與自然語言相關的東西. 包括分詞(tokenize), 詞性標注(POS),
文本分類等,是較為好用的現成工具。但是目前該工具包的分詞模塊,只支持英文分詞,而不支持中文分詞。

cuffdiff主要是發現轉錄本表達,剪接,啟動子使用的明顯變化。

import pandas as pd
import numpy as np
from nltk.corpus import stopwords
from sklearn.metrics.pairwise import linear_kernel
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfVectorizer
import re
import random
import cufflinks
from plotly.offline import iplot
cufflinks.go_offline()

載入數據,並查看數據的格式

df = pd.read_csv('Seattle_Hotels.csv', encoding="latin-1")
df.head()

查看數據的第100行,所有列
將desc列的100行,詳細的打印出來

df.iloc[100:101,:]
df['desc'][100]

把字符都分割出來,並保存
CountVectorizer是計詞器

vec = CountVectorizer().fit(df['desc'])
bag_of_words = vec.transform(df['desc'])
bag_of_words.shape
#顯示有152句話,每句話有3200詞

詳細信息可以去sklear_API中查看

可以有兩種方法顯示

words_freq = [(word,sum_words[0,idx]) for word,idx in vec.vocabulary_.items()]
words_freq = sorted(words_freq,key=lambda x:x[1],reverse=True)

總結上面的方法。形成一個函數,來進行詞組分類。

def get_top_n_words(corpus,n=None):
vec = CountVectorizer().fit(corpus)
bag_of_words = vec.transform(corpus)
sum_words = bag_of_words.sum(axis=0)
words_freq = [(word,sum_words[0,idx]) for word,idx in vec.vocabulary_.items()]
words_freq = sorted(words_freq,key=lambda x:x[1],reverse=True)
return words_freq[:n]

獲取排序後的前20

common_words=get_top_n_words(df['desc'] ,20 )

將其放入DateFrame中,好處理

df1 = pd.DataFrame(common_words,columns=['desc','count'])

DateFrame的數據可以直接使用 iplot() 來繪制圖形。但不知道為什麼我的版本顯示失敗了。
所以我只能把數據變成列表再進行繪圖。

a = df1.iloc[:]
b = df1.iloc[:,0:1]
for x in df1['count']:
b.append(x)
for x in df1['desc']:
a.append(x)
plt.barh(a,b)

所以,會根據之前的數據。對每一條數據進行字符串 split 然後找到重復的數字,並計數。然後排列,並繪圖展示。
也可以把 函數 .iplot 替換成 .plot ,如下代碼

df3.groupby('desc').sum()['count'].sort_values().plot(kind='barh',title='top 20 before remove stopwords-ngram_range=(2,2)')
common_words=get_top_n_words(df['desc'],20)
df3 = pd.DataFrame(common_words,columns=['desc','count'])
df3.groupby('desc').sum()['count'].sort_values()

數據增加一列數據,

df['word_count']=df['desc'].apply(lambda x:len(str(x).split()))
#apply是順序流的將參數傳入,
#lambda 順序流的 return x
df['word_count'].plot(kind='hist',bins=50)
#將得到的列進行繪圖

注意一下代碼 需要下載工具

import nltk
nltk.download()
sub_replace = re.compile('[^0-9a-z #+_]')
stopwords = set(stopwords.words('english'))
def clean_txt(text):
text.lower()
text = sub_replace.sub('',text)
' '.join(word for word in text.split() if word not in stopwords)
return text
df['desc_clean'] = df['desc'].apply(clean_txt)

#也可以省略word

def clean_txt(text):
text.lower()
text = sub_replace.sub('',text)
' '.join(word for word in text.split())
return text
df['desc_clean'] = df['desc'].apply(clean_txt)

設置索引

df.set_index('name',inplace = True)

按照公式對詞組進行匹配

tf(t,d)是tf值,表示某一篇文本d中,詞項t的頻度,從式子可以看出tf值由詞項和文本共同決定.
nd表示訓練集文本數.
df(d,t)表示包含詞項t的文檔總數,因此idf值與訓練集文本總數和包含詞項t的文本數有關。
idf值對頻次表示的文本向量進行了改進,它不僅考慮了文本中詞項的頻次,同時考慮了詞項在一般文本上的出現頻率,詞項總是在一般的文本中出現,表示它可提供的分類信息較少,比如虛詞 “的”、“地”、“得”等。

tf=TfidfVectorizer(analyzer='word',ngram_range=(1,3),stop_words='english')

將desc_clean傳入,進行計算相關性。
對每一個確切的字符串匹配一個數字。

tfidf_matrix=tf.fit_transform(df['desc_clean'])

線性計算

cosine_similarity =linear_kernel(tfidf_matrix,tfidf_matrix)
indices = pd.Series(df.index)

寫一個函數

def recommendations(name,cosine_similarity):
recommended_hotels = []
idx = indices[indices == name].index[0]
score_series = pd.Series(cosine_similarity[idx]).sort_values(ascending=False)
top_10_indexes = list(score_series[1:11].index)
for i in top_10_indexes:
recommended_hotels.append(list(df.index)[i])
return recommended_hotels

輸入 確切的名稱 並進行推薦相關的 名稱推薦,後面傳入的是之前算法生成的 每一個確切的名字對應的數字

recommendations('Hilton Garden Seattle Downtown',cosine_similarity)

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved