江苏国泰做的网站案例/常用的营销方法和手段
任务描述
- 基本文本处理技能
1.1 分词的概念(分词的正向最大、逆向最大、双向最大匹配法);
1.2 词、字符频率统计;(可以使用Python中的collections.Counter模块,也可以自己寻找其他好用的库)
2.1 语言模型中unigram、bigram、trigram的概念;
2.2 unigram、bigram频率统计;(可以使用Python中的collections.Counter模块,也可以自己寻找其他好用的库)
3. 文本矩阵化:要求采用词袋模型且是词级别的矩阵化
步骤有:
3.1 分词(可采用结巴分词来进行分词操作,其他库也可以);
3.2 去停用词;构造词表。
3.3 每篇文档的向量化。
1.基本文本处理技能
1.1分词的概念(分词的正向最大、逆向最大、双向最大匹配法)
最大匹配法:最大匹配是指以词典为依据,取词典中最长单词为第一个次取字数量的扫描串,在词典中进行扫描(为提升扫描效率,还可以跟据字数多少设计多个字典,然后根据字数分别从不同字典中进行扫描)。例如:词典中最长词为“中华人民共和国”共7个汉字,则最大匹配起始字数为7个汉字。然后逐字递减,在对应的词典中进行查找。
正向最大匹配法:对句子从左到右进行扫描,尽可能地选择与词典中最长单词匹配的词作为目标分词,然后进行下一次匹配。
逆向最大匹配法:对句子从右到左进行扫描,尽可能地选择与词典中最长单词匹配的词作为目标分词,然后进行下一次匹配。
双向最大匹配法:将正向最大匹配算法和逆向最大匹配算法进行比较,从而确定正确的分词方法。
1.2 词、字符频率统计(使用Python中的collections.Counter模块)
import jieba
from collections import Counterdata = '北京大学和清华大学是中国的顶尖大学'print('单词统计')
words = list(jieba.cut(data))
print(Counter(words))print('字符统计')
print(Counter(list(data)))
2. 语言模型
2.1 n-gram模型(考虑句子中单词之间的顺序)
当n取1、2、3时,n-gram模型分别称为unigram、bigram、trigram语言模型
unigram一元分词,把句子分成一个一个的汉字
bigram二元分词,把句子从头到尾每两个字组成一个词语
trigram三元分词,把句子从头到尾每三个字组成一个词语
比如:
西安交通大学:
unigram 形式为:西/安/交/通/大/学
bigram形式为: 西安/安交/交通/通大/大学
trigram形式为:西安交/安交通/交通大/通大学
2.2词袋模型(不考虑句子中单词之间的顺序)
将所有词语装进一个袋子里,不考虑其词法和语序的问题,即每个词语都是独立的。
例句:
句1:Jane wants to go to Shenzhen.
句2:Bob wants to go to Shanghai.
建立一个数组用于映射匹配:[Jane, wants, to, go, Shenzhen, Bob, Shanghai]
构建词袋模型:
句1:[1,1,2,1,1,0,0]
句2:[0,1,2,1,0,1,1]
3. 文本矩阵化:要求采用词袋模型且是词级别的矩阵化
import jieba
import pandas as pd
import tensorflow as tf
from collections import Counter
from gensim.models import Word2Vec
from sklearn.feature_extraction.text import CountVectorizer# 读取停用词
def read_stopword(filename):stopword = []fp = open(filename, 'r')for line in fp.readlines():stopword.append(line.replace('\n', ''))fp.close()return stopword# 切分数据,并删除停用词
def cut_data(data, stopword):words = []for content in data['content']:word = list(jieba.cut(content))for w in list(set(word) & set(stopword)):while w in word:word.remove(w)words.append(' '.join(word))data['content'] = wordsreturn data# 获取单词列表
def word_list(data):all_word = []for word in data['content']:all_word.extend(word)all_word = list(set(all_word))return all_word# 计算文本向量
def text_vec(data):count_vec = CountVectorizer(max_features=300, min_df=2)count_vec.fit_transform(data['content'])fea_vec = count_vec.transform(data['content']).toarray()return fea_vecif __name__ == '__main__':data = pd.read_csv('./data/cnews/cnews.test.txt', names=['title', 'content'], sep='\t') # (10000, 2)data = data.head(50)stopword = read_stopword('./data/stopword.txt')data = cut_data(data, stopword)fea_vec = text_vec(data)print(fea_vec)