短文本评分方法 (Short Text Scoring Method)

短文本评分方法 (Short Text Scoring Method)

此方法是基于改进后的RAKE算法并结合word2vector,对短文本内容进行评分的一种方法。

RAKE的改进

原RAKE算法对划分后的短语打分机制存在一点问题,短语的长度对短语的得分影响大。也就是说,如果一个不重要的短语,但是它足够长,这个短语的分数就会高。这一点是存在较大问题的,针对这一点,对RAKE进行了以下改进。

  1. 一个短语的长度如果超过3,按照3计算;
  2. word_degree[word] += 1 / (word_list_length * 1.0),这一点改进主要意图还是减少短语长度对单个词得分的影响,所以将原来的 word_degree[word] += word_list_degree 改为上式,这样单个词得分只会因短语长度而缓慢增加;
  3. word_degree[item] = word_degree[item] 取消单个词频率的影响,提出一些不重要且重复的词对单词得分的影响。

以上3点是对RAKE的改进措施,这样做会让单个词得分更加合理。

word2vector模型

对于word2vector模型来说,目前采用的语料库是Wikipedia,但是Wikipedia原始语料有60G,需要将短文本所属类型的语料从Wikipedia中提取出来才能进行训练。以下是提取步骤(以technology类型为例):

  1. 在wikipedia中找到关于technology的相关类,爬取下来(见代码XXX.py),进行一定的格式处理;
  2. 在Wikipedia原始数据enwiki-latest-pages-articles.xml中找到含有technology的相关类的内容,这里存在的问题是,enwiki-latest-pages-articles.xml太大,一般读取方法会导致内存溢出,所以考虑的方法是分行读取Wikipedia原始数据内容,匹配到相关类后,将整篇内容保存下来(见代码XXX.py);
  3. 清洗相关语料(去停用词,特殊符号等);
  4. 训练模型。

word score

方法一:将词利用word2vector进行扩展(expand_word_score)

  1. 将数据集D利用RAKE算法进行划分,得到很多个单词,我们这些单词称为 RAKE_words.

  2. 将RAKE_words输入进word2vector模型找到它们simword,然后将所有的simword合并为一个list,称为simwords_list = [simword1, simword2, simword3, simword4, …]

  3. 找到RAKE_words中的词,称为 post_word_list = [postword1, postword2, …].

  4. 将 post_word_list 中的词和 simwords_list 词分别放入word2vector模型中,输出两辆词之间的相似度。这里的相似度和步骤2中的相似度有所区别,步骤2中相似度是指寻找相似词时的相似度,可以理解为一个分数,我们把这个可以称为 sim_score, 而这里的相似度指的是在通过word embeding后,两个词之间的相似程度, 我们可以称为 word_similarity.

  5. 设定一个阈值为t,当 simwordX 与 postwordX 的 word_similarity > t时,将simwordX 与 postwordX这两个词同时放到一个list中去, 最后在list中统计出 simwordX 与 postwordX 的频率,作为他们的word_score, 当t不同时,每个词的word_score也对应不同。

  6. t 取 0.9, 0.8, …, 0.1 , weight_score = sum( word_score(t) * function(t) )
    其中,word_score(t)指的是当t时的word_score, function(t)指的是权函数。权函数的意义在于,将阈值(或相似度等)大的更大,小的更小,大小之间的区分度更大。

  7. 考虑词性的影响,名词权重为0.7, 动词权重为0.3,这里没有考虑其他词性。

    if word == N:
        final_score = weight_score * 0.7
    elif word == V:
        final_score = weight_score * 0.3
    else:
        pass
    return final_score
    

方法二:不对词进行扩展 (not_expand_word_score)

1.将方法一中步骤2中的simwords_list, post_word_list。 即用post_word_list中两两词,放入模型中进行相似度计算,可以得到word_similarity。
2. 剩下步骤和方法一中的 步骤5 6 7相同。

算法的变形

方法一的变形 (expand_sim_weight_word_score)

方法一步骤4之后变为:

for w in post_word_list:
    score[w] = 0
    for x in simwords_list:
        score[w] += function(word_similarity(w, x))

if word == N:
        final_sore[word] = score[word] * 0.7
elif word == V:
        final_sore[word] = score[word] * 0.3
else:
    pass

return final_score
方法二的变形(not_expand_sim_weight_word_score)

方法二
for w in post_word_list:
score[w] = 0
for x in post_word_list and x != w:
score[w] += function(word_similarity(w, x))

if word == N:
    final_sore[word] = score[word] * 0.7    
elif word == V:
        final_sore[word] = score[word] * 0.3
else:
    pass

return final_score

短文本分数

在fina_score中的word_score,利用正则匹配的方法,将匹配到的词相加,得到一条短文本的分数。

你可能感兴趣的:(python,机器学习,自然语言处理)