import sys import re import jieba import codecs import gensim import numpy as np import pandas as pd def segment(doc: str): stop_words = pd.read_csv('data/stopwords.txt', index_col=False, quoting=3, names=['stopword'], sep='\n', encoding='utf-8') stop_words = list(stop_words.stopword) reg_html = re.compile(r'<[^>]+>', re.S) # 去掉html标签数字等 doc = reg_html.sub('', doc) doc = re.sub('[0-9]', '', doc) doc = re.sub('\s', '', doc) word_list = list(jieba.cut(doc)) out_str = '' for word in word_list: if word not in stop_words: out_str += word out_str += ' ' segments = out_str.split(sep=' ') return segments def doc2vec(file_name, model): start_alpha = 0.01 infer_epoch = 1000 doc = segment(codecs.open(file_name, 'r', 'utf-8').read()) doc_vec_all = model.infer_vector(doc, alpha=start_alpha, steps=infer_epoch) return doc_vec_all # 计算两个向量余弦值 def similarity(a_vect, b_vect): dot_val = 0.0 a_norm = 0.0 b_norm = 0.0 cos = None for a, b in zip(a_vect, b_vect): dot_val += a * b a_norm += a ** 2 b_norm += b ** 2 if a_norm == 0.0 or b_norm == 0.0: cos = -1 else: cos = dot_val / ((a_norm * b_norm) ** 0.5) return cos def test_model(file1, file2): print('导入模型') model_path = 'tmp/zhwk_news.doc2vec' model = gensim.models.Doc2Vec.load(model_path) vect1 = doc2vec(file1, model) # 转成句子向量 vect2 = doc2vec(file2, model) print(sys.getsizeof(vect1)) # 查看变量占用空间大小 print(sys.getsizeof(vect2)) cos = similarity(vect1, vect2) print('相似度:%0.2f%%' % (cos * 100)) if __name__ == '__main__': file1 = 'data/corpus_test/t1.txt' file2 = 'data/corpus_test/t2.txt' test_model(file1, file2)
时间: 2024-03-29 10:37:57 浏览: 154
这是一段 Python 代码,主要是使用 gensim 库实现了基于 Doc2Vec 模型的文本相似度计算。其中,首先使用 jieba 库对文本进行分词,并去除停用词,然后使用 gensim.models.Doc2Vec 中的 infer_vector 方法将文本转化为向量表示,最后使用余弦相似度计算两个向量之间的相似度。该代码中使用了两个测试文件 t1.txt 和 t2.txt,分别进行文本相似度计算,并输出相似度的结果。
相关问题
import pandas as pd import jieba from wordcloud import WordCloud import matplotlib.pyplot as plt from PIL import Image # 读取中间表数据并提取读者ID和图书ID列 df = pd.read_excel('中间表.xlsx') reader_ids = df['读者ID'] book_ids = df['图书ID'] # 根据读者ID和图书ID关联读者信息和图书目录,得到每个读者借阅的图书的书名 readers_info = pd.read_excel('读者信息.xlsx') books_catalog = pd.read_excel('图书目录.xlsx') books_borrowed = books_catalog[books_catalog['图书ID'].isin(book_ids)] borrowed_books_names = books_borrowed['书名'] # 使用jieba进行中文分词 split_words = [] for book_name in borrowed_books_names: words = jieba.lcut(book_name) split_words.extend(words) # 加载停用词表并进行停用词过滤 stop_words_files = ['停用词表1.txt', '停用词表2.txt', '停用词表3.txt'] stop_words = set() for stop_words_file in stop_words_files: with open(stop_words_file, 'r', encoding='utf-8') as f: stop_words |= set(f.read().splitlines()) filtered_words = [word for word in split_words if word not in stop_words] # 加载篮球形状图片并生成词云图 basketball_mask = np.array(Image.open('basketball.png')) wordcloud = WordCloud(font_path='simhei.ttf', background_color='white', mask=basketball_mask).generate(' '.join(filtered_words)) plt.imshow(wordcloud, interpolation='bilinear') plt.axis('off') plt.show() # 获取词频最高的前10个词语 word_counts = pd.Series(filtered_words).value_counts() top_10_words = word_counts.head(10).index.tolist() print("该专业师生最迫切需要学习的知识:", top_10_words)
这段代码的作用是生成一个词云图,并输出该专业师生最迫切需要学习的知识(词频最高的前10个词语)。代码中使用了pandas库来读取和处理Excel文件数据,jieba库进行中文分词,wordcloud库生成词云图,matplotlib库进行图像展示,PIL库进行图片处理。
在代码中,使用`PIL.Image.open()`函数加载了一张名为'basketball.png'的图片作为词云图的形状模板。请确保'basketball.png'文件存在,并且与代码文件在同一目录下。
此外,代码还使用了一些Excel文件('中间表.xlsx'、'读者信息.xlsx'、'图书目录.xlsx'),请确保这些文件存在并包含正确的数据。
停用词表文件('停用词表1.txt'、'停用词表2.txt'、'停用词表3.txt')应该是包含一些常用词语的文本文件,每行一个词语。请确保这些文件存在,并且以UTF-8编码保存。
最后,代码输出了词频最高的前10个词语。请注意,此处涉及到`simhei.ttf`字体文件,确保该字体文件存在并与代码文件在同一目录下。
如果您遇到了任何错误,请提供具体的错误信息以便我更准确地帮助您解决问题。
import jieba from sklearn.feature_extraction.text import TfidfVectorizer import numpy as np import pandas as pd # 读取停用词文件 def read_stopwords(file_path): with open(file_path, 'r', encoding='gbk') as f: stopwords = [line.strip() for line in f] return set(stopwords) # 中文分词 def chinese_word_cut(text, stopwords): words = jieba.cut(text) result = [] for word in words: if word not in stopwords: result.append(word) return " ".join(result) # 读取CSV文件 weibo_data = pd.read_csv('E:\Python自然语言处理\data\weibo_Convid19.csv', sep='\t') df = weibo_data['text_raw'] # 获取停用词集合 stopwords = read_stopwords('E:\Python自然语言处理\data\stopword.txt') # 对每条微博进行分词和去停用词 corpus_list = df.apply(lambda x: chinese_word_cut(x, stopwords)) # 提取关键词 corpus = ' '.join(corpus_list) tfidf = TfidfVectorizer() tf_key = tfidf.fit_transform([corpus]) word = tfidf.get_feature_names() weight = tf_key.toarray()[0] w_sort = np.argsort(-weight) print('Top 20 keywords:') for i in range(20): print(word[w_sort[i]])结果含有表情包,怎么去除
可以使用正则表达式来去除文本中的表情包,例如:
```
import re
def remove_emoji(text):
emoji_pattern = re.compile("["
u"\U0001F600-\U0001F64F" # emoticons
u"\U0001F300-\U0001F5FF" # symbols & pictographs
u"\U0001F680-\U0001F6FF" # transport & map symbols
u"\U0001F1E0-\U0001F1FF" # flags (iOS)
"]+", flags=re.UNICODE)
return emoji_pattern.sub(r'', text)
# 在 chinese_word_cut 函数中调用 remove_emoji 函数
def chinese_word_cut(text, stopwords):
text = remove_emoji(text)
words = jieba.cut(text)
result = []
for word in words:
if word not in stopwords:
result.append(word)
return " ".join(result)
```
这样就可以在分词前去除文本中的表情包。
阅读全文