用python实现一个TF-IDF算法的改进算法:TF-IWF算法。要求输入输出明确;输入为jieba分词后的txt文档;输出词汇名称及权重;注释清晰
时间: 2023-11-18 22:19:40 浏览: 180
好的,这里是一个用Python实现的TF-IWF算法,满足输入输出明确、输入为jieba分词后的txt文档、输出词汇名称及权重、注释清晰的要求。
我们需要使用jieba分词库进行分词,需要先安装jieba库。
```python
!pip install jieba
```
下面是实现代码:
```python
import numpy as np
import jieba
from sklearn.feature_extraction.text import CountVectorizer
class TFIWF:
def __init__(self):
self.vectorizer = CountVectorizer()
self.vocab = None
self.idf = None
def fit_transform(self, documents):
"""
对文档进行特征提取,计算TF-IWF值
:param documents: list,文档列表,已经用jieba进行分词
:return: tf_iwf: numpy.ndarray,TF-IWF特征矩阵
"""
# 将文档转化为稀疏矩阵
count_matrix = self.vectorizer.fit_transform(documents)
# 获取词表
self.vocab = self.vectorizer.get_feature_names()
# 计算文档频率
df = np.array(np.sum(count_matrix > 0, axis=0))[0]
# 计算逆文档频率
self.idf = np.log((len(documents) + 1) / (df + 1)) + 1
# 计算TF
tf = np.array(count_matrix.todense())
tf = tf / np.sum(tf, axis=1, keepdims=True)
# 计算TF-IWF
tf_iwf = tf * self.idf
return tf_iwf
def get_feature_names(self):
"""
获取特征名称列表
:return: list,特征名称列表
"""
return self.vocab
def get_feature_weights(self):
"""
获取特征权重列表
:return: list,特征权重列表
"""
return list(self.idf)
```
使用示例:
```python
# 创建TF-IWF对象
tf_iwf = TFIWF()
# 读取文档
with open('test.txt', 'r', encoding='utf-8') as f:
documents = f.readlines()
# 对文档进行jieba分词
documents = [list(jieba.cut(doc.strip())) for doc in documents]
# 特征提取并计算TF-IWF值
tf_iwf_matrix = tf_iwf.fit_transform(documents)
# 获取特征名称列表和特征权重列表
feature_names = tf_iwf.get_feature_names()
feature_weights = tf_iwf.get_feature_weights()
# 输出特征名称及权重
for i, name in enumerate(feature_names):
print(name, feature_weights[i])
```
其中,test.txt是需要特征提取的文档文件,需要在当前目录下存在。输出的特征名称及权重即为TF-IWF算法的结果。
阅读全文