NLP

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mmm305658979/article/details/81129352

one hot code: 独热码,有多少个状态就有多少个向量。因为假如某个特征有三种状态,由于特征值会影响训练,因此用0,1,2来代表三种状态是不合适的。

 

 

内容排名推荐:

Feed流推荐,相关推荐,TopN推荐,个性化推送

https://blog.csdn.net/qq_40027052/article/details/78579587?reload

http://www.woshipm.com/pd/773523.html

https://www.jianshu.com/p/44bee121463a

隐马尔科夫模型(HMM) https://www.cnblogs.com/pinard/p/6945257.html

NLP语言模型  https://www.cnblogs.com/taojake-ML/p/6413715.html

 

 

哈希表:散列表,给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。

设置散列地址的方法:

1. 直接寻址法:取关键字或关键字的某个线性函数值为散列地址。即H(key)=key或H(key) = a·key + b,其中a和b为常数(这种散列函数叫做自身函数)。若其中H(key)中已经有值了,就往下一个找,直到H(key)中没有值了,就放进去。
2. 数字分析法:分析一组数据,比如一组员工的出生年月日,这时我们发现出生年月日的前几位数字大体相同,这样的话,出现冲突的几率就会很大,但是我们发现年月日的后几位表示月份和具体日期的数字差别很大,如果用后面的数字来构成散列地址,则冲突的几率会明显降低。因此数字分析法就是找出数字的规律,尽可能利用这些数据来构造冲突几率较低的散列地址。
3. 平方取中法:当无法确定关键字中哪几位分布较均匀时,可以先求出关键字的平方值,然后按需要取平方值的中间几位作为哈希地址。这是因为:平方后中间几位和关键字中每一位都相关,故不同关键字会以较高的概率产生不同的哈希地址。 

4. 折叠法:将关键字分割成位数相同的几部分,最后一部分位数可以不同,然后取这几部分的叠加和(去除进位)作为散列地址。数位叠加可以有移位叠加和间界叠加两种方法。移位叠加是将分割后的每一部分的最低位对齐,然后相加;间界叠加是从一端向另一端沿分割界来回折叠,然后对齐相加。
5. 随机数法:选择一随机函数,取关键字的随机值作为散列地址,通常用于关键字长度不同的场合。
6. 除留余数法:取关键字被某个不大于散列表表长m的数p除后所得的余数为散列地址。即 H(key) = key MOD p,p<=m。不仅可以对关键字直接取模,也可在折叠、平方取中等运算之后取模。对p的选择很重要,一般取素数或m,若p选的不好,容易产生同义词。

冲突时: 开放寻址法,计算出有冲突时往后找到空位。 再散列法,再设定一个函数,产生冲突时计算 另一个函数。 

 

TF-IDF(Term Frequency-Inverse Document Frequency, 词频-逆文件频率)。 一个词在当前文件出现频率越高且在所有文件出现频率越低,则越能代表该文件。 另一种方法是TextRank。

 

分词工具(jieba):

# coding: utf-8

https://github.com/fxsjy/jieba/blob/master/README.md

# ###jieba特性介绍

# 支持三种分词模式:

# 精确模式,试图将句子最精确地切开,适合文本分析;

# 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;

# 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。

# 支持繁体分词。

# 支持自定义词典。

# MIT 授权协议。

 

# #一、 第一部分

 

# ##Part 1. 分词

 

# jieba.cut 方法接受三个输入参数: 需要分词的字符串;cut_all 参数用来控制是否采用全模式;HMM 参数用来控制是否使用 HMM 模型。

# jieba.cut_for_search 方法接受两个参数:需要分词的字符串;是否使用 HMM 模型。该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细。

# 待分词的字符串可以是 unicode 或 UTF-8 字符串、GBK 字符串。注意:不建议直接输入 GBK 字符串,可能无法预料地错误解码成 UTF-8。

# jieba.cut 以及 jieba.cut_for_search 返回的结构都是一个可迭代的 generator,可以使用 for 循环来获得分词后得到的每一个词语(unicode),或者用

# jieba.lcut 以及 jieba.lcut_for_search 直接返回 list。

