使用 Python 将唯一单词列表向量化为 0 或 1

Vectorizing LIst of Unique Words into 0 or 1 using Python

我对 Python 还很陌生,最近不得不进行一些文本处理,以计算两个文本之间的余弦相似度。

我目前能够对文本进行基本的预处理,例如将它们小写、标记文本、删除停用词以及使用 NLTK 库提取这些词。现在,我能够从我得到的所有文本文件中创建一个独特的单词列表。

那么现在,在我创建的这个唯一单词列表中,只有某些单词我想根据我拥有的文本文件将其矢量化为 1(其余为 0)。

因此,例如,在对唯一单词列表进行矢量化后,它应该如下所示:

awesome| best | carry | elephant | fly | home | irresponsible | implicit 
1      | 1    | 0     | 0        | 0   | 1    | 0             | 0

我已经尝试使用谷歌搜索并在此处查看堆栈溢出,但似乎常见的解决方案之一是使用 scikit learn - 转换列表时的特征提取。但是,我只想要 0 或 1...并且 1 应该由文本文件指定。

例如,有一个文本文件(在将其全部矢量化为 1 之后)我想计算与该词典的相似度...所以它应该如下所示:

Text_to_Compare.txt

awesome | fly | implicit
1       | 1   | 1

然后,我会将 "Text_to_Compare.txt" 与唯一单词列表进行比较并计算相似度结果。

谁能指导我如何继续将唯一单词列表向量化为 0 或 1,并将 "Text_to_Compare.txt" 向量化为所有 1?

谢谢!

这是你想做的吗?

text_file = ['hello','world','testing']
term_dict = {'some':0, 'word':0, 'world':0}

for word in text_file:
    if word in term_dict:
        term_dict[word] = 1

如果您已标记文件(Python 中的.split() 方法),那么它们将在列表中可用。假设您已经对字典和 text_file 中的每个术语(降低、词干、去除标点符号等)进行了规范化,那么上面的代码应该可以工作。只需将你的字典中的所有值设置为 0,然后循环你的文件,检查单词是否是 indict。如果是,则将该值设置为 1。

以下是生成值设置为 0 的字典的方法:

new_dict = {word:0 for word in text_file}

这是一个dictionary comprehension。再次注意,我的代码假定您正在对所有术语进行规范化——比较苹果与苹果——这在处理文本时始终是关键。

最终编辑。如果您有两个唯一术语列表(在标记化和规范化之后)

def normalize(term):
    #do stuff -- i.e., lower; stem; strip punctuation; etc.
    pass
word_list_one = [normalize(word) for word in text_doc.split()]
word_list_two = [normalize(word) for word in other_text_doc.split()]

# if you know the longest of your lists, then you can create a dictionary of ones and zeros from the two lists.
word_dict = dict([(word,1) if word in word_list_one else (word,0) for word in word_list_two])
# that's it.  in the above code, word_list_two should be the longer of your two lists (assuming I understand your code properly)
# Note: someone with more python experience could definitely improve my code.  I just wanted show you another option.

请告诉我这是否适合您。希望对您有所帮助!