我尝试在希腊文中使用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()
但问题仍然存在。
有什么想法吗?
答案 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