0

私は新しいpythonプログラマーです。次のことを行う簡単なスクリプトを作成しました。

  • ユーザーにURLを尋ねる
  • URL を読み取ります (urlopen(url).read())
  • 上記のコマンドの結果をトークン化します

トークン化の結果を 2 つのファイルに取得します。1 つはラテン文字 (英語、スペイン語など) の単語で、もう 1 つはそれ以外 (ギリシャ語など) の単語です。

問題は、ギリシャ語の URL を開くと、そこからギリシャ語が取得されますが、単語ではなく一連の文字として表示されることです (ラテン語の場合に発生します)。

単語 ( μαριαγιωργοςπαιδι) のリスト (項目数 3) を取得する予定ですが、取得する('μ','α','ρ','ι', 'α'........)項目の数は文字数と同じです

私は何をすべきか?(エンコーディングはutf-8です)

コードに従います:

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

#Importing useful libraries 
#NOTE: Nltk should be installed first!!!
import nltk
import urllib #mporei na einai kai urllib
import re
import lxml.html.clean
import unicodedata
from urllib import urlopen

http = "http://"
www = "www."
#pattern = r'[^\a-z0-9]'

#Demand url from the user
url=str(raw_input("Please, give a url and then press ENTER: \n"))


#Construct a valid url syntax
if (url.startswith("http://"))==False:
    if(url.startswith("www"))==False:
        msg=str(raw_input("Does it need 'www'? Y/N \n"))
        if (msg=='Y') | (msg=='y'):
            url=http+www+url
        elif (msg=='N') | (msg=='n'):
            url=http+url
        else:
            print "You should type 'y' or 'n'"
    else:
        url=http+url

latin_file = open("Latin_words.txt", "w")
greek_file = open("Other_chars.txt", "w")
latin_file.write(url + '\n')
latin_file.write("The latin words of the above url are the following:" + '\n')
greek_file.write("Οι ελληνικές λέξεις καθώς και απροσδιόριστοι χαρακτήρες")

#Reading the given url

raw=urllib.urlopen(url).read()

#Retrieve the html body from the url. Clean it from html special characters
pure = nltk.clean_html(raw)
text = pure

#Retrieve the words (tokens) of the html body in a list
tokens = nltk.word_tokenize(text)

counter=0
greeks=0
for i in tokens:
    if re.search('[^a-zA-Z]', i):
        #greeks+=1
        greek_file.write(i)
    else:
        if len(i)>=4:
            print i
            counter+=1
            latin_file.write(i + '\n')
        else:
            del i


#Print the number of words that I shall take as a result
print "The number of latin tokens is: %d" %counter

latin_file.write("The number of latin tokens is: %d and the number of other characters is: %d" %(counter, greeks))
latin_file.close()
greek_file.close()

私はそれをさまざまな方法でチェックしましたが、私が得ることができる限り、プログラムはギリシャ語の文字を認識しますが、ギリシャ語の単語を認識できません。つまり、単語を区切る魔女のスペースです!

端末にスペースを入れてギリシャ語の文章を入力すると、正しく表示されます。何かを読んだときに問題が発生します(htmlページの本文など)

また、text_file.write(i) では、ギリシャ語の i について、text_file.write(i+ '\n') と書くと、結果は不明な文字、別名、エンコーディングが失われます。

上記に関するアイデアはありますか?

4

3 に答える 3

0

Pythonreモジュールは、Unicodeのサポートが弱いことで有名です。本格的なUnicode作業については、Unicodeスクリプトとプロパティを完全にサポートする代替正規表現モジュールを検討してください。例:

text = u"""
Some latin words, for example: cat niño määh fuß
Οι ελληνικές λέξεις καθώς και απροσδιόριστοι χαρακτήρες
"""

import regex

latin_words = regex.findall(ur'\p{Latin}+', text)
greek_words = regex.findall(ur'\p{Greek}+', text)
于 2012-09-27T08:07:20.523 に答える
0

これは、 URL を取得するための優れたrequestsライブラリ、ファイルを自動的に閉じるwithステートメントio、およびutf8 を支援するステートメントを使用した、コードの簡略化されたバージョンです。

import io
import nltk
import requests
import string

url = raw_input("Please, give a url and then press ENTER: \n")
if not url.startswith('http://'):
   url = 'http://'+url
page_text = requests.get(url).text
tokens = nltk.word_tokenize(page_text)

latin_words = [w for w in tokens if w.isalpha()]
greek_words = [w for w in tokens if w not in latin_words]

print 'The number of latin tokens is {0}'.format(len(latin_words))

with (io.open('latin_words.txt','w',encoding='utf8') as latin_file,
      io.open('greek_words.txt','w',encoding='utf8') as greek_file):

    greek_file.writelines(greek_words)
    latin_file.writelines(latin_words)

    latin_file.write('The number of latin words is {0} and the number of others {1}\n'.format(len(latin_words),len(greek_words))

URL をチェックする部分を簡略化しました。この方法では、無効な URL は読み取られません。

于 2012-09-27T08:08:21.113 に答える
0

if re.search('[^a-zA-Z]', i) ここで、リストをループすることでリストから単語を取得できる文字列ではなく、部分文字列を探していると思いますtoken

于 2012-09-27T07:45:48.797 に答える