这一篇接着上一篇处理后的数据进行操作,按照(一)中的步骤,这事应该将文本数据每一行中的高频的正面词去掉,因为多数是描述身体健康的短句,只有少数是描述脾脏检查异常的,所以尝试删除掉描述身体健康的短句,只留下少数检查异常的数据,对异常的检查数据进行特征提取,这是思路。
所以这一篇目的是找到并且去除描述正常情况的短句。
##对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)
可以看到仍然还是存在一些问题,待续...