最近在写股票预测,大致是根据每天的文章及股票涨跌来预测未来的股票走势。这里的中文文章就少不了分词的处理,我把自己写作业用的两种记录一下:自己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 objectnew_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,用来应付课程作业还可以,但是要用到商业项目的话,还需要进行许多优化
当遇到需要中文 + 英文的文章分词的时候,我还没有具体用过,不过应该也会有写好的项目,有空可以找找看最后就是,要考虑程序的开销问题,当然是资源消耗的越少越好啦
python分词工具包 python分词代码
转载文章标签 python分词工具包 中文分词python代码 中文字符 正则 正则表达式 文章分类 Python 后端开发

-
ES(Elasticsearch)安装分词与拼音插件
ES安装分词与拼音插件
elasticsearch 分词器 数据