# jieba.Tokenizer(dictionary=DEFAULT_DICT) 新建自定义分词器,可用于同时使用不同词典。jieba.dt 为默认分词器,所有全局分词相关函数都是该分词器的映射。

 

倒排索引: 因为根据属性值确定记录的位置。

 

# In[1]:

 

import jieba

seg_list = jieba.cut("我来到北京清华大学", cut_all=True)

print("Full Mode: " + "/ ".join(seg_list))  # 全模式

seg_list = jieba.cut("我来到北京清华大学", cut_all = False)

print("Precise Mode: " + "/".join(seg_list))  #精确模式,默认状态下也是精确模式

seg_list = jieba.cut("他来到网易杭研大厦。")

print("Default Mode: " + "/".join(seg_list))

seg_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所,后在日本京都大学深造。")  #搜索引擎模式

print("Search Mode: " + "/".join(seg_list))

 

 

# ##Part 2. 添加自定义词典

 

# ###载入词典

# 开发者可以指定自己自定义的词典,以便包含 jieba 词库里没有的词。虽然 jieba 有新词识别能力,但是自行添加新词可以保证更高的正确率。

# 用法: jieba.load_userdict(file_name) # file_name 为自定义词典的路径。

# 词典格式和dict.txt一样,一个词占一行;每一行分三部分,一部分为词语,另一部分为词频(可省略),最后为词性(可省略),用空格隔开。

# 词频可省略,使用计算出的能保证分出该词的词频。

# 更改分词器的 tmp_dir 和 cache_file 属性,可指定缓存文件位置,用于受限的文件系统。

 

seg_list = jieba.cut("李小福是创新办主任也是云计算方面的专家。")

print("Origin: " + "/".join(seg_list))

jieba.load_userdict("C:\\Users\\Luo Chen\\Desktop\\lixiaofu.txt")

seg_list = jieba.cut("李小福是创新办主任也是云计算方面的专家。")

print("Revise: " + "/".join(seg_list))

 

 

# ###调整词典

 

# 使用 add_word(word, freq=None, tag=None) 和 del_word(word) 可在程序中动态修改词典。

# 使用 suggest_freq(segment, tune=True) 可调节单个词语的词频,使其能(或不能)被分出来。

# 注意:自动计算的词频在使用 HMM 新词发现功能时可能无效。

 

# In[7]:

>>> print('/'.join(jieba.cut('如果放到post中将出错。', HMM=False)))
如果/放到/post/中将/出错/。
>>> jieba.suggest_freq(('中', '将'), True) #jieba.suggest_freq(("中", "将"), tune = True)
494
>>> print('/'.join(jieba.cut('如果放到post中将出错。', HMM=False)))
如果/放到/post/中/将/出错/。

>>> print('/'.join(jieba.cut('「台中」正确应该不会被切开', HMM=False)))
「/台/中/」/正确/应该/不会/被/切开
>>> jieba.suggest_freq('台中', True)
69
>>> print('/'.join(jieba.cut('「台中」正确应该不会被切开', HMM=False)))
「/台中/」/正确/应该/不会/被/切开

 

# ##Part 3. 词性标注

 

# jieba.posseg.POSTokenizer(tokenizer=None) 新建自定义分词器,tokenizer 参数可指定内部使用的 jieba.Tokenizer 分词器。jieba.posseg.dt 为默认词性标注分词器。

# 标注句子分词后每个词的词性,采用和 ictclas 兼容的标记法。

 

# In[22]:

 

import jieba.posseg as pseg

words = pseg.cut("我爱北京天安门。")

for w in words:

    print("%s %s" %(w.word, w.flag))

 

 

# ##Part 4. 关键词提取

 

# ###基于 TF-IDF 算法的关键词提取

 

# import jieba.analyse

# jieba.analyse.extract_tags(sentence, topK = 20, withWeight = False, allowPOS = ())

# sentence:待提取的文本。

# topK:返回几个 TF/IDF 权重最大的关键词,默认值为20。

# withWeight:是否一并返回关键词权重值,默认值为False。

