在土耳其文本中用nltk查找ngrams

时间:2015-11-29 15:56:35

标签: python nltk

我试图在土耳其语中找到具有unicode字符的ngram。这是我的代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import nltk
from nltk import word_tokenize
from nltk.util import ngrams

def find_bigrams():
    t = "çağlar boyunca geldik çağlar aktı gitti. çağlar aktı"
    token = nltk.word_tokenize(t)
    bigrams = ngrams(token,2)
    for i in bigrams:
        print i

find_bigrams()

输出:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 7: ordinal not in range(128)

当我改变这样的文字时:

t = "çağlar boyunca geldik çağlar aktı gitti"
输出也会改变:

('\xc3\xa7a\xc4\x9flar', 'boyunca')
('boyunca', 'geldik')
('geldik', '\xc3\xa7a\xc4\x9flar')
('\xc3\xa7a\xc4\x9flar', 'akt\xc4\xb1')
('akt\xc4\xb1', 'gitti')

如何解决这个unicode问题?另一个问题是我如何将这些标记转换为字符串(没有')字符)

1 个答案:

答案 0 :(得分:2)

这不是作为unicode问题的NLTK问题。

这可以通过从__future__添加正确的导入来解决;在这种情况下,您需要unicode_literals

请注意我的Mac安装Python 2.7.10中的这个示例:

>>> from __future__ import unicode_literals
>>> t = "çağlar boyunca geldik çağlar aktı gitti. çağlar aktı"
>>> print(t)
çağlar boyunca geldik çağlar aktı gitti. çağlar aktı

bigrams是一个元组列表,所以要删除parens,你可以遍历列表中的每一对。

>>> tup = ("hello", "world")
>>> print tup
(u'hello', u'world')
>>> l = [tup]
>>> for i in l:
...   print(i)
... 
(u'hello', u'world')
>>> for i,j in l:
...   print("{0} {1}".format(i, j))
... 
hello world

在脚本中结合这些想法:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import nltk
from nltk import word_tokenize
from nltk.util import ngrams

def find_bigrams():
    t = "çağlar boyunca geldik çağlar aktı gitti. çağlar aktı"
    token = nltk.word_tokenize(t)
    bigrams = ngrams(token,2)
    for i, j in bigrams:
        print("{0} {1}".format(i, j))

find_bigrams()