将文本转换为矢量

时间:2018-07-25 07:33:09

标签: python python-3.x nlp text-processing information-retrieval

我有一本字典,里面有单词和每个单词的频率。

{'cxampphtdocsemployeesphp': 1,
'emptiness': 1, 
'encodingundefinedconversionerror': 1, 
'msbuildexe': 2,
'e5': 1, 
'lnk4049': 1,
'specifierqualifierlist': 2, .... }

现在,我想使用此字典创建一袋单词模型(我不想使用标准库和函数。我想使用算法来应用它。)

  1. 在字典中找到N个最流行的单词并对其进行编号。现在我们有了最流行单词的字典。
  2. 为词典中的每个标题创建一个零向量,尺寸等于N。
  3. 对于语料库中的每个文本,对字典中的单词进行迭代,并将对应的坐标增加1。

我有我要用于通过函数创建矢量的文本。

函数看起来像这样

def my_bag_of_words(text, words_to_index, dict_size):
"""
    text: a string
    dict_size: size of the dictionary

    return a vector which is a bag-of-words representation of 'text'
"""


 Let say we have N = 4 and the list of the most popular words is 

['hi', 'you', 'me', 'are']

Then we need to numerate them, for example, like this: 

{'hi': 0, 'you': 1, 'me': 2, 'are': 3}

And we have the text, which we want to transform to the vector:
'hi how are you'

For this text we create a corresponding zero vector 
[0, 0, 0, 0]

And iterate over all words, and if the word is in the dictionary, we increase the value of the corresponding position in the vector:
'hi':  [1, 0, 0, 0]
'how': [1, 0, 0, 0] # word 'how' is not in our dictionary
'are': [1, 0, 0, 1]
'you': [1, 1, 0, 1]

The resulting vector will be 
[1, 1, 0, 1]

任何应用此方法的帮助都会非常有帮助。我正在使用python进行实施。

谢谢

Neel

2 个答案:

答案 0 :(得分:2)

您需要首先针对每个单词的情况计算每个术语的语料频率,并将其保存在频率词典中。假设在您需要保留的主体中,樱桃碰巧发生了78次快乐–> 78 。然后对按照频率值降序排列的频率字典进行排序,然后保持前N对。

然后,为了进行枚举,您可以保留字典作为索引。例如,索引字典樱桃-> term2

现在,需要准备一个入射矩阵。它将是文档的向量,如下所示:

doc_id   term1 term2 term3 .... termN
doc1       35     0    23         1
doc2        0     0    13         2
   .        .     .     .         .
docM        3     1     2         0

语料库中的每个文档(文本,标题,句子)都需要具有ID或索引以及上面列出的内容。现在该为文档创建矢量了。遍历文档并通过对它们进行标记来获得术语,每个文档都有标记。遍历令牌,检查您的频率词典中是否存在下一个令牌。如果为true,请使用您的索引字典频率字典更新零向量。

让我们说doc5有樱桃,我们用我们的前N个流行词来表示。得到它的频率(它是78)和索引(它是term5)。现在更新doc5的零向量:

doc_id   term1 term2 term3 .... termN
doc1       35     0    23         1
doc2        0     0    13         2
   .        .     .     .         .
doc5        0    78     0         0 (under process)

您需要针对语料库中每个文档的所有常用术语针对每个令牌执行此操作。

最后,您将得到一个NxM矩阵,其中包含语料库中M个文档的向量。

我建议您看一下IR-Book。 https://nlp.stanford.edu/IR-book/information-retrieval-book.html

您可能会想像他们建议的那样,使用基于tf-idf的矩阵,而不是基于语料频率的术语发生率矩阵。

希望这篇文章对您有帮助,

欢呼

答案 1 :(得分:1)

我从头开始进行研究,也想分享我的答案!

我看起来像这样的数据已存储在列表中:

data_list = ['draw stacked dotplot r',
 'mysql select records datetime field less specified value',
 'terminate windows phone 81 app',
 'get current time specific country via jquery',
 'configuring tomcat use ssl',...]

展望未来,我计算了列表中每个单词的出现频率,

words_counts = {}                                                      
for text in data_list:
   for word in text.split():
      if word in words_counts:
        words_counts[word] += 1
      else:
        words_counts[word] = 1

由于这个原因,我的words_counts词典将把所有的单词都包含在我的data_list中以及它们的出现频率。 看起来像这样

 {'detailed': 6,
 'ole_handle': 1,
 'startmonitoringsignificantlocationchanges': 2,
 'pccf02102': 1,
 'insight': 2,
 'combinations': 26,
 'tuplel': 1}

现在,对于我们的my_bag_of_word函数,我需要对我的words_counts字典进行降序排序,并为每个单词分配索引。

index_to_word = sorted(words_counts.key(), key = lambda x:words_counts[x], reverse = True) 
words_to_index = {word:i for i,word in enimerate(index_to_words)}

现在我们的words_to_index看起来像这样:

  {'address': 387,
 'behind': 706,
 'page': 23,
 'inherited': 1617,
 '106': 4677,
 'posting': 1293,
 'expressions': 876,
 'occured': 3241,
 'highest': 2989}

现在终于可以使用我们创建的字典来获取文本的向量了,

def my_bag_of_words(text, words_to_index, size_of_dictionary):
   word_vector = np.zeros(size_of_dictionary)
   for word in text.split():
       if word in words_to_index:
          word_vector[words_to_index[word]] += 1
   return word_vector

这确实是学习和理解该概念的好方法。感谢大家的帮助和支持。

学习愉快

Neel