# allowPOS:仅包括指定词性的词,默认值为空,即不进行筛选。

# jieba.analyse.TFIDF(idf_path=None) 新建 TFIDF 实例,idf_path 为 IDF 频率文件。

 

# optparse模块OptionParser学习

# optparse是专门在命令行添加选项的一个模块。

 

# In[2]:

 

from optparse import OptionParser

MSG_USAGE = "myprog[ -f ][-s ] arg1[,arg2..]"

optParser = OptionParser(MSG_USAGE)

#以上,产生一个OptionParser的物件optParser。传入的值MSG_USAGE可被调用打印命令时显示出来。

 

optParser.add_option("-f","--file",action = "store",type="string",dest = "fileName")

optParser.add_option("-v","--vison", action="store_false", dest="verbose",default='gggggg',

                     help="make lots of noise [default]")

#调用OptionParser.add_option()添加选项,add_option()参数说明:

#action:存储方式,分为三种store, store_false, store_true

#type:类型

#dest:存储的变量

#default:默认值

#help:帮助信息

 

fakeArgs = ['-f','file.txt','-v','good luck to you', 'arg2', 'arge']

options, args = optParser.parse_args(fakeArgs)

print options.fileName

print options.verbose

print options

print args

#调用OptionParser.parse_args()剖析并返回一个directory和一个list

#parse_args()说明:

#如果没有传入参数,parse_args会默认将sys.argv[1:]的值作为默认参数。这里我们将fakeArgs模拟输入的值。

#从返回结果中可以看到,

#options为是一个directory,它的内容fakeArgs为“参数/值 ”的键值对。

#args 是一个list,它的内容是fakeargs除去options后,剩余的输入内容。

#options.version和options.fileName都取到与options中的directory的值。

 

print optParser.print_help()

#输出帮助信息

#optParser.print_help()说明:

#1、最开始的的MSG_USAGE的值:在这个地方显示出来了。

#2、自动添加了-h这个参数。

 

 

# In[14]:

 

import jieba.analyse as anl

f = open("C:\\Users\\Luo Chen\\Desktop\\demo.txt", "r").read()

seg = anl.extract_tags(f, topK = 20, withWeight = True)

for tag, weight in seg:

    print "%s %s" %(tag, weight)

 

 

# 关键词提取所使用逆向文件频率(IDF)文本语料库可以切换成自定义语料库的路径。

# jieba.analyse.set_idf_path(file_name) #file_name为自定义语料库的路径

# 如:jieba.analyse.set_idf_path("../extra_dict/idf.txt.big")

# .big文件一般是游戏中的文件,比较常见的用途是装载游戏的音乐、声音等文件。

# 关键词提取所使用停用词(Stop Words)文本语料库可以切换成自定义语料库的路径。

# jieba.analyse.set_stop_words(file_name) #file_name为自定义语料库的路径。

# 如:jieba.analyse.set_stop_words("../extra_dict/stop_words.txt")

 

# ###基于 TextRank 算法的关键词提取

 

# 基本思想:

# 将待抽取关键词的文本进行分词;

# 以固定窗口大小(默认为5,通过span属性调整),词之间的共现关系,构建图;

# 计算图中节点的PageRank,注意是无向带权图。

# jieba.analyse.textrank(sentence, topK = 20, withWeight = False, allowPOS = ('ns', 'n', 'v', 'nv')) 注意默认过滤词性。

# jieba.analyse.TextRank() 新建自定义TextRank实例。

 

# In[16]:

 

s = "此外,公司拟对全资子公司吉林欧亚置业有限公司增资4.3亿元,增资后,吉林欧亚置业注册资本由7000万元增加到5亿元。吉林欧亚置业主要经营范围为房地产开发及百货零售等业务。目前在建吉林欧亚城市商业综合体项目。2013年,实现营业收入0万元,实现净利润-139.13万元。"

for x, w in jieba.analyse.textrank(s, topK = 5, withWeight = True):

    print("%s %s" % (x, w))

 

 

# ##Part 5. 并行分词(多进程分词)

 

