python:如何在scikit学习分类器(SVM)等中使用POS(词性)功能

时间:2014-06-02 20:13:01

标签: python machine-learning scikit-learn nltk

我想使用从nltk.pos_tag返回的词性(POS)作为sklearn分类器,如何将它们转换为vector并使用它? e.g。

sent ="这是POS示例"

TOK = nltk.tokenize.word_tokenize(发送) POS = nltk.pos_tag(TOK) print(pos)

返回以下内容 [('此' DT'),(''' VBZ'),' POS' ,' NNP'),('示例',' NN')]

现在我无法应用任何矢量化器(来自scikitlearn的DictVectorizer或FeatureHasher,CountVectorizer在分类器中使用

请建议

4 个答案:

答案 0 :(得分:9)

如果我理解你的话,这有点棘手。一旦你标记它,你的句子(或文档,或其他)不再由单词组成,而是由对(单词+标签)组成,并且不清楚如何从中创建最有用的标量向量。 / p>

大多数文本矢量化程序都会像计算每个词汇项目出现的次数,然后为每个词汇项目制作一个功能一样:

 the: 4, player: 1, bats: 1, well: 2, today: 3,...

下一份文件可能包含:

 the: 0, quick:5, flying:3, bats:1, caught:1, bugs:2

两者都可以存储为整数数组,只要你总是将相同的键放在同一个数组元素中(大多数文档都会有很多零) - 或者作为dict。因此,矢量化器会为许多“文档”执行此操作,然后对此进行处理。

因此,您的问题归结为如何将对列表转换为向量引擎可以计算的项目的平面列表。

最简单的方法是将数据展平为

('This', 'POS_DT', 'is', 'POS_VBZ', 'POS', 'POS_NNP', 'example', 'POS_NN')

通常的计数将获得8个词汇项的向量,每个词项发生一次。我重命名了标签,以确保他们不会与文字混淆。

这会让你起步并运行,但它可能不会取得多大成就。这是因为只知道样本中每个词性的出现次数可能无法告诉你你需要什么 - 请注意,在向量化器计算之后,哪些词性与哪些词的消失有关。

如果你试图区分类似风格的东西,运行分类器可能有一些价值 - 小说可能有更多的形容词,实验室报告可能有更少的专有名称(可能),等等。

相反,您可以将数据更改为

('This_DT', 'is_VBZ', 'POS_NNP', 'example_NN')

这使得每个标签与其所属的单词“绑定”,所以现在这些向量将能够区分“bat”用作动词的样本,以及仅用作名词的样本。这会告诉你略有不同的东西 - 例如,作为动词的“蝙蝠”更可能出现在关于棒球的文本中,而不是关于动物园的文本中。

你还可以做很多其他的安排。

要在自然语言文本中使用矢量方法获得良好的结果,您可能需要对想要矢量化器生成和使用的功能进行大量思考(和测试)。这在很大程度上取决于你最终想要完成的事情。

希望有所帮助。

答案 1 :(得分:3)

关于合并单词及其诸如“单词/标签”之类的标签的操作,您可以将新的语料库馈送到对单词(TF-IDF或袋装单词)进行计数的矢量化器,然后为每个单词赋予功能:

    wpt = nltk.WordPunctTokenizer()
    text = wpt.tokenize('Someone should have this ring to a volcano')
    text_tagged = nltk.pos_tag(text)
    new_text = []
    for word in text_tagged:
      new_text.append(word[0] + "/" + word[1])

    doc = ' '.join(new_text)

此输出为

   Someone/NN should/MD have/VB this/DT piece/NN of/IN shit/NN to/TO a/DT volcano/NN

答案 2 :(得分:1)

我知道这有点晚了,但要在这里添加一个答案。

根据您需要的功能,您需要以有意义的方式对POST进行编码。当我将原始句子粘贴到POST语句时,我使用ngrams进行SVM分类时得到了最好的结果,所以它看起来如下:

word1 word2 word3 ... wordn POST1 POST2 POST3... POSTn

完成此操作后,我将其输入标准ngram或其他任何内容并将其提供给SVM。

此方法保留单个单词的信息,但是当您向系统提供之前未见过的单词但标记器之前遇到的单词时,也会保留POST模式的重要信息。

答案 3 :(得分:0)

我认为更好的方法是:

  1. [5 4 3 2 1]
  2. Step-1: Create word/sentence embeddings for each text/sentence.
  3. Step-2: Calculate the POS-tags. Feed the POS-tags to a embedder as Step-1.

谢谢