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

Sur*_*esh 10 python machine-learning nltk scikit-learn

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

sent ="这是POS示例"

tok = nltk.tokenize.word_tokenize(sent)pos = nltk.pos_tag(tok)print(pos)

这将返回以下[('This','DT'),('is','VBZ'),('POS','NNP'),('example','NN')]

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

请建议

Tex*_*eek 9

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

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

 the: 4, player: 1, bats: 1, well: 2, today: 3,...
Run Code Online (Sandbox Code Playgroud)

下一个文件可能包含:

 the: 0, quick:5, flying:3, bats:1, caught:1, bugs:2
Run Code Online (Sandbox Code Playgroud)

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

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

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

('This', 'POS_DT', 'is', 'POS_VBZ', 'POS', 'POS_NNP', 'example', 'POS_NN')
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

('This_DT', 'is_VBZ', 'POS_NNP', 'example_NN')
Run Code Online (Sandbox Code Playgroud)

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

你还可以做很多其他安排.

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

希望有所帮助.


小智 6

将单词和它的标签(如“单词/标签”)合并怎么样,然后你可以将你的新语料库提供给一个计算单词(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)
Run Code Online (Sandbox Code Playgroud)

输出是

   Someone/NN should/MD have/VB this/DT piece/NN of/IN shit/NN to/TO a/DT volcano/NN
Run Code Online (Sandbox Code Playgroud)


ABC*_*ABC 5

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

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

word1 word2 word3 ... wordn POST1 POST2 POST3... POSTn
Run Code Online (Sandbox Code Playgroud)

完成后,我将其输入标准 ngram 或其他任何内容并将其输入 SVM。

这种方法保留了单个单词的信息,但也保留了 POST 模式的重要信息,当你给你的系统一个它以前没有见过但标记器以前遇到过的单词时。