# 原理:将目标文本按行分隔后,把各行文本分配到多个 Python 进程并行分词,然后归并结果,从而获得分词速度的可观提升。

# 基于 python 自带的 multiprocessing 模块,目前暂不支持 Windows。

# 用法:

# jieba.enable_parallel(4) # 开启并行分词模式,参数为并行进程数

# jieba.disable_parallel() # 关闭并行分词模式

# 实验结果:在 4 核 3.4GHz Linux 机器上,对金庸全集进行精确分词,获得了 1MB/s 的速度,是单进程版的 3.3 倍。

# 注意:并行分词仅支持默认分词器 jieba.dt 和 jieba.posseg.dt。

 

# ##Part 6. Tokenize: 返回词语在原文的起止位置

 

# 注意:输入参数只接受 unicode

# 两种模式:默认模式、搜索模式。

 

# ###默认模式

 

# In[19]:

 

result = jieba.tokenize(u"永和服装饰品有限公司")

for tk in result:

    print("%s \t start at: %d \t end at: %d" %(tk[0], tk[1], tk[2]))

 

 

# ###搜索模式

# 把句子中所有的可以成词的词语都扫描出来并确定位置。

 

# In[20]:

 

result = jieba.tokenize(u"永和服装饰品有限公司", mode = "search")

for tk in result:

    print("%s \t start at: %d \t end at: %d" % (tk[0], tk[1], tk[2]))

 

 

# ##Part 7. 延迟加载机制

# jieba 采用延迟加载,import jieba 和 jieba.Tokenizer() 不会立即触发词典的加载,一旦有必要才开始加载词典构建前缀字典。如果你想手工初始 jieba,也可以手动初始化。

# import jieba

# jieba.initialize()  #手动初始化(可选)

 

# 在 0.28 之前的版本是不能指定主词典的路径的,有了延迟加载机制后,你可以改变主词典的路径:

# jieba.set_dictionary("data/dict.txt.big")

# 也可以下载你所需要的词典,然后覆盖jieba/dict.txt即可。

 

# #二、 第二部分

 

# ##Part 1. 词频统计、降序排序

 

# In[21]:

 

article = open("C:\\Users\\Luo Chen\\Desktop\\demo_long.txt", "r").read()

words = jieba.cut(article, cut_all = False)

word_freq = {}

for word in words:

    if word in word_freq:

        word_freq[word] += 1

    else:

        word_freq[word] = 1

 

freq_word = []

for word, freq in word_freq.items():

    freq_word.append((word, freq))

freq_word.sort(key = lambda x: x[1], reverse = True)

 

max_number = int(raw_input(u"需要前多少位高频词? "))

 

for word, freq in freq_word[: max_number]:

    print word, freq

 

 

# ##Part 2. 人工去停用词

 

# 标点符号、虚词、连词不在统计范围内。

 

# In[22]:

 

stopwords = []

for word in open("C:\\Users\\Luo Chen\\Desktop\\stop_words.txt", "r"):

    stopwords.append(word.strip())

article = open("C:\\Users\\Luo Chen\\Desktop\\demo_long.txt", "r").read()

words = jieba.cut(article, cut_all = False)

stayed_line = ""

for word in words:

    if word.encode("utf-8") not in stopwords:

        stayed_line += word + " "

print stayed_line

 

 

# ##Part 3. 合并同义词

 

# 将同义词列举出来,按下Tab键分隔,把第一个词作为需要显示的词语,后面的词语作为要替代的同义词,一系列同义词放在一行。

# 这里,“北京”、“首都”、“京城”、“北平城”、“故都”为同义词。

 

# In[24]:

 

combine_dict = {}

 

for line in open("C:\\Users\\Luo Chen\\Desktop\\tongyici.txt", "r"):

    seperate_word = line.strip().split("\t")

    num = len(seperate_word)

    for i in range(1, num):

        combine_dict[seperate_word[i]] = seperate_word[0]

 

jieba.suggest_freq("北平城", tune = True)

seg_list = jieba.cut("北京是中国的首都,京城的景色非常优美,就像当年的北平城,我爱这故都的一草一木。", cut_all = False)

