将文本转换为矢量

Transforming Text To Vector

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

{'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 进行实施。

谢谢,

尼尔

您需要首先计算每个术语的语料库频率,针对每个单词的情况,并将它们保存在频率词典中。假设 cherry 在你的语料库中恰好出现了 78 次 cheery --> 78 你需要保留。然后按频率值降序排列你的频率字典,然后保留前 N 对。

然后,对于您的枚举,您可以保留字典作为索引。例如,cherry --> term2 for index dictionary

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

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

语料库中的每个文档(文本、标题、句子)都需要有一个 id 或索引以及上面列出的。现在是为文档创建矢量的时候了。遍历您的文档并通过标记化它们来获取术语,每个文档都有标记。遍历标记,检查 频率字典 中是否存在下一个标记。如果为真,请使用 索引字典 频率字典 更新零向量。

假设 doc5 有 cherry 并且我们在前 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 的矩阵而不是他们提议的语料库 frequency-based 术语关联矩阵。

希望这 post 对您有所帮助,

干杯

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

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

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

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

快乐学习

尼尔