python+excel+jieba分析一个具有多个列的文件,读取.xlsx文件,可以选择对文件内任意一列或多列的单元格内字符串相似度,并且输出相似度多少,对相似度大于0.75的新增一列进行标记,并输出成一个新的文件,用面向对象的方法来写
时间: 2024-03-24 19:36:14 浏览: 62
python读取excel数据,有详细注释,也有要读取的excel示例文件
好的,我来根据你的要求给你提供一个面向对象的解决方案。
首先,我们需要安装两个库:`openpyxl`和`jieba`,你可以使用以下命令安装:
```
pip install openpyxl jieba
```
然后,我们需要创建一个`ExcelAnalyzer`类来处理Excel文件:
```python
import openpyxl
import jieba
class ExcelAnalyzer:
def __init__(self, filename):
self.filename = filename
self.wb = openpyxl.load_workbook(filename)
self.sheets = self.wb.sheetnames
self.results = []
def analyze(self, sheet_name, col_names, threshold):
sheet = self.wb[sheet_name]
rows = sheet.iter_rows(min_row=2, values_only=True)
for row in rows:
values = []
for col_name in col_names:
cell = sheet[col_name + str(row[0])]
values.append(cell.value)
sim = self._calculate_sim(*values)
if sim >= threshold:
self.results.append((sheet_name, row[0], sim))
return self.results
def _calculate_sim(self, *values):
words = [jieba.lcut(str(value)) for value in values]
all_words = set([word for words in words for word in words])
vecs = []
for word in all_words:
vec = []
for words in words:
vec.append(words.count(word))
vecs.append(vec)
sim = self._cosine_similarity(vecs[0], vecs[1])
return sim
def _cosine_similarity(self, vec1, vec2):
numerator = sum([vec1[i] * vec2[i] for i in range(len(vec1))])
denominator = self._magnitude(vec1) * self._magnitude(vec2)
if denominator == 0:
return 0
else:
return numerator / denominator
def _magnitude(self, vec):
return (sum([x**2 for x in vec]))**0.5
def mark_similar(self, threshold, output_filename):
for sheet_name, row_num, sim in self.results:
sheet = self.wb[sheet_name]
cell = sheet.cell(row=row_num, column=len(col_names)+1)
if sim >= threshold:
cell.value = "similar"
self.wb.save(output_filename)
```
这个类有四个方法:
- `__init__`方法用于初始化Excel文件的基本信息。
- `analyze`方法用于分析指定表单的多个列,计算相似度,并返回大于阈值的结果。
- `_calculate_sim`方法用于计算两个字符串列表的相似度。
- `mark_similar`方法用于对大于阈值的结果进行标记,并输出到新的Excel文件中。
我们使用了`jieba`库来对文本进行分词,使用了余弦相似度来计算相似度。
接下来,我们可以使用这个类来分析Excel文件并输出结果:
```python
analyzer = ExcelAnalyzer("input.xlsx")
results = analyzer.analyze("Sheet1", ["A", "B"], 0.75)
print(results)
analyzer.mark_similar(0.75, "output.xlsx")
```
这个代码会输出大于阈值的结果,并把大于阈值的结果在原始Excel文件中标记出来,并输出到`output.xlsx`文件中。
希望这个代码对你有所帮助!
阅读全文