山东大学2018级项目实训 2021 7-1

山东大学2018级项目实训 2021 7-1

时间:2021年7月1日-7月2日
项目题目:基于关键词的语义泛化系统

1.组内分工

由于我们小组只有一个功能(查找、计算关键词的同义词)需要完成,于是我们就按照两两分工的方式。
我被分配的工作是打开15.5g的语料库,将其转化成二进制文件,词典文件以及向量文件。

2.具体工作以及遇到的问题

1,由于文件过大,只能选择浏览器可以打开
2,将文件转化,转化代码:

#!/usr/bin/env python3
#coding:utf-8

__author__ = 'xmxoxo<xmxoxo@qq.com>'

# TX中文词向量数据处理
import os
import sys
import numpy as np
import argparse

#import gensim
#from gensim.models import KeyedVectors


'''
数据转换,把向量库转存为单独的文件分别保存
词典文件 keywords.txt 和
向量文件 vector.npy
'''
def datprocess(filename, encoding='utf-8', outpath='./', dofilter=0, topn=0):
    try:
        i, f, total = 0, 0, 0
        chars, vectors = [], []
        print('开始转换向量,请稍等...')

        for line in open(filename, "r", encoding=encoding):
            i += 1
            # 跳过第1行
            if i==1:
                total = int(line.split(' ')[0])
                print('总记录数:%d' % total)
                continue;
            
            x = line.split(' ')
            # -----------------------------------------
            # 在这里对词语进行过滤
            if dofilter:
                if wordfilter(x[0]):
                    f +=1 # 记录被过滤掉多少行
                    #print('\n第%d行,被过滤:%s' % (i, x[0]))
                    continue;
            # -----------------------------------------
            
            chars.append(x[0])
            v = [float(i) for i in x[1:]]
            vectors.append(v)
            if i % 500:
                print('\r[进度:%5.2f%% 已过滤:%5d] 第%-7d行: %-20s' % ((i*100/total), f, i, x[0][:18]) , end='' )
            #print(x[0], v[:10])
            if topn>0:
                if i >= topn:break;

        # 自动创建目录
        if not os.path.exists(outpath):
            os.mkdir(outpath)
        
        print()
        # 保存字典
        print('正在保存字典文件...')
        savetofile('\n'.join(chars), os.path.join(outpath, 'keywords.txt'))
        # 保存向量
        print('正在保存向量文件...')
        np.save(os.path.join(outpath, 'vector.npy'), np.array(vectors))
        print('转换完成, 处理%d行,过滤%d行,输出%d行。' % (i, f, i-f) )
    
    except Exception as e:
        print(e)
        return None

# 读入文件
def readtxtfile(fname, encoding='utf-8'):
    try:
        with open(fname, 'r', encoding=encoding) as f:  
            data=f.read()
        return data
    except Exception as e:
        return ''
    

# 保存文本信息到文件
def savetofile(txt, filename, encoding='utf-8'):
    pass
    try:
        with open(filename,'w', encoding=encoding) as f:  
            f.write(str(txt))
        return 1
    except :
        return 0

# 词典数据分析
def key_analyze ():
    # 加载数据
    filename = 'keywords.txt'
    #txt = readtxtfile(filename)
    dat = readtxtfile(filename).splitlines()
    # 计算长度
    #lstLength = [len(x) fo r x in dat]
    lstLength = map(len, dat)


# 按字典进行批量替换
def replace_dict (txt, dictKey, isreg=0):
    import re
    for k,v in dictKey.items():
        if isreg:
            txt = re.sub(k, v, txt)
        else:
            txt = txt.replace(k,v)
    return txt

# 正则表达式批量判断
# TF=0 表示任意一个不匹配就返回 True
# TF=1 表示任意一个匹配了就返回 True
def IsMatch (txt, lstKey, tf=1):
    import re
    r = None
    ret = False
    for k in lstKey:
        r = re.match(k,txt, re.U|re.I)
        # bool(r) = True 表示不匹配
        #if bool(r) != tf: 
        #if (tf & (not bool(r))) or (not tf and bool(r)):
        if (tf==1 and r!=None) or (tf==0 and r==None):
            ret = True
            break
    return ret

# 过滤
def wordfilter (txt):
    '''
    以下过滤:
	* 纯数字
	* 带英文标点符号,且长度大于1的
		标点: [,;&:]
	* 重复3个以上
		例如:好好好, 天天天, 的的的
	* 纯英文
    * 英文字母+英文标点
    * 中文标点: [。,、“”?!:.()~?-……)(/]
    '''
    lstKey = [
            r'^\d+$',               # 纯数字
            r'^.+[\-\.,;&:\'].*$',      # 带英文标点符号,且长度大于1的
            r'^(.)\1{2,}$',           # 重复3个以上
            r'^([a-z])+$',                # 纯英文字母
            r'^([a-z])[a-z\-\.,;&:]+$',   # 英文字母+英文标点
            r'^.+[。、“”?!:()~\?\-……)(/].*$', # 带中文标点的
            ]
    ret = IsMatch(txt, lstKey, tf=1)

    return ret


def test ():
    '''
    '''
    t = '涉及到哪些'
    t = '23434'
    t = 'strong'
    t = 'jadfjdk-,1'

    k = [r'^\d+$']
    #print(IsMatch(t, k, tf=1))
    #print(IsMatch(t, k, tf=0))

    print(wordfilter(t))
    
def main ():
    pass
    deffile='C:\keyword\Tencent_AILab_ChineseEmbedding.txt'
    parser = argparse.ArgumentParser(description='腾讯词向量提取工具')
    parser.add_argument('-datfile', default=deffile, type=str, help='数据文件名')
    parser.add_argument('-outpath', default='C:\keyword', type=str, help='输出目录')
    parser.add_argument('-dofilter', default=0, type=int, help='是否过滤非中文,默认=0不过滤')
    parser.add_argument('-topn', default=0, type=int, help='截取前N个向量,默认=0不截取')
    args = parser.parse_args()
    datfile = args.datfile
    outpath = args.outpath
    dofilter = args.dofilter
    topn = args.topn
    print('运行参数:', args)

    datprocess(filename=datfile, outpath=outpath, dofilter=dofilter, topn=topn)
    

if __name__ == '__main__':
    pass
    main()

3,运行代码,由于读入文件过大,电脑内存为16g,将文件读入内存,最后会导致内存不够,无法将该文件完全转化。
报错:pycharm There is not enough memory to perform the requested operation.Please increase Xmx’ setting and restart the IDE for change to take effect.
4,小组讨论 外加网上查找相关解决方案,最后决定采用增多过滤条件和分布式存储的方法进行解决。
5,接下来的任务就是实现过滤和分布式存储两条路。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值