【问题标题】:Python TextBlob Package - Determines POS tag for '%' symbol but do not print it as a wordPython TextBlob 包 - 确定“%”符号的 POS 标记,但不将其打印为单词
【发布时间】:2017-09-28 06:43:58
【问题描述】:

我正在用 python 的 TextBlob 包敲我的头,

  • 从段落中识别句子
  • 从句子中识别单词
  • 为这些词等确定 POS(词性)标签...

如果我没记错的话,在我发现一个可能的问题之前,一切都很顺利。下面用示例代码sn-p解释。

from textblob import TextBlob
sample = '''This is greater than that by 5%.''' #Sample Sentence
blob = TextBlob(sample)                         #Passing it to TextBlob package.
Words = blob.words                              #Splitting the Sentence into words.
Tags = blob.tags                                #Determining POS tag for each words in the sentence

print(Tags)
[('This', 'DT'), ('is', 'VBZ'), ('greater', 'JJR'), ('than', 'IN'), ('that', 'DT'), ('by', 'IN'), ('5', 'CD'), ('%', 'NN')]

print(Words)
['This', 'is', 'greater', 'than', 'that', 'by', '5']

如上所示,blob.tags 函数将 '%' 符号视为一个单独的单词,并确定 POS 标签。

而 blob.words 函数甚至不会单独或与前一个单词一起打印 '%' 符号。

我正在使用这两个函数的输出创建一个数据框。因此,由于长度不匹配问题,它没有被创建。

这是我的问题。 这可能是 TextBlob 包中的问题吗? 有没有办法在单词列表中识别“%”?

【问题讨论】:

    标签: python textblob


    【解决方案1】:

    在标记化时去掉标点符号似乎是 TextBlob 开发人员有意识的决定:https://github.com/sloria/TextBlob/blob/dev/textblob/blob.py#L624

    他们依赖于 NLTK 的分词器,该分词器采用 include_punct 参数,但我没有看到通过 TextBlob 将 include_punct=True 传递给 NLTK 分词器的方法。

    当遇到类似问题时,我将有趣的标点符号替换为旨在表示它的非字典文本常量,即:在标记化之前将 '%' 替换为 'PUNCTPERCENT'。这样,百分号的信息就不会丢失。

    编辑:我已更正,在 TextBlob 初始化时,您可以通过其 __init__ 方法 https://github.com/sloria/TextBlob/blob/dev/textblob/blob.py#L328tokenizer 参数设置标记器。

    因此,您可以轻松地将 TextBlob 传递给尊重标点符号的标记器。

    respectful_tokenizer = YourCustomTokenizerRepectsPunctuation()
    blob = TextBlob('some text with %', tokenizer=repectful_tokenizer)
    

    EDIT2:我在查看 TextBlob 的源代码时遇到了这个问题:https://github.com/sloria/TextBlob/blob/dev/textblob/blob.py#L372 注意 words 方法的文档字符串,它说如果你想包含标点符号,你应该访问 tokens 属性而不是 words 属性。

    【讨论】:

    • 所以 TextBlob 不会将任何符号识别为单独的单词?但同样的 TextBlob 确实识别符号属于 'NN' POS 标签对吗?
    • 这似乎是默认行为,是的。但是请看一下我的答案的编辑,有一种方法可以将自定义标记器传递给 TextBlob。您可以传递一个尊重标点符号的自定义标记器
    • 如果我们使用 NLTK 分词器来达到同样的效果呢?似乎它正在正确识别“%”。请看我的回答,让我知道你的想法
    • 这是可能的。我在查看 TextBlob 的源代码时遇到了这个问题:github.com/sloria/TextBlob/blob/dev/textblob/blob.py#L372 注意words 方法的文档字符串,它说如果你想包含标点符号,你应该访问tokens 属性而不是words 属性。我建议你试试
    • 是的@L.Alvarez。这是一个很棒的发现。所以我们可以使用 TextBlob 本身而不是去 NLTK。
    【解决方案2】:

    最后我发现 NLTK 可以正确识别符号。下面给出相同的代码sn-p以供参考:

    from nltk import word_tokenize
    from nltk import pos_tag
    Words = word_tokenize(sample)
    Tags = pos_tag(Words)
    
    print(Words)
    ['This', 'is', 'better', 'than', 'that', 'by', '5', '%']
    
    print(Tags)
    [('This', 'DT'), ('is', 'VBZ'), ('better', 'JJR'), ('than', 'IN'), ('that', 'DT'), ('by', 'IN'), ('5', 'CD'), ('%', 'NN')]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-06
      • 1970-01-01
      • 1970-01-01
      • 2017-03-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多