2016-06-01 3 views
1

sparkでNLTKを使用して自然言語処理に取り組んでいます。どこで実装しようとしました3.1ウェブとディスクからのテキストへのアクセスの部分はhttp://www.nltk.org/book/ch03.htmlです。このためには、自然言語処理の方法(https://docs.continuum.io/anaconda-cluster/howto/spark-nltk)に従ってください。 text.concordance( 'gene')メソッドを実装しようとしましたが、結果[None、None、None、None、None]で終了しました。ここに私の完全なコードです。どんな助けでも大歓迎です。nltkのText.concordance()は、分散メソッドとしてpysparkに利用可能です

from pyspark import SparkConf 
from pyspark import SparkContext 


conf = SparkConf() 
conf.setMaster('yarn-client') 
conf.setAppName('spark-nltk') 
sc = SparkContext(conf=conf) 

data = sc.textFile('/user/test/2554.txt') 

def word_tokenize(x): 
    import nltk 
    return nltk.word_tokenize(x) 

def pos_tag(x): 
    import nltk 
    return nltk.pos_tag([x]) 


words = data.flatMap(word_tokenize) 
print words.take(10) 


from nltk.text import Text 
text = words.map(lambda x : Text(x).concordance('gene')) 
print text.take(5) 



pos_word = words.map(pos_tag) 
print pos_word.take(5) 

答えて

0

ここには2つの問題があります。

まず、この:wordsで個々のトークンを超える

text = words.map(lambda x : Text(x).concordance('gene')) 

マップ。つまり、各単語を1単語のテキストに変換しています。 mapの代わりにほしいものはmapPartitionsです。この

text = words.mapParitions(lambda x : Text(x).concordance('gene')) 

は、パーティションごとに1つずつTextを作成します。たとえば、次の第二は、私たち(言葉で)各区画の長さを与えながら

>>> import nltk 
>>> data = sc.textFile(nltk.corpus.gutenberg.root + '/melville-moby_dick.txt', 10) 
>>> words = data.flatMap(nltk.word_tokenize) 
>>> words.map(len).take(5) 
[1, 4, 4, 2, 6] 
>>> words.mapPartitions(lambda t: [len(list(t))]).take(5) 
[25803, 26255, 25143, 24900, 24900] 

最初は、私たちの各単語(文字)の長さを与えます。

ただし、concordanceメソッドでは一致線が表示されますが、常にNoneが返されるため、結果を得るための簡単な方法はありません。あなたが一致のために何をしたいかによって、Text.concordanceをあなたが望むことに適応させるのは簡単です - githubのソースコードを見てください。

本当に大きなテキストの対訳をインタラクティブに作成できるようにするには、そのタスク用に特別に設計されたものを使用することをおすすめします。たとえば、IMS Corpus Workbenchは、数百万の単語を100秒間で複雑に検索できます。


+0

回答が解決しました@rmalouf –

+0

素晴らしい!あなたは答えを受け入れることができるので、質問は開いたままにしておきますか? – rmalouf

関連する問題