这一篇接着上一篇处理后的数据进行操作,按照(一)中的步骤,这事应该将文本数据每一行中的高频的正面词去掉,因为多数是描述身体健康的短句,只有少数是描述脾脏检查异常的,所以尝试删除掉描述身体健康的短句,只留下少数检查异常的数据,对异常的检查数据进行特征提取,这是思路。
所以这一篇目的是找到并且去除描述正常情况的短句。
##对a和d进行分析后补充,这里是经过一次试错之后才发现开头应该把这些作为词组保留并添加到分词中去,否则,'不'和'宽'就会成为一个副词一个形容词,而事实上他们二者总是经常出现的用以描述正常情况的,'未见'以及'无明显'类似
jieba.suggest_freq('未见',True)jieba.add_word('未见',tag='d')jieba.suggest_freq('无明显',True)jieba.add_word('无明显',tag='d')jieba.suggest_freq('不宽',True)jieba.add_word('不宽',tag='a')jieba.suggest_freq('不厚',True)jieba.add_word('不厚',tag='a')#jieba.suggest_freq('尚正常',True)jieba.suggest_freq('不明显',True)jieba.add_word('不明显',tag='a')jieba.suggest_freq('不清',True)jieba.add_word('不清',tag='a')
在这之后
df_clean=df['0116']##得到0116这一列数据wordlist=[]typelist=[]for row in df_clean:words=jieba.posseg.cut(row)for w in words:wordlist.append(w.word)typelist.append(w.flag)all_dic=pd.DataFrame(columns=['word','type','count'])all_dic['word']=wordlistall_dic['type']=typelistall_dic['count']=1all_dic=all_dic[all_dic['type']!='x']##剔除标点符号df_word_count=all_dic[['word','type','count']].groupby(['word','type'],as_index=False).sum()##上面的方式得到所有非标点符号的分词以及其词性type和总的计数值count,也许有更简单的方法...
df_word_count_n=df_word_count[df_word_count['type']=='n']##得到所有名词df_word_count_n.sort_values(by=['count'],ascending=False,inplace=True)##对所有名词按照count由高到低排序#df_word_count_n.head()##得到高频的名词df_word_count_a=df_word_count[df_word_count['type']=='a']##得到所有形容词df_word_count_a.sort_values(by=['count'],ascending=False,inplace=True)##对所有名词按照count由高到低排序df_word_count_d=df_word_count[df_word_count['type']=='d']##得到所有副词df_word_count_d.sort_values(by=['count'],ascending=False,inplace=True)
经过上面的操作,可以看到:
##这就是结果df_word_count_a.head()Out[258]: word type count102均匀 a 5574942 光整 a 43444170明显 a 2152177 未见明显异常 a 159445 光滑 a 756df_word_count_a.head(10)Out[259]: word type count102均匀 a 5574942 光整 a 43444170明显 a 2152177 未见明显异常 a 159445 光滑 a 756139平整 a 24333 低 a95143 强 a67277 高 a17190清晰 a13df_word_count_d.head(10)Out[260]: word type count183 正常 d 66607130 尚 d 5039一致 d98262 进一步 d1215不 d8179 极 d6206 稍 d5175 未 d4212 约 d4197 略 d3df_word_count_n.head(10)Out[265]: word type count240 脾脏 n 55634146 形态 n 4714966 包膜 n 44178236 脾 n 1624451内 n 1470946 光点 n 14598274 静脉 n 11550247 血流 n 4981125 实质 n 291037 信号 n 2650len(df[df['0116'].str.contains(r'光滑')])Out[261]: 756len(df[df['0116'].str.contains(r'平整')])Out[262]: 243from snownlp import SnowNLPfor i in df_word_count_a['word']:print(i,SnowNLP(i).sentiments)##尝试对形容词做情感分析,数值越接近1代表越积极,数值越接近0代表越消极,可以看到大部分是对的,但依然有的判断明显有误均匀 0.8315683780663149光整 0.24966090817814068##明显有问题,所以只能手动总结明显 0.5262327818078083未见明显异常 0.742915865950905光滑 0.6428571428571428平整 0.5低 0.4028629856850714强 0.6761229314420805高 0.6582579723940979清晰 0.8034682080924856清 0.6394849785407725大 0.5319597284008428失常 0.5厚 0.3550724637681161清楚 0.5262327818078083细腻 0.8119658119658117近 0.5892857142857142完整 0.8095238095238096严重 0.5262327818078083弱 0.5283018867924524团低 0.37787498705799727偏 0.42934782608695654较大 0.5319597284008428不均 0.3379043168750845
这种情况下,我们无法使用snownlp来直接判断和得到a形容词和d副词中哪些可以表达健康(1是对积极消极判断不准,另一方面积极消极不能代表健康和异常),词组不多,我们通过肉眼判断出表达身体健康的a和d(目前没有找到哪种办法可以做到完全自动由程序处理)
接下来将上面的词组结合re正则来删除表达健康状况的词组
adlist=[]adlist+=list(df_word_count_a['word'][:6])adlist+=list(df_word_count_d['word'][:1])##眼睛判断的结果adlist##Out[348]: ['均匀', '光整', '明显', '未见明显异常', '光滑', '平整', '正常']def get_restr(adlist):s='['lenth=len(adlist)for i in range(lenth-1):s+=(adlist[i])s+=('|')s+=adlist[-1]s+=']'return srestr=get_restr(adlist)restr##Out[349]: '[均匀|光整|明显|未见明显异常|光滑|平整|正常]'
rs='(,|,|。|,|)*?([^(,|,)]+?)'+restr+'([^(,|,)]*?)(,|,|。|,)'def delUseless(str):return re.sub(r''+rs,'',str)df_0116_comlpete=str_data[['vid','0116']].dropna()df_0116_comlpete['0116']=df_0116_comlpete['0116'].apply(delUseless)
可以看到仍然还是存在一些问题,待续...
如果觉得《文本处理(二)词频统计 jieba分词 词性标注 snownlp情感分析》对你有帮助,请点赞、收藏,并留下你的观点哦!