栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

【星海随笔】算法推荐功能

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【星海随笔】算法推荐功能

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)
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/928971.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号