f = ",".join(seg_list)

result = open("C:\\Users\\Luo Chen\\Desktop\\output.txt", "w")

result.write(f.encode("utf-8"))

result.close()

 

for line in open("C:\\Users\\Luo Chen\\Desktop\\output.txt", "r"):

    line_1 = line.split(",")

 

final_sentence = ""

for word in line_1:

    if word in combine_dict:

        word = combine_dict[word]

        final_sentence += word

    else:

        final_sentence += word

print final_sentence

 

 

# ##Part 4. 词语提及率

 

# 主要步骤:分词——过滤停用词(略)——替代同义词——计算词语在文本中出现的概率。

 

# In[31]:

 

origin = open("C:\\Users\\Luo Chen\\Desktop\\tijilv.txt", "r").read()

jieba.suggest_freq("晨妈妈", tune = True)

jieba.suggest_freq("大黑牛", tune = True)

jieba.suggest_freq("能力者", tune = True)

seg_list = jieba.cut(origin, cut_all = False)

f = ",".join(seg_list)

 

output_1 = open("C:\\Users\\Luo Chen\\Desktop\\output_1.txt", "w")

output_1.write(f.encode("utf-8"))

output_1.close()

 

combine_dict = {}

for w in open("C:\\Users\\Luo Chen\\Desktop\\tongyici.txt", "r"):

    w_1 = w.strip().split("\t")

    num = len(w_1)

    for i in range(0, num):

        combine_dict[w_1[i]] = w_1[0]

 

seg_list_2 = ""

for i in open("C:\\Users\\Luo Chen\\Desktop\\output_1.txt", "r"):

    i_1 = i.split(",")

    for word in i_1:

        if word in combine_dict:

            word = combine_dict[word]

            seg_list_2 += word

        else:

            seg_list_2 += word

print seg_list_2

 

 

# In[35]:

 

freq_word = {}

seg_list_3 = jieba.cut(seg_list_2, cut_all = False)

for word in seg_list_3:

    if word in freq_word:

        freq_word[word] += 1

    else:

        freq_word[word] = 1

 

freq_word_1 = []

for word, freq in freq_word.items():

    freq_word_1.append((word, freq))

freq_word_1.sort(key = lambda x: x[1], reverse = True)

for word, freq in freq_word_1:

    print word, freq

 

total_freq = 0

for i in freq_word_1:

    total_freq += i[1]

 

for word, freq in freq_word.items():

    freq = float(freq) / float(total_freq)

    print word, freq

 

 

# ##Part 5. 按词性提取

 

# In[36]

import jieba.posseg as pseg

word = pseg.cut("李晨好帅,又能力超强,是“大黑牛”,也是一个能力者,还是队里贴心的晨妈妈。")

for w in word:

    if w.flag in ["n", "v", "x"]:

        print w.word, w.flag

 

内容排名推荐:

Feed流推荐,相关推荐,TopN推荐,个性化推送

https://blog.csdn.net/qq_40027052/article/details/78579587?reload

http://www.woshipm.com/pd/773523.html

https://www.jianshu.com/p/44bee121463a

TopN推荐:

(1) 基于用户投票的排名算法(一):Delicious和Hacker News 2012.02.24

(2) 基于用户投票的排名算法(二):Reddit 2012.03.07

(3) 基于用户投票的排名算法(三):Stack Overflow 2012.03.11

(4) 基于用户投票的排名算法(四):牛顿冷却定律 2012.03.16

(5) 基于用户投票的排名算法(五):威尔逊区间 2012.03.20

(6) 基于用户投票的排名算法(六):贝叶斯平均 2012.03.28

 

理解:

差评不一定是负影响;

掌握时间衰减对文章评分影响的度;

新文章的冷启动可以用分开”最新榜”和“最热榜”或参考贝叶斯平均来解决;

置信区间确实能解决小样本数据问题,即小样本即使赞同比率要和大样本相同但是也应排名比之靠后;

多个维度时,权重可以通过回归获得,根据人工定义的热度值和各属性值。

展开阅读全文

没有更多推荐了,返回首页