基本文本处理技能:中英文字符串处理(删除不相关的字符、去停用词);分词(结巴分词);词、字符频率统计。
语言模型;unigram、bigram、trigram频率统计。
结巴分词介绍和使用
1.中英文字符串处理
#直接使用apply函数食用更佳
def word_clear(s):
words=''
for uchar in s:
# 判断是否为汉字
if uchar >= u'\u4e00' and uchar <= u'\u9fa5':
words+=uchar
# 判断是否为数字
if uchar >= u'\u0030' and uchar <= u'\u0039':
words+=uchar
# 判断是否为英文字母
if (uchar >= u'\u0041' and uchar <= u'\u005a') or (uchar >= u'\u0061' and uchar <= u'\u007a'):
words+=uchar
else:
continue
return words
2.中文结巴分词
import jieba
#全模式
#把句子中所有可以成词的词语都扫描出来,速度快,不能解决歧义
sent='我爱你中国认真学习'
wordlist=jieba.cut(sent,cut_all=True)
print('|'.join(wordlist))
# 我爱你|中国|认真|认真学习|学习
#精确分词
# 试图将句子最精准地分开
wordlist=jieba.cut(sent,cut_all=False)
print(','.join(wordlist))
# 我爱你,中国,认真学习
#搜索引擎模式
# 在精确模式下的基础对长词再切分,提高召回率
wordlist=jieba.cut_for_search(sent)
print('.'.join(wordlist))
# 我爱你.中国.认真.学习.认真学习
#自定义用户词典,
直接再源文件里面加.txt编码utf-8
天善智能 100 n
大数据 100 n
jieba.load_userdict('E:\\professional_software\\anaconda\\Lib\\site-packages\\jieba\\userdict.txt')
sent='天善智能是一个专注商业智能大数据'
wordlist=jieba.cut(sent)
print(' '.join(wordlist))
词、字符频率统计。
from collections import Counter
import pandas as pd
df=pd.DataFrame({'title':[1,2],'content':['我爱你中国','我爱你世界中国我爱你',]})
def get_word_frequence(words):
all_word=[]
for i in words:
cut_words=jieba.cut(i)
for uchar in cut_words:
all_word.append(uchar)
print(all_word)
a=Counter(all_word)
a=a.most_common(len(all_word))
key,value=zip(*a)
key=list(key)
value=list(value)
dic={ key[i]:value[i] for i in range(len(key))}
return dic
l=get_word_frequence(df['content'].values)
print(l)
unigram、bigram、trigram频率统计。
n-gram是一种基于统计语言模型的算法。在自然语言处理中,我们经常需要用到n元语法模型。n-gram第N个词的出现只与前面N-1个词相关,而与其它任何词都不相关,整句的概率就是各个词出现概率的乘积。这些概率可以通过直接从语料中统计N个词同时出现的次数得到。
其中,有关中文分词的一些概念是我们需要掌握的,譬如:
unigram 一元分词,把句子分成一个一个的汉字,每个词之间没有关联关系;
bigram 二元分词,把句子从头到尾每两个字组成一个词语,当前词只和上一个词有关系;
trigram 三元分词,把句子从头到尾每三个字组成一个词语,当前词只和前两个词有关系。
end
下面直接使用sklearn 的库进行统计:
# ram_range=(1,1) 表示 unigram, ngram_range=(2,2) 表示 bigram, ngram_range=(3,3) 表示 thirgram
from sklearn.feature_extraction.text import CountVectorizer
import pandas as pd
import jieba
data = ["为了china,为了胜利,向我开炮!向我开炮!",
"记者:你怎么会说出那番话",
"我只是觉得,对准我自己打"]
data = [" ".join(jieba.lcut(e)) for e in data] # 分词,并用" "连接
vector = CountVectorizer(min_df=1, ngram_range=(2,2)) # bigram
X = vector.fit_transform(data) # 将分词好的文本转换为矩阵
print(vector.vocabulary_ ) # 得到特征
print(X) #(句子下标, 单词特征下标) 频数
df1 = pd.DataFrame(X.toarray(), columns=vector.get_feature_names()) # to DataFrame
df1.head()
#tfidf
from sklearn.feature_extraction.text import TfidfVectorizer
import pandas as pd
corpus = ["This is sample document.", "another random document.", "third sample document text"]
vector = TfidfVectorizer()
tf_data = vector.fit_transform(corpus)
print(tf_data) #(句子下标, 单词特征下标) 权重
print(vector.vocabulary_) #单词特征
df1 = pd.DataFrame(tf_data.toarray(), columns=vector.get_feature_names())
print(df1)