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)

莫凡Python


NLP短文本处理

强烈推荐KDnuggets系列数据分析、NLP、机器学习文章

系列NLTK文章,没看

(第一天参考文章)[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可参考译文

译:NLTK清洗英文文本

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

待读文章

CS224n笔记2 词的向量表示:word2vec

秒懂词向量Word2vec的本质

机器学习与Scikit Learn学习库

第二天学习

封装中文分词

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

待续。。。

posted @ 2018-03-31 16:15  不知道的痛  阅读(2009)  评论(0编辑  收藏  举报