NLP实践二----语言处理技术

基本文本处理技能:中英文字符串处理(删除不相关的字符、去停用词);分词(结巴分词);词、字符频率统计。
语言模型;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)

你可能感兴趣的:(nlp学习)