2016-07-29 2 views
0

토큰화할 텍스트 파일 목록이 많습니다. 나는 작은 데이터 셋을 위해 작동하는 다음 코드를 가지고있다. 그러나 거대한 데이터 세트로 동일한 절차를 사용하는 데 문제가 있습니다. 아래에 작은 데이터 세트의 예제를 제공하고 있습니다. 모두가 작은 데이터 세트와 함께 잘 작동하지만파이썬에서 방대한 양의 텍스트를 토큰 화합니다.

In [1]: text = [["It works"], ["This is not good"]] 

In [2]: tokens = [(A.lower().replace('.', '').split(' ') for A in L) for L in text] 

In [3]: tokens 
Out [3]: 
[<generator object <genexpr> at 0x7f67c2a703c0>, 
<generator object <genexpr> at 0x7f67c2a70320>] 

In [4]: list_tokens = [tokens[i].next() for i in range(len(tokens))] 
In [5]: list_tokens 
Out [5]: 
[['it', 'works'], ['this', 'is', 'not', 'good']] 

, 나는 같은 코드 문자열 (문자열 이상 1,000,000 목록) 목록의 거대한 목록을 처리하는 문제가 발생합니다. In [3]처럼 거대한 데이터 세트로 문자열을 토큰화할 수 있으므로 In [4] (즉, 터미널에서 종료 됨)에 실패합니다. 텍스트의 본문이 너무 크다고 생각됩니다.

저는 여기에 있기 때문에 목록에있는 문자열 목록을 얻는 절차 개선에 대한 제안을 가지고 있는데, 그 내용은 In [5]입니다.

그러나 내 실제 목적은 각 목록의 단어를 계산하는 것입니다. 예를 들어, 위의 작은 데이터 세트의 예에서 아래에있는 것들을 갖습니다.

[[0,0,1,0,0,1], [1, 1, 0, 1, 1, 0]] (note: each integer denotes the count of each word) 

원하는 결과 (단어 개수)를 얻기 위해 발전기를 목록으로 변환 할 필요가없는 경우 좋을 수도 있습니다.

제 질문에 대해 명확히하지 않으면 알려주세요. 최대한 명확히 밝히고 싶습니다. 고맙습니다.

+0

나는'set()'을 사용하여 모든 문자열의 모든 단어의 원래 목록을 만든 다음 그 문자열을 반복하여 값 표를 생성합니다. – beroe

+0

컴퓨터의 RAM 용량은 얼마입니까? 또한, 귀하의 데이터 집합이 파일에 저장되어 있다고 가정합니다. 문장으로 문장을로드 할 수 있습니까? 그렇게 많은 메모리를 절약 할 수 있습니다 – hmicn

답변

1

당신은 독특한 단어의 set을 통해 다음 루프를 만들 수 및

#! /usr/bin/env python 

text = [["It works works"], ["It is not good this"]] 

SplitList = [x[0].split(" ") for x in text] 
FlattenList = sum(SplitList,[]) # "trick" to flatten a list 
UniqueList = list(set(FlattenList)) 
CountMatrix = [[x.count(y) for y in UniqueList] for x in SplitList] 

print UniqueList 
print CountMatrix 

출력이 단어의 전체 목록입니다 ... 그 각을 계산하고, 각 문자열에 자신의 카운트 :

['good', 'this', 'is', 'It', 'not', 'works'] 
[[0, 0, 0, 1, 0, 2], [1, 1, 1, 1, 1, 0]] 
+0

죄송합니다. 내가 사용한 텍스트가 다른 것을 보지 못했습니다. 그래서 당신은 실제로 옳습니다. 정말 고마워!! – achimneyswallow

+1

예. 방금 반복되는 단어로 작업하도록 텍스트를 변경했습니다. – beroe

+0

거대한 데이터 세트로 코드를 시도한 결과 프로세스가 여전히 터미널에서 종료되었습니다. 그럼에도 불구하고 귀하의 의견에 항상 감사드립니다. 코드가 아름답습니다. – achimneyswallow

0

사용할 수있는 토큰 장치가 많이 있습니다. 나는 CountVectorizersklearn으로 보는데, 이것은 토큰 계산을 위해 만들어졌다.

더 많은 옵션이 필요하면 nltk 또는 textblob을 사용할 수도 있습니다. 후자는 내 경험으로는 더 빠릅니다.

+0

감사합니다. 나는 CountVectorizer를 사용했다. 그러나 데이터를 계산하기 위해 원시 텍스트를 변환하려고 시도했지만 메모리가 부족했습니다. 여기 내 게시물 http://stackoverflow.com/questions/38670059/vectorization-in-sklearn-seems-to-be-very-memory-expensive-why 내가 textblob 시도합니다. 나는 전에이 옵션을 몰랐다. 제게 알려 줘서 고마워요. – achimneyswallow

+0

'gensim'에서 주위를 두드려보십시오. 이 패키지는 많은 RAM 사용을 피하기 위해 작성되었습니다.메모리에로드하는 것과 달리 디스크에 저장된 파일로 작업 할 수 있습니다. 나는'gensim'이 토크 나이저를 가지고 있다고 확신합니다. – Jason

관련 문제