一个用户友好且易于使用的自然语言处理包,专为中文文本分析、建模和可视化而设计。HanziNLP中的所有功能都支持中文文本,并且非常适用于中文文本分析!如果需要详细信息,欢迎阅读软件包Github主页: https://github.com/samzshi0529/HanziNLP
对于任何使用HanziNLP的人,开发者向您表示衷心的感谢!
关于我更多的信息和任何改进的建议,您可以通过以下方式找到我:
欢迎来到 HanziNLP - 一个即用的中文文本自然语言处理(NLP)工具包,同时也支持英文。它旨在成为即便是Python新手也能友好使用的简化工具。
此外,HanziNLP还提供了一个交互式仪表板,用于动态洞察NLP功能,为各种NLP功能提供动态概览和洞察。
使用HanziNLP只需执行一个简单的命令即可开始!
pip install HanziNLP
dashboard_video
from HanziNLP import dashboard
dashboard()
dashboard()
dashboard
函数引入了一个用户交互式的仪表板,旨在执行文本分析和情感分类,为用户提供亲身体验,以探索和理解不同预训练模型和分词参数对文本处理的影响。
dashboard
函数强调用户参与和探索。它允许用户与各种预训练模型和分词参数进行交互式交流,观察它们对文本分析和情感分类的影响。这种交互式探索使用户能够做出明智的决策,选择最符合他们特定用例的模型和参数,从而增强他们的文本分析和自然语言处理(NLP)任务。
这个基本功能计算文本中的字符和单词数量,省去了您自己识别和分割中文单词的手动努力。
char_freq(text, text_only=True)
: 函数用于计算给定文本中每个字符的频率;如果 text_only == True,只会计算中文和英文字符。如果 text_only == False,将计算所有字符。默认为 True。word_freq(text)
: 函数用于计算给定文本中每个单词的频率。from HanziNLP import char_freq, word_freq
text = "你好, 世界!"
char_count = char_freq(text)
word_count = word_freq(text)
print(f"字符计数: {char_count}")
print(f"单词计数: {word_count}")
字符计数: 4
单词计数: 2
在Python环境中可视化中文文本时,字体是一个经常需要手动导入的重要资源。HanziNLP内置了字体列表,可立即使用。您可以使用list_fonts()
查看和过滤所有可用的字体,并使用get_font()
检索用于可视化目的的特定字体路径。所有内置的字体都来自Google字体,它们根据开放字体许可证获得许可,这意味着您可以在产品和项目中使用它们——无论是印刷品还是数字品,无论是商业的还是其他的。
list_fonts()
: 列出所有可用的字体。get_font(font_name, show=True)
: 检索用于可视化目的的特定字体。如果 show == True,将显示字体的样本可视化。如果 show == False,将不显示任何内容。默认设置为True。from HanziNLP import list_fonts
# 列出所有可用的字体
list_fonts()
from HanziNLP import get_font
font_path = get_font('ZCOOLXiaoWei-Regular') #在 list_fonts() 中输入您喜欢的 font_name
您可以使用定义的中文 font_path 制作各种图表。下面提供了一个词云示例:
from PIL import Image
from wordcloud import WordCloud,ImageColorGenerator
import matplotlib.pyplot as plt
# 由GPT-4生成的样本文本
text = '在明媚的春天里,小花猫咪悠闲地躺在窗台上,享受着温暖的阳光。她的眼睛闪烁着好奇的光芒,时不时地观察着窗外忙碌的小鸟和蝴蝶。小猫的尾巴轻轻摇动,表达着她内心的舒适和满足。在她的身边,一盆盛开的紫罗兰散发着淡淡的香气,给这个宁静的午后增添了几分诗意。小花猫咪偶尔会闭上她的眼睛,沉浸在这美好的时光中,仿佛整个世界都变得温馨和谐。窗外的樱花树在微风中轻轻摇曳,洒下一片片粉色的花瓣,如梦如幻。在这样的一个悠托的春日里,一切都显得如此美好和平静。'
text = " ".join(text)
# 生成词云
wordcloud = WordCloud(font_path= font_path, width=800, height=800,
background_color='white',
min_font_size=10).generate(text)
# 显示词云
plt.figure(figsize=(5, 5), facecolor=None)
plt.imshow(wordcloud)
plt.axis("off")
plt.tight_layout(pad=0)
plt.title("样本词云")
plt.show()
文本分段是任何NLP任务中的一个关键步骤。一般的步骤是分段句子,去除停用词,并分别对每个句子进行分词。下面介绍了详细的说明。
为了在中文文本中去除停用词,该包内置了常见的停用词列表,包括以下几个:(部分停用词来自stopwords)
停用词列表 | 文件名 |
---|---|
中文停用词表 | cn_stopwords.txt |
哈工大停用词表 | hit_stopwords.txt |
百度停用词表 | baidu_stopwords.txt |
四川大学机器智能实验室停用词表 | scu_stopwords.txt |
常用停用词表 | common_stopwords.txt |
list_stopwords()
: 列出所有可用的停用词。load_stopwords(file_name)
: 从指定的文件加载停用词到一个词列表。然后,您可以查看并在后续使用中使用这些停用词。from HanziNLP import list_stopwords
list_stopwords()
from HanziNLP import load_stopwords
stopwords = load_stopwords('common_stopwords.txt') # 在这里输入txt文件名
{'然而',
'whoever',
'只限',
'的确',
'要不然',
'each',
'仍旧',
'这么点儿',
'冒',
'如果',
'比及',
'以期',
'犹自'.....
}
此功能将整个文档或段落分段成句子。支持中文和英文文本。
sentence_segment(text)
: 将输入文本分段成句子。from HanziNLP import sentence_segment
sample_sentence = 'hello world! This is Sam.。 除非你不说。我今天就会很开心,hello .you。'
sentence_segment(sample_sentence)
['hello world!', 'This is Sam.', '。', '除非你不说。', '我今天就会很开心,hello .', 'you。']
作为预处理文本用于NLP任务的最重要步骤之一,word_tokenize()
函数提供了一种直接将原始中文文本转换为标记的方法。
word_tokenize(text, mode='precise', stopwords='common_stopwords.txt', text_only=False, include_numbers=True, custom_stopwords=None, exclude_default_stopwords=False)
text
(str): 输入的中文文本。mode
(str, 可选): 标记模式,可从 ‘all’, ‘precise’ 或 ‘search_engine’ 中选择。默认为 ‘precise’。stopwords
(str, 可选): 指示要使用的停用词文件的文件名字符串。默认为 ‘common_stopwords.txt’。text_only
(bool, 可选): 如果为 True,则仅标记英文和中文文本。默认为 False。include_numbers
(bool, 可选): 如果为 True,则在标记的输出中包含数字。默认为 True。custom_stopwords
(str 列表, 可选): 要删除的自定义停用词列表。默认为 None。exclude_default_stopwords
(bool, 可选): 如果为 True,则排除默认的停用词。默认为 False。list
: 根据指定的参数删除停用词后的标记列表。from HanziNLP import word_tokenize
sample = '除非你不说,我今天就会很开心,hello you#$@#@*' # 一个故意用于标记化的困难文本
token = sz.word_tokenize(sample, mode='precise', stopwords='baidu_stopwords.txt', text_only=False,
include_numbers=True, custom_stopwords=None, exclude_default_stopwords=False)
token
['不', '说', ',', '会', '很', '开心', ',', '#', '$', '@', '#', '@', '*']
from HanziNLP import word_tokenize
sample = '除非你不说,我今天就会很开心,hello you#$@#@*'# 一个故意用于标记化的困难文本
token = sz.word_tokenize(sample, mode='precise', stopwords='baidu_stopwords.txt', text_only=True,
include_numbers=True, custom_stopwords=['开心'], exclude_default_stopwords=False)
token
['不', '说', '会', '很']
构建文本特征图是各种机器学习或深度学习任务的起点。HanziNLP已整合了可以轻松实现的常见特征图方法。
BoW(segmented_text_list)
segmented_text_list
(str 列表):包含分段文本的列表。dict
:表示词频的字典。from HanziNLP import word_tokenize, BoW
sample_sentence = 'hello world! This is Sam.。 除非你不说。我今天就会很开心,hello .you。'
token = word_tokenize(sample_sentence, text_only = True)
bow = BoW(token)
bow
{'hello': 2, 'world': 1, 'This': 1, 'Sam': 1, '说': 1, '今天': 1, '会': 1, '开心': 1}
ngrams(tokens, n=3)
tokens
(列表):标记列表。n
(int, 可选):n-grams的数字。默认为3(trigrams)。dict
:以n-grams为键,其频率为值的字典。from HanziNLP import word_tokenize, ngrams
sample_sentence = 'hello world! This is Sam.。 除非你不说。我今天就会很开心,hello .you。'
token = word_tokenize(sample_sentence, text_only = True)
ngram = ngrams(token, n =3)
ngram
{'hello world This': 1,
'world This Sam': 1,
'This Sam 说': 1,
'Sam 说 今天': 1,
'说 今天 会': 1,
'今天 会 开心': 1,
'会 开心 hello': 1}
TF_IDF(text_list, max_features=None, output_format='sparse')
text_list
(str 列表):要转换的标记列表。max_features
(int, 可选):要提取的最大特征(术语)数量。默认为None(所有特征)。output_format
(str, 可选):输出矩阵的格式(‘sparse’,‘dense’ 或 ‘dataframe’)。默认为’sparse’。matrix
:指定格式的TF-IDF矩阵。feature_names
:特征名称列表。from HanziNLP import word_tokenize, TF_IDF
sample_sentence = 'hello world! This is Sam.。 除非你不说。我今天就会很开心,hello .you。'
token = word_tokenize(sample_sentence, text_only = True)
tfidf_matrix, feature_names = sz.TF_IDF(token, output_format = 'dataframe')
tfidf_matrix
TT_matrix(tokenized_texts, window_size=1)
tokenized_texts
(str 列表的列表):标记文本的列表。window_size
(int):共现的窗口大小。默认为1。np.array
:一个方阵,其中条目(i,j)是术语i和术语j之间的共现。index_to_term
:从索引到术语的字典。from HanziNLP import word_tokenize, TT_matrix
sample_sentence = 'hello world! This is Sam.。 除非你不说。我今天就会很开心,hello .you。'
token = word_tokenize(sample_sentence, text_only = True)
matrix, index_to_term = TT_matrix(token, window_size = 1)
matrix
array([[0., 4., 4., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0.],
[4., 0., 0., 0., 0., 0., 0., 2., 2., 0., 0., 0., 0., 0., 0., 0.,
0.],
[4., 0., 4., 4., 0., 2., 2., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0.],
[0., 0., 4., 0., 2., 2., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0.],
[0., 0., 0., 2., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0.],
[0., 0., 2., 2., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0.],
[0., 0., 2., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0.],
[0., 2., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0.],
[0., 2., 0., 0., 0., 0., 0., 0., 0., 2., 0., 0., 0., 0., 0., 0.,
0.],
[0., 0., 0., 0., 0., 0., 0., 0., 2., 0., 0., 0., 0., 0., 0., 0.,
0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 2., 0., 0., 0., 0.,
0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 2., 0., 2., 0., 0., 0.,
0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 2., 0., 0., 0., 0.,
0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 2., 0.,
0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 2., 0., 0.,
0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
2.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 2.,
0.]])
text_similarity(text1, text2, method='cosine')
text1
(str): 用于比较的第一个文本字符串。text2
(str): 用于比较的第二个文本字符串。method
(str): 用于计算相似度的方法。选项包括 ‘cosine’、‘jaccard’、‘euclidean’ 或 ‘levenshtein’。默认为 ‘cosine’。float
: 表示 text1
和 text2
之间相似度分数的数值。text_similarity
函数精心制作,用于使用用户指定的方法计算两个文本字符串(即 text1
和 text2
)之间的相似度。首先,函数对输入文本进行分词并将其转换为向量形式。随后,它根据所选方法计算相似度分数,该方法可以是以下之一:‘cosine’、‘jaccard’、‘euclidean’ 或 ‘levenshtein’。
from HanziNLP import text_similarity
sample='你好世界'
sample1 = '你好世界,hello world'
text_similarity(sample, sample1, method = 'jaccard')
0.5
from HanziNLP import text_similarity
sample='你好世界'
sample1 = '你好世界,hello world'
text_similarity(sample, sample1, method = 'levenshtein')
0.07692307692307693
Word2Vec
: 使用 FastText 模型获取词嵌入。Word2Vec(text, dimension=300)
text
(str): 可能包含英文和中文单词的输入文本。dimension
(int): 生成的词嵌入的维度。默认值为 300。list of numpy.ndarray
: 一个包含输入文本中每个单词的词嵌入的列表。Word2Vec
函数旨在使用预训练的 FastText 模型为给定文本生成词嵌入,该文本可能包含来自英文和中文的单词。首先,函数检查并下载英文和中文的 FastText 模型(如果尚未下载)。接下来,它加载模型,并在请求时将其维度减小到指定的大小。
文本被分词成单词,对于每个单词,函数检查它是否包含中文字符。如果一个单词包含中文字符,则使用中文 FastText 模型获取其嵌入;否则,使用英文模型。生成的嵌入被追加到一个列表中,然后返回该列表。
from HanziNLP import Word2Vec
sample_sentence = 'hello world! This is Sam.。 除非你不说。我今天就会很开心,hello .you。'
result = Word2Vec(sample_sentence)
get_bert_embeddings(text, model="bert-base-chinese")
text
(str): 需要生成嵌入的输入文本。model
(str): 将要使用的预训练中文 BERT 模型的名称。默认为 “bert-base-chinese”。sentence_embedding
(list): 表示为浮点数列表的句子嵌入。tokens
(list): 与句子嵌入相关联的令牌。get_bert_embeddings
函数旨在使用指定的预训练中文 BERT 模型为给定文本提取 BERT 嵌入。首先,函数加载指定的 BERT 模型及其相应的分词器。输入文本被分词并为模型准备好,确保它被截断为最多 512 个令牌,以便与 BERT 模型兼容。
在分词之后,模型生成预测,并检索 BERT 模型的最后隐藏状态。通过取最后隐藏状态的平均值并将其转换为浮点数列表来计算句子嵌入。此外,通过将输入 ID 转换回令牌来获取与句子嵌入关联的令牌。
from HanziNLP import get_bert_embeddings
embeddings, tokens = get_bert_embeddings(text, model = "bert-base-chinese") # 输入你希望使用的 Hugging Face 的 BERT 模型名称
print(f"Tokens: {tokens}")
print(f"Embeddings: {embeddings}")
HanziNLP 已集成了代码,以便轻松实现 LDA 模型,从大量文本中提取主题。将更新更多模型:
lda_model(texts, num_topics=10, passes=15, dictionary=None)
texts
(list of list of str): 文档的列表,每个文档表示为一个令牌列表。num_topics
(int): 要提取的主题数量。默认为 10。passes
(int): 通过语料库的训练次数。默认为 15。dictionary
(corpora.Dictionary, 可选): 一个可选的预计算 Gensim 字典。lda_model
: 训练过的 LDA 模型。corpus
: 用于训练模型的语料库。dictionary
: 用于训练模型的字典。lda_model
函数旨在在文本集合上训练一个 LDA 模型,便于提取和识别潜在的主题。如果没有提供预计算的字典,函数会从输入文本生成一个新的字典。文本被转换为词袋表示形式,LDA 模型使用指定或默认参数进行训练。返回训练过的模型、语料库和字典,以便进一步分析和主题可视化。
print_topics(lda_model, num_words=10)
lda_model
: 训练过的 LDA 模型。num_words
(int): 每个主题要显示的前几个单词。默认为 10。print_topics
函数旨在显示来自训练过的 LDA 模型的每个主题的前几个单词,提供了每个主题的主题实质的快速而有见地的概览。通过迭代每个主题,它打印主题索引和前几个单词,帮助解释和分析 LDA 模型提取的主题。
from HanziNLP import sentence_segment, word_tokenize, lda_model, print_topics
sample_sentence = 'hello world! This is Sam.。 除非你不说。我今天就会很开心,hello .you。'
sentences = sentence_segment(sample_sentence)
tokenized_texts = [word_tokenize(sentence) for sentence in sentences]
lda_model, corpus, dictionary = lda_model(tokenized_texts, num_topics=5)
print_topics(lda_model)
Topic: 0
Words: 0.231*"This" + 0.231*"Sam" + 0.231*"." + 0.038*"说" + 0.038*"hello" + 0.038*"world" + 0.038*"!" + 0.038*"今天" + 0.038*"开心" + 0.038*"会"
Topic: 1
Words: 0.231*"world" + 0.231*"!" + 0.231*"hello" + 0.038*"说" + 0.038*"." + 0.038*"Sam" + 0.038*"This" + 0.038*"今天" + 0.038*"会" + 0.038*"开心"
Topic: 2
Words: 0.091*"说" + 0.091*"This" + 0.091*"!" + 0.091*"hello" + 0.091*"." + 0.091*"world" + 0.091*"Sam" + 0.091*"开心" + 0.091*"今天" + 0.091*"会"
Topic: 3
Words: 0.146*"." + 0.146*"hello" + 0.146*"," + 0.146*"会" + 0.146*"开心" + 0.146*"今天" + 0.024*"说" + 0.024*"Sam" + 0.024*"!" + 0.024*"world"
Topic: 4
Words: 0.375*"说" + 0.063*"hello" + 0.063*"." + 0.063*"!" + 0.063*"Sam" + 0.063*"world" + 0.063*"This" + 0.063*"今天" + 0.063*"会" + 0.063*"开心"
情感分析在 NLP 任务中很常见,文本的情感可以为进一步的研究分析做出贡献。虽然有许多方法可以进行情感分析,比如使用情感词典,但HanziNLP集成了函数,允许轻松使用预训练的 BERT 模型或 Huggin Face 上的其他语言模型进行文本分类。
sentiment(text, model='hw2942/bert-base-chinese-finetuning-financial-news-sentiment-v2', print_all=True, show=False)
text
(str): 用于情感分析的输入文本。model
(str): 要使用的预训练模型的标识符。您可以使用 Hugging Face 上的任何模型,并在此处复制模型名称以用于对文本进行分类。默认为 ‘hw2942/bert-base-chinese-finetuning-financial-news-sentiment-v2’。print_all
(bool): 指示是否打印所有标签的概率,或仅打印概率最高的标签。默认为 True。show
(bool): 指示是否显示显示标签概率分布的条形图。默认为 False。dict
或 tuple
: 如果 print_all
为 True,则返回一个包含情感标签及其相应概率的字典。如果 print_all
为 False,则返回一个包含概率最高的标签及其相应概率的元组。sentiment
函数专为使用指定的预训练模型对提供的文本执行情感分析而定制。在加载分词器和模型后,输入文本被分词并传递给模型以获取输出 logits。然后使用 softmax 函数将这些 logits 转换为概率。从模型的配置中检索与这些概率相对应的标签,并将它们及其各自的概率存储在字典中。
如果 show
设置为 True,则显示一个条形图,可视化情感标签的概率分布。函数返回一个包含所有情感标签及其相应概率的字典(如果 print_all
为 True),或包含概率最高的标签及其相应概率的元组(如果 print_all
为 False)。
from HanziNLP import sentiment
text = "这个小兄弟弹的太好了"
sentiment_result = sentiment(text, model='touch20032003/xuyuan-trial-sentiment-bert-chinese', show=True) # 在 Hugging Face 上输入任何预训练的分类模型
print('sentiment =', sentiment_result)
sentiment = {'none': 2.7154697818332352e-05, 'disgust': 2.6893396352534182e-05, 'happiness': 0.00047770512173883617, 'like': 0.9991452693939209, 'fear': 3.293586996733211e-05, 'sadness': 0.00013537798076868057, 'anger': 8.243478805525228e-05, 'surprise': 7.21854084986262e-05}
如果您在研究中使用了 HanziNLP,请考虑按照以下方式引用它:
Zhan, Shi. (2023). HanziNLP (Version 0.1.0) [Software]. GitHub. https://github.com/samzshi0529/HanziNLP
对于 LaTeX 文档的使用,您可以使用以下 BibTeX 引用:
@misc{Zhan2023,
author = {Zhan, Shi.},
title = {HanziNLP},
year = {2023},
publisher = {GitHub},
version = {0.1.0},
howpublished = {\url{https://github.com/samzshi0529/HanziNLP}}
}