中文分词python代码_Python中文分词处理小结

最近在写股票预测,大致是根据每天的文章及股票涨跌来预测未来的股票走势。

这里的中文文章就少不了分词的处理,我把自己写作业用的两种记录一下:自己N-gram分词,然后再根据tf、tfidf等来进行筛选

使用正则表达式抽取中文部分,然后使用jieba分词

N-gram分词

先来讲讲N-gram分词,上代码

#Get N-gram term List of the article set and we delete the term if its term frequency is less than 3 in the article

def getNgramTermList(n, records):

termList = []

lenOfRecords = len(records)

for content in records[:lenOfRecords]:

names = "[\n|.|,|'|?|\"|%|`|(|)|\d|_|!|;|#|\\|/|$|&|*|{|}|-|@|:|,|、|。|(|)]|「|」|!| |?|;|.|:|》|《|○"

others ="[0|1|2|3|4|5|6|7|8|9|『|』|◆|‧|■|=|~|-|—|─|…|/|】|【| |\t|\xa0|*]"

exclude = string.digits + string.punctuation + string.ascii_letters + names + others

charList = [ch for ch in content if ch not in exclude]

if len(charList)>n-1:

frame = DataFrame([''.join(ch) for ch in [charList[i:i+n] for i in range(0, len(charList)-n+1)]])

bigramSeries = frame[0].value_counts()

newBigram = bigramSeries.to_dict()

termList.append(newBigram)

return termList

这个大致的意思是:读进一篇文章,将文章中的英文、数字、标点符号都去掉上面的others、names...其实不需要,看实际需求,而且中文标点符号在string中也有

把每个字都按顺序分别存进一个list中,这里叫charList

将字符按照顺序,按顺序将其拼接成n-gram的模式,例如2 gram的话,就按charList顺序两两组合起来,再存进DataFrame这里用DataFrame是因为我这里主要计算的是往后的tfidf,所以,你根据自己的需求存

所以主要部分就是:

charList = [ch for ch in content if ch not in exclude]

if len(charList)>n-1:

frame = DataFrame([''.join(ch) for ch in [charList[i:i+n] for i in range(0, len(charList)-n+1)]])

正则表达式 + jieba分词

上代码:

#jieba中文分詞,并獲取tfidf排名前3000詞(未採用),還要解決詞與vocabulary匹配的問題

def jieba_Chinese(articles):

all_articles2 = []

#使用正则选取文章中汉字的部分, 使用str()是为了防止TypeError: expected string or bytes-like object

new_article = re.sub(r'[^\u4e00-\u9fa5]', '', str(articles))

if new_article == '':

new_article = '㐓'

# new_article2 = jieba.analyse.extract_tags(new_article, topK=3000, withWeight=True, allowPOS=())

new_article2 = jieba.cut(new_article, cut_all=False)

for word in new_article2:

all_articles2.append(word)

articles_dataFrame = DataFrame(all_articles2)[0].value_counts().to_dict()

return articles_dataFrame

这个大致的意思是:把文章读取进来,直接用正则匹配其中的中文字符,保存起来这里有个小问题,如果有些文章是纯英文或者标点符号数字之类的,由于无法匹配到中文字符,可能返回值就会是空字符,后续处理的时候可能会产生NaN的问题

所以我这里加了一个判断,如果返回的值是空的话,我则用一个生字来代替(不可取的方法,还是想过好的方法来吧)

把正则处理后的字符丢进jieba分词里jieba分词的cut方法,包含几种模式,具体可以看看这里[jieba分词]

除了jieba.cut()之外,也可以用jieba.analyse.extract_tages()这个方法,而且可以直接给你返回tfidf值,并进行排序,我这里自己写了tfidf的计算,就没用这个了

后面的处理的话,就是先将原来的返回值保存为字典,并转成DataFrame计算频率,然后转成字符对应的字典,即{term : tf}模式当然这部分是我自己的项目需求,跟分词没啥关系

所以主要的部分是:

new_article = re.sub(r'[^\u4e00-\u9fa5]', '', str(articles))

#new_article2 = jieba.analyse.extract_tags(new_article, topK=3000, withWeight=True, allowPOS=())

new_article2 = jieba.cut(new_article, cut_all=False)

另外想说,先用正则取出中文字符,是方便后面的jieba分词,这里Stop words的部分我也没有进行处理,jieba提供了很方便的stop words处理,也可到这里查看[github jieba]

小结以上两种方法仍然是太naive,用来应付课程作业还可以,但是要用到商业项目的话,还需要进行许多优化

当遇到需要中文 + 英文的文章分词的时候,我还没有具体用过,不过应该也会有写好的项目,有空可以找找看

最后就是,要考虑程序的开销问题,当然是资源消耗的越少越好啦

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值