常用库
- Pandas:
- 作用: 用于数据分析和处理,提供了数据结构和数据分析工具,尤其适用于处理结构化数据(如表格数据)。
- 功能: 数据清洗、数据转换、数据分析、数据可视化、数据操作等。
- Matplotlib:
- 作用: 用于绘制各种静态、交互式和动态的数据可视化图表。
- 功能: 绘制折线图、柱状图、散点图、饼图、箱线图等。
- Seaborn:
- 作用: 用于创建统计图形,可以提高Matplotlib图表的美观度和信息表达性。
- 功能: 绘制更复杂、更具吸引力的统计图表,如热力图、分布图、分类散点图等。
- re (正则表达式):
- 作用: 用于文本匹配、搜索和处理,支持通过模式描述匹配规则。
- 功能: 匹配字符串、替换字符串、提取信息等。
- jieba:
- 作用: 用于中文分词,将中文文本按词语进行切分。
- 功能: 分词、词频统计、关键词提取等。
- wordcloud:
- 作用: 用于生成词云图,展示文本中词语的重要程度或频率。
- 功能: 根据文本中词语的频率或权重生成词云图。
- gensim:
- 作用: 用于文本建模和主题建模,特别是在自然语言处理中使用。
- 功能: 提供工具和算法用于文本向量化、词向量训练、主题模型构建等。
- snownlp:
- 作用: 用于处理中文文本情感分析。
- 功能: 提供情感分析、分词、标注等功能,尤其是针对中文文本的情感分析。
jieba
jieba.lcut:
分词粒度:与
jieba.cut
类似,分词粒度较粗。适用场景:一般用于普通文本分词,返回一个包含分词结果的列表。
示例:
pythonCopy codeimport jieba text = "我喜欢学习自然语言处理" result = jieba.lcut(text) print(result) # 输出:['我', '喜欢', '学习', '自然语言处理']
jieba.cut:
分词粒度:分词粒度较粗,适用于普通文本分词。
适用场景:一般用于普通文本分词,返回一个生成器对象,需要迭代获取分词结果。
示例:
pythonCopy codeimport jieba text = "我喜欢学习自然语言处理" result = jieba.cut(text) print(list(result)) # 输出:['我', '喜欢', '学习', '自然语言处理']
jieba.cut_for_search:
分词粒度:分词粒度较细,适用于搜索引擎等需要更细粒度分词的场景。
适用场景:用于搜索引擎等需要更细粒度分词的场景,返回一个生成器对象,需要迭代获取分词结果。
示例:
pythonCopy codeimport jieba text = "我喜欢学习自然语言处理" result = jieba.cut_for_search(text) print(list(result)) # 输出:['我', '喜欢', '学习', '自然', '语言', '自然语言', '处理']
jieba.cut(sent, cut_all=True):
分词粒度:分词粒度最细,尝试切分所有可能的词语。
适用场景:不常用,用于分词粒度最细的全模式,通常会导致大量的冗余分词结果。
示例:
pythonCopy codeimport jieba text = "我喜欢学习自然语言处理" result = jieba.cut(text, cut_all=True) print(list(result)) # 输出:['我', '喜欢', '学习', '自然', '自然语言', '语言', '处理
jieba.load_userdict('./data/user_dict.utf8')
加载用户自定义词典,以丰富分词库中的词汇,让分词器能够识别用户自定义的词语。这不会改变词语的权重,只是增加了分词器的词汇库。
aly.set_idf_path('./data/idf.txt.big')
主要用于自定义 IDF 文件,以影响分词结果中词语的权重。
aly.set_stop_words('./data/stop_words.utf8')
aly.set_stop_words('./stop_words.utf8')
这行代码的作用是设置停用词文件,指定了一个名为 "stop_words.utf8" 的文件作为停用词表。该文件内容应该包含要过滤掉的停用词,每个词汇占一行。
提取关键词
提取关键词会自动忽略特殊符号
aly.extract_tags(text, topK=5, withWeight=True, allowPOS=('n', 'v'))
text
:表示要提取关键词的文本。topK=5
:表示提取的关键词数量,这里设置为提取前 5 个关键词。withWeight=True
:表示同时返回关键词的权重。权重是基于 TF-IDF 算法计算的关键词重要性指标。allowPOS=('n', 'v')
:表示允许的词性。这里设置为只允许名词(n)和动词(v)作为关键词的词性。
文本中提取了前五个关键词,这些关键词根据 TF-IDF 算法的分数进行排序。自动识别文本中的重要词汇,通常用于文本摘要、关键词提取、主题分析等自然语言处理任务中。
aly.textrank(text, topK=5)
基于 TextRank 算法,自动分析文本中词语之间的关联关系,然后根据关联度来评估词语的重要性。
re 正则匹配库
re.match()
函数在字符串的开头进行匹配,只有当模式与字符串的开头完全匹配时才返回匹配对象。而 re.search()
函数则在整个字符串中搜索模式,返回第一个匹配项的匹配对象。
match
re.match()
函数来尝试在 text1
字符串的开头匹配模式 '自然语言处理'
。由于模式与字符串的开头完全匹配,因此返回一个匹配对象 <re.Match object; span=(0, 5), match='自然语言处理'>
。
使用 re.match()
函数来尝试在 text1
字符串的开头匹配模式 '语言处理'
。由于模式不与字符串的开头完全匹配,因此返回 None
。
search
使用 re.search()
函数来在 text1
字符串中搜索模式 '语言处理'
。由于模式在字符串中出现,返回一个匹配对象 <re.Match object; span=(3, 8), match='语言处理'>
,表示模式在字符位置 3 到 8 之间匹配成功。
findall
re.findall('计算机', text1)
,将返回一个列表,其中包含在 text1
中找到的所有与模式 '计算机'
匹配的子字符串。
sub
re.sub('自然语言处理', 'NLP', text1)
,将对 text1
中的匹配项 '自然语言处理'
进行替换。将替换为 'NLP'
。
r
r
是一个前缀,表示原始字符串(raw string)。使用原始字符串,可以确保反斜杠 \
不会被解释为特殊字符。
当使用正则表达式时,某些字符具有特殊意义,例如 \n
表示换行符,\t
表示制表符等。如果想要匹配这些特殊字符本身而不是它们的特殊含义,可以在正则表达式模式的前面添加 r
前缀,使其成为原始字符串。
例如,考虑以下正则表达式模式:
pattern = r"\d+"
print(re.findall(r'\b[a-zA-Z]+', text2))
这行代码使用了 re.findall()
函数来在 text2
字符串中找到所有由英文字母组成的单词。
具体解释如下:
\b
是一个正则表达式的元字符,表示单词的边界。它用于匹配单词的开头或结尾,确保我们只匹配完整的单词而不是单词的一部分。[a-zA-Z]
是一个字符类,表示匹配任意一个英文字母(大小写不限)。+
是一个量词,表示匹配前面的字符或字符类一次或多次。re.findall()
函数将返回所有匹配到的结果,以列表的形式进行返回。
Pandas
iloc
Pandas DataFrame对象的一个属性,用于基于整数位置对数据进行选择和切片。iloc
允许你通过行和列的整数位置来访问数据,而不是使用标签或索引。
语法如下:
df.iloc[行位置, 列位置]
其中,行位置和列位置可以是单个整数、整数切片或整数列表,用于选择相应的行和列。
以下是一些示例用法:
选择单个元素:
pythondf.iloc[0, 1] # 选择第0行第1列的元素
选择整行:
pythondf.iloc[1] # 选择第1行的所有列
选择整列:
pythondf.iloc[:, 2] # 选择第2列的所有行
切片多行和多列:
pythondf.iloc[1:3, 0:2] # 选择第1行到第2行和第0列到第1列的数据
选择指定行和列的位置:
pythondf.iloc[[0, 2], [1, 3]] # 选择第0行和第2行以及第1列和第3列的数据
字段重命名
df = df.rename(columns={'新': '旧', '新1': '旧1'})
read_csv
df = pd.read_csv('test.txt', header=None)
header = None 时第一行为主体内容,不加时默认第一行为标题
Gensim
通常,我们要处理的原生语料是一堆文档的集合,每一篇文档又是一些原生字符的集合。在交给Gensim的模型训练之前,我们需要将这些原生字符解析成Gensim能处理的稀疏向量的格式。由于语言和应用的多样性,我们需要先对原始的文本进行分词、去除停用词等操作,得到每一篇文档的特征列表。例如,在词袋模型中,文档的特征就是其包含的word:
texts = [['human', 'interface', 'computer'],
['survey', 'user', 'computer', 'system', 'response', 'time'],
['eps', 'user', 'interface', 'system'],
['system', 'human', 'system', 'eps'],
['user', 'response', 'time'],
['trees'],
['graph', 'trees'],
['graph', 'minors', 'trees'],
['graph', 'minors', 'survey']]
其中,corpus的每一个元素对应一篇文档。
例:
documents = ['世界那么大我想去河南周口看看周口', '身在周口的宝宝恭喜了',
'2岁宝宝坠楼,他们接住了!', 'A县发现3例新冠肺炎无症状感染者']
texts = [[word for word in list(jieba.cut(document)) if word not in stopwords] for document in documents] # 分词、去停用词
print(texts)
[['世界', '想', '河南', '周口', '看看', '周口'], ['身在', '周口', '宝宝', '恭喜'], ['岁', '宝宝', '坠楼', '接住'], ['A', '县', '发现', '例新冠', '肺炎', '无症状', '感染者']]
接下来,我们可以调用Gensim提供的API建立语料特征(此处即是word)的索引字典,并将文本特征的原始表达转化成词袋模型对应的稀疏向量的表达。依然以词袋模型为例:
from gensim import corpora
dictionary = corpora.Dictionary(texts)
corpus = [dictionary.doc2bow(text) for text in texts]
print corpus[0] # [(0, 1), (1, 1), (2, 1)]
dictionary 词典
dictionary = corpora.Dictionary(texts) # 加载语料,生成字典
print(dictionary)
Dictionary<18 unique tokens: ['世界', '周口', '想', '河南', '看看']...>
词典即包含不重复的全部词,是将原始文本中的词语映射到唯一标识符的数据结构。它创建了词语到数字之间的对应关系,这些数字可以用于进一步的分析和处理。词典将每个词映射到一个唯一的ID,这样可以在模型训练和其他处理中使用数字而不是字符串。
查看每个词对应的 ID
for key, value in dictionary.items():
print(key, value)
0 世界
1 周口
2 想
3 河南
4 看看
5 宝宝
词袋模型
corpus = [dictionary.doc2bow(text) for text in texts]
[[(0, 1), (1, 2), (2, 1), (3, 1), (4, 1)], [(1, 1), (5, 1), (6, 1), (7, 1)], [(5, 1), (8, 1), (9, 1), (10, 1)], [(11, 1), (12, 1), (13, 1), (14, 1), (15, 1), (16, 1), (17, 1)]]
corpus = [dictionary.doc2bow(text) for text in texts]
这行代码的作用是将文本数据(texts
)转换为一种称为词袋模型(Bag of Words, BoW)的数值化表示形式。
texts
: 这是分词后的文本数据,每个文本被表示为一个词语列表。dictionary.doc2bow(text)
: 这是用词典(dictionary
)将分词后的文本转换为词袋模型的过程。doc2bow
方法将文本转换为一种简单的数值表示,其中每个词语都与一个唯一的整数 ID 相关联,并且与词语在文本中出现的次数一起被记录。corpus = [...]
: 这部分将处理后的文本数据转换为一个称为语料库(corpus)的集合,其中每个文本都用词袋模型表示。
每个文本经过 dictionary.doc2bow(text)
处理后,会得到一个由元组组成的列表,每个元组包含两个值:词语的唯一整数 ID 和该词语在文本中的出现次数。这个过程可以被看作将文本量化到一个数值化的表示。