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)



