这一篇接着上一篇处理后的数据进行操作,按照(一)中的步骤,这事应该将文本数据每一行中的高频的正面词去掉,因为多数是描述身体健康的短句,只有少数是描述脾脏检查异常的,所以尝试删除掉描述身体健康的短句,只留下少数检查异常的数据,对异常的检查数据进行特征提取,这是思路。
所以这一篇目的是找到并且去除描述正常情况的短句。
##对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']=wordlist all_dic['type']=typelist all_dic['count']=1 all_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 count 102 均匀 a 55749 42 光整 a 43444 170 明显 a 2152 177 未见明显异常 a 1594 45 光滑 a 756 df_word_count_a.head(10) Out[259]: word type count 102 均匀 a 55749 42 光整 a 43444 170 明显 a 2152 177 未见明显异常 a 1594 45 光滑 a 756 139 平整 a 243 33 低 a 95 143 强 a 67 277 高 a 17 190 清晰 a 13 df_word_count_d.head(10) Out[260]: word type count 183 正常 d 66607 130 尚 d 503 9 一致 d 98 262 进一步 d 12 15 不 d 8 179 极 d 6 206 稍 d 5 175 未 d 4 212 约 d 4 197 略 d 3 df_word_count_n.head(10) Out[265]: word type count 240 脾脏 n 55634 146 形态 n 47149 66 包膜 n 44178 236 脾 n 16244 51 内 n 14709 46 光点 n 14598 274 静脉 n 11550 247 血流 n 4981 125 实质 n 2910 37 信号 n 2650 len(df[df['0116'].str.contains(r'光滑')]) Out[261]: 756 len(df[df['0116'].str.contains(r'平整')]) Out[262]: 243 from snownlp import SnowNLP for 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 s restr=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)可以看到仍然还是存在一些问题,待续...
