NLTK(python)和希腊语编码

时间:2014-01-30 18:02:58

标签: python python-2.7 encoding nlp nltk

我尝试在希腊文中使用NLTK pagkage,我处理编码的一个很大的问题。我的代码在

之下
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os, string, re, nltk

def find_bigrams(input_list):
   bigram_list = []
   for i in range(len(input_list)-1):
       bigram_list.append((input_list[i], input_list[i+1]))
       return bigram_list

def get_nice_string(list_or_iterator):
   return "[" + " , ".join( str(x) for x in list_or_iterator) + "]"

def stripText(rawText):
   text = rawText
    rules = [
    {r'{[^)]*\}' : ''},             # remove curly brackets
    {r'\([^)]*\)' : ''},            # remove parentheses
    {r'^https?:\/\/.*[\r\n]*' : ''},# remove urls
    {r' +' : ' '},                  # remove multiple whitespaces
    {r'^\s+': ''},                  # remove whitespaces beginning
    {r'\.\.+' : '.'}                # remove multiple fullstops
    ]

for rule in rules:
    for (k, v) in rule.items():
        regex = re.compile(k)
        text = regex.sub(v, text)

sentenceClean = text.translate(string.maketrans('', ''), '{}[]|?"=\'')
return sentenceClean

if __name__ == '__main__':
    f = open('C:\\Users\\Dimitris\\Desktop\\1.txt', 'r').readlines()

    newFile = open('C:\\Users\\Dimitris\\Desktop\\corpus.txt', 'w')
    newFile1 = open('C:\\Users\\Dimitris\\Desktop\\words.txt', 'w')

    words = ['jpg', 'jpeg', 'File', 'Image']

for line in f:
    sentences = stripText(line)
    whitespaces = sentences.count(' ')
    if any(word in sentences for word in words):
        continue
    elif whitespaces < 20:
        continue
    else:
        newFile.write(sentences+'\n')

        b = nltk.word_tokenize(sentences)
        print get_nice_string(b)
        get_nice_string(nltk.bigrams(b))
        print get_nice_string(nltk.bigrams(b))

        newFile1.write(get_nice_string(b))


newFile.close()
newFile1.close()

当我尝试从nltk.word_tokenize(句子)打印输出时,结果就像是(('\ xe5 \ xe3 \ xea \ xfe \ xec \ xe9 \ xe1','\ xe3 \ xe9') ),但如果我使用get_nice_string()函数并将列表转换为字符串,则结果为普通的希腊文本。 到现在为止还挺好。

但是我是否使用find_bigrams()函数或nltk.bigrams()我得到类似上面的字符串(('\ xe5 \ xe3 \ xea \ xfe \ xec \ xe9 \ xe1','\ xe3 \ xe9')) ,即使我使用get_nice_string()函数,也要将列表转换为字符串。

另外,我尝试使用codecs.open()函数打开文件,就像这样

f = codecs.open('C:\\Users\\Dimitris\\Desktop\\1.txt', 'r', 'utf-8').readlines()  

但问题仍然存在。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

首先,NLTK word_tokenize()可能不适合您输入的希腊数据;默认nltk.tokenize.word_tokenize()在英语Penn Treebank上进行培训,请参阅https://nltk.googlecode.com/svn/trunk/doc/api/nltk.tokenize.treebank.TreebankWordTokenizer-class.html

我不确定您是否正在获得正确的标记化,但由于希腊语使用空格作为标记分隔符,因此NLTK似乎可以正常工作,但我会使用str.split()代替:

>>> from nltk import word_tokenize
>>> x = "Θέλεις να χορέψεις μαζί μου"
>>> for i in word_tokenize(x):
...     print i
... 
Θέλεις
να
χορέψεις
μαζί
μου
>>> for i in x.split():
...     print i
... 
Θέλεις
να
χορέψεις
μαζί
μου

与使用word_tokenize() http://nltk.org/api/nltk.tokenize.html#nltk.tokenize.punkt.PunktTrainer

关于打印PunktTrainer字符的下一步,请参阅byte string vs. unicode string. Python

最后NLTK搞乱你的双字母码的问题,我建议使用你自己的bigrams代码,因为NLTK主要是针对英语输入测试而不是希腊语,试试:

utf8