import os
from openpyxl import Workbook, load_workbook
from openpyxl.styles import Alignment
import jieba.posseg
dirname, filename = os.path.split(os.path.abspath(__file__))
dirname = ''.join([dirname, '\\'])
# 写Excel
def write_excel(datalist, filename):
f = Workbook()
sheet1 = f.active
sheet1.title = 'sheet1'
totalRow = len(datalist)
print('共%s行数据' % totalRow)
Row1 = int(totalRow / 20)
for i in range(0, totalRow):
for j in range(0, len(datalist[i])):
try:
sheet1.cell(row=i + 1, column=j + 1, value=datalist[i][j]).alignment = Alignment(wrapText=True)
except:
print(datalist[i][j])
print(i, j)
if i % Row1 == 0:
bili = (i / totalRow) * 100
print('写入进度%.2f%%' % bili)
print('正在保存....')
f.save(os.path.join(dirname, filename))
print('保存完毕')
# 读取Excel
def read_excel(filename):
wb = load_workbook(os.path.join(dirname, filename))
# 获取所有工作表名
names = wb.sheetnames
sheet = wb[names[0]]
maxRow = sheet.max_row
maxColumn = sheet.max_column
datalist = []
for i in range(1, maxRow):
row = []
for j in range(1, maxColumn):
row.append(sheet.cell(row=i, column=j).value)
datalist.append(row)
return datalist
def jieba_words(sentence):
sentence_seged = jieba.posseg.cut(sentence.strip())
out_words = []
for x in sentence_seged:
out_words.append({'word': x.word, 'flag': x.flag})
return out_words
if __name__ == '__main__':
print('读取表一')
data1 = read_excel('省档案馆图书书目.xlsx')
print('读取表二')
data2 = read_excel('省情库.xlsx')
data3 = []
for row1 in data1:
suspected = []
is_full_match = False
print(row1[1])
for row2 in data2:
if(row1[1] == row2[0]):
row1.append('精确')
row1.append(row2[0])
data3.append(row1)
is_full_match = True
print('精确匹配')
break
out_words = jieba_words(row1[1])
is_suspected = True
for item in out_words:
flag = item['flag'][0:1]
if flag == 'n' or flag == 'm' or flag == 'v' or flag == 'l':
if row2[0].find(item['word']) == -1:
is_suspected = False
break
if is_suspected:
suspected.append(row2[0])
if is_full_match == False and len(suspected) > 0:
row1.append('疑似')
row1.append(';\n'.join(suspected))
data3.append(row1)
print('相似匹配')
elif is_full_match == False and len(suspected) == 0:
row1.append('')
row1.append('')
data3.append(row1)
print('未匹配')
write_excel(data3, '匹配结果.xlsx')
print('搞完了。。。')
分词中的词性介绍:
代码 | 词性 | 描述 |
---|---|---|
Ag | 形语素 | 形容词性语素。形容词代码为 a,语素代码g前面置以A。 |
a | 形容词 | 取英语形容词 adjective的第1个字母。 |
ad | 副形词 | 直接作状语的形容词。形容词代码 a和副词代码d并在一起。 |
an | 名形词 | 具有名词功能的形容词。形容词代码 a和名词代码n并在一起。 |
b | 区别词 | 取汉字“别”的声母。 |
c | 连词 | 取英语连词 conjunction的第1个字母。 |
dg | 副语素 | 副词性语素。副词代码为 d,语素代码g前面置以D。 |
d | 副词 | 取 adverb的第2个字母,因其第1个字母已用于形容词。 |
e | 叹词 | 取英语叹词 exclamation的第1个字母。 |
f | 方位词 | 取汉字“方” |
g | 语素 | 绝大多数语素都能作为合成词的“词根”,取汉字“根”的声母。 |
h | 前接成分 | 取英语 head的第1个字母。 |
i | 成语 | 取英语成语 idiom的第1个字母。 |
j | 简称略语 | 取汉字“简”的声母。 |
k | 后接成分 | |
l | 习用语 | 习用语尚未成为成语,有点“临时性”,取“临”的声母。 |
m | 数词 | 取英语 numeral的第3个字母,n,u已有他用。 |
Ng | 名语素 | 名词性语素。名词代码为 n,语素代码g前面置以N。 |
n | 名词 | 取英语名词 noun的第1个字母。 |
nr | 人名 | 名词代码 n和“人(ren)”的声母并在一起。 |
ns | 地名 | 名词代码 n和处所词代码s并在一起。 |
nt | 机构团体 | “团”的声母为 t,名词代码n和t并在一起。 |
nz | 其他专名 | “专”的声母的第 1个字母为z,名词代码n和z并在一起。 |
o | 拟声词 | 取英语拟声词 onomatopoeia的第1个字母。 |
p | 介词 | 取英语介词 prepositional的第1个字母。 |
q | 量词 | 取英语 quantity的第1个字母。 |
r | 代词 | 取英语代词 pronoun的第2个字母,因p已用于介词。 |
s | 处所词 | 取英语 space的第1个字母。 |
tg | 时语素 | 时间词性语素。时间词代码为 t,在语素的代码g前面置以T。 |
t | 时间词 | 取英语 time的第1个字母。 |
u | 助词 | 取英语助词 auxiliary |
vg | 动语素 | 动词性语素。动词代码为 v。在语素的代码g前面置以V。 |
v | 动词 | 取英语动词 verb的第一个字母。 |
vd | 副动词 | 直接作状语的动词。动词和副词的代码并在一起。 |
vn | 名动词 | 指具有名词功能的动词。动词和名词的代码并在一起。 |
w | 标点符号 | |
x | 非语素字 | 非语素字只是一个符号,字母 x通常用于代表未知数、符号。 |
y | 语气词 | 取汉字“语”的声母。 |
z | 状态词 | 取汉字“状”的声母的前一个字母。 |
un | 未知词 | 不可识别词及用户自定义词组。取英文Unkonwn首两个字母。(非北大标准,CSW分词中定义) |