将词性更改为词典

时间:2017-03-07 11:05:12

标签: python nltk

我有这个功能,使用NLTK从给定的文本中引用PART OF SPEECH并在用冒号替换每个单词和它的词性之间的cammas后成对压缩但我在正则表达式中有一个我无法理解的错误。请帮我纠正我的功能。 这是我的功能:

 def getTokenss(tweet):
       poses = []

       words = tweet.split()
       for i in nltk.pos_tag(words):
            re.sub(r",", ":", j)

            poses.append(i)
            pos_pairs = map(list,zip(poses[:-1], poses[1:]))


      return pos_pairs

这就是我得到的错误:

  Traceback (most recent call last):
    File "D:\posTag.py", line 112, in <module>
      b =getTokenss(t)
    File "D:\posTag.py", line 94, in getTokenss
      j =re.sub(r",", ":", j)
    File "c:\program files\python27\lib\re.py", line 151, in sub
      return _compile(pattern, flags).sub(repl, string, count)
 TypeError: expected string or buffer

2 个答案:

答案 0 :(得分:1)

函数nltk.pos_tag返回元组列表,其中每个元组由特定单词及其关联标记组成。这就是为什么你得到那个错误,因为re.sub期望一个字符串作为它的第三个参数。

根据您的使用情况,您可能希望将nltk.pos_tag的结果迭代为:

for (word, tag) in nltk.pos_tag(words):
    #in case you want to merge the word and tag into a single string
    item = '%s:%s' % (word, tag)
    poses.append(item)

此外,语句pos_pairs = map(list,zip(poses[:-1], poses[1:]))应该最有可能放在for循环之外。

最后,如果你正在处理推文,我会推荐TweetTokenizer,它的表现要比split方法好得多......

答案 1 :(得分:0)

您的代码中有一个j变量调用re.sub(r",", ":", j),没有引用。