我最近一直在研究自然语言处理。我的目标是根据某些标准,对用罗马字母书写的多语言句子中的不同单词进行分类。因此,我需要一个分类器来实现这个目标。毫无疑问,有很多分类器可用。但由于我的特征是文本而非数值,而大多数分类器如支持向量机(SVM)需要数值特征作为输入,我寻找了一些方法来将我的文本特征转换为数值特征。虽然词袋模型结合术语频率和逆文档频率(TF-IDF)的概念是一种通用的方法,但我有一个名为“本地上下文”的文本特征,它的长度是固定的,我想知道是否可以不使用TF-IDF将其转换为数值特征。本地上下文特征指的是考虑前两个和后两个单词(这些单词构成了特定单词的上下文)。因此,我在寻找其他可能在这种情况下更有效的方法。我在Cross Validated上找到了一个类似的查询,但那是关于文档聚类的,而我想将单个单词分类到不同的类别中。我还在Quora上发现了一个未回答的类似问题。
为了达到我的目的,我希望将文本特征转换为数值特征,或者找到一个可以接受文本特征作为输入的分类器。有谁能帮我…
回答:
真正的问题是,我如何列举所有可能的输入?这是一种罕见的情况,真的“唯一真正的限制就是你的想象力”。但一个简单的办法是列出所有可能的排列,并为每个排列分配一个数字。
对于一个非常小的词汇表,你可以为词汇表中单词的所有可能排列分配一个数字。如果你的词汇是{‘bag’, ‘of’, ‘words’},你可以分配以下数字
1 bag of words2 bag words of3 of bag words4 of words bag5 words bag of6 words of bag
也许还需要再增加几个来处理空位。但对于一个大的词典,这显然是不现实的。或许你可以为每个单词分配一个数字标识符:
1 bag2 of3 words
然后你可以做类似于(1 * 100) + (2 * 10) + (1 * 3)的操作来获得排列“bag of words”的数字123。或者,如果你想强调上下文,可以分配二进制特征,并对中心单词应用一个乘数:
001 bag010 of100 words
这样可以得到(1 * 001) + (1000 * 010) + (1 * 100) = 010101 = 21,用于表示中心单词’of’,其前后分别是’bag’和’words’的上下文。
什么方法有意义取决于你的应用。很容易想出一些小众应用,其中可能有意义去计算字母b的出现次数,或者直接使用你感兴趣的度量作为标识符。