NLP中文短文本处理记录(一)
数据清洗
写代码前要想好数据该用什么格式输出,最好在纸上画出来,然后想如何能实现
更新
read_csv()读取含中文的csv文件时,
encoding='utf-8'或'gb18030'
,
会遇到有的行无法读出,增加参数error_bad_lines=False
处理不规范的json文件
import json
mess=[]
with open('谣言.json','r',encoding='utf-8')as f:
lines=f.readlines()
i=0
for line in lines:
print(line)
data=json.loads(line)
mess.append(data)
#i+=1
#if i>200:
#break
print(mess)
NLP短文本处理
强烈推荐KDnuggets系列数据分析、NLP、机器学习文章
(第一天参考文章)[https://blog.csdn.net/eastmount/article/details/50473675]
推荐How to solve 90% of NLP problems: a step-by-step guide
- Tip<1>:Python3下的字符串替换函数str.maketrans(),str.translate()
str.maketrans(intab,outtab)用于创建字符映射的转换表,intab/outtab都是字符串,前者代表需要转换的字符,后者是字符要转换的目标。注意:两个字符串长度必须相同,一一对应。
translate(table),table(包含256个字符)给出转换字符串的字符
注意:
Python3中translate还有两种用法,delete表示要删除的字符,这里table也得是bytes
bytes.translate(table[, delete])
bytearray.translate(table[, delete])
Python3中的translate函数
>>table=str.maketrans('ab','yz')
>>'abcdefg...xyz'.translate(table)
>>'yzcdefg...xyz'
- Tip<2>:python中提供了一个常量string.punctuation包含所有标点符号列表
这个也不好用,只是英文字符标点
>>string.punctuation
>>'!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'
总结以上两个Tip如何删除停用词
#去除中文标点符号
intab=',。?:“”‘’;-@'
table=str.maketrans(intab,' '*len(intab))
#可写作table=str.maketrans('','',intab),上面的写法会带有一个空格
text.translate(table)
#去除英文标点
table=str.maketrans('','',string.punctuation)
#建议停用词不应这样删除
#他会把intab中的字符都去掉
NLP之文本清洗
- 将文本分割成句子(再将每个句子分割成单词),然后将每个句子保存到文件中,每行一个句子。
- 将句子分割成单词(也叫作标记tokenize),可去标点
- 如果是英文文本,应转换为小写
- 去除停用词
- 如果是英文文本,要提取词根、词干
参考:
How to Clean Text for Machine Learning with Python可参考译文
NLP一些常用词
Natural Language Processing
Tokenization
Normalization
Stemming
Lemmatization
Corpus
Stop Words
Parts-of-speech(POS) Tagging
Statistical Language Modeling
Bag of Words
n-grams
Regular Expressions
Zipf’s Law
Similarity Measures
Syntactic Analysis
Semantic Analysis
Sentiment Analysis
待读文章
第二天学习
封装中文分词
import jieba
import jieba.posseg as pseg
from jieba.analyse import extract_tags
import re
import pandas as pd
def text_cut(filename,allowPOS=['n','ns','nr','nr2']):
"""
:param filename: 文件路径
:param allowPOS: 选择需要的词性
:return: 返回一个DateFrame
"""
path='D:\\PyCharm 2017.3\\PyProjects\\Rumors\\venv\\Include\\data\\'
jieba.load_userdict(path+'userdict.txt')
f=open(path+filename,'r',encoding='gb18030')
context=f.read()
#把文本按句号等标点分隔开,并删除换行符
sentence=[i.replace('\n','').strip() for i in re.split('。|!',context)]
#对每一句进行分词
data={'sentence':[],'posseg':[]}
stop_words=open(path+'stop_words.txt','r',encoding='utf-8').read()
for s in sentence:
#将每个句子分词
con=[item for item in jieba.lcut(s) if len(item)>1 and item not in stop_words]
data['sentence'].append(' '.join(con))
#提取每句中的所需词性
seg=pseg.cut(s)
seg_list=['%s'%item for item in seg if item.flag in allowPOS and len(item.word)>1]
data['posseg'].append(' '.join(seg_list))
df_text=pd.DataFrame(data,columns=['sentence','posseg'])
return df_text
待续。。。