2014-09-14 1 views
0

목표 : 토큰 화 된 텍스트를 벡터화하여 구조화되지 않은 텍스트 데이터에 대한 NLP 분석을 가능하게하는 용어 문서 행렬을 만듭니다. 예측과 텍스트 분류가 분석의 큰 부분이 될 것이므로 각 텍스트에 레이블/클래스를 연관시키는 것이 중요합니다. 이를 위해 필자는 각 행이 하나의 텍스트를 나타내고 각 열이 전체 코퍼스에 나타나는 단어 중 하나를 나타내는 구조의 문서 행렬이 필요합니다. 텍스트의 클래스/레이블은 행렬의 벡터이기도합니다.Python NLP : 토큰 화 된 텍스트를 원본 구조로 다시 매핑하는 방법은 무엇입니까?

문제점 : 텍스트의 각 레코드는 목록의 항목으로 표시됩니다. 첫 번째 레코드는 목록의 첫 번째 항목이고 두 번째 레코드는 목록의 두 번째 항목입니다. 목록의 모든 레코드의 내용을 토큰 화하고 모든 단어의 거대한 목록을 생성하는 것은 쉽습니다. 내 문제는 토큰 화 후에 원래 목록 구조를 유지할 수없고 각 토큰을 원래 목록의 레코드로 매핑 할 수 없다는 것입니다. 이로 인해 벡터화가 불가능 해집니다.

는 설명하기 위해 : (두 문장으로 목록에서 세 가지 기록, 각각)

record_one = 'I like ham. I also like pineapple.' 
record_two = 'I love cheese. I enjoy tomato sauce and dough too.' 
record_three = 'Hence, I dig Hawaiian pizza. And beer.' 
recordList = [record_one, record_two, record_three] 

결과 :

['I like ham. I also like pineapple.', 'I love cheese. I enjoy tomato sauce and dough too.', 'Hence, I dig Hawaiian pizza. And beer.'] 

토큰 화 : 매의

from nltk.tokenize import word_tokenize 
wordList= [] 
for r in recordList: 
    temp = word_tokenize(r) 
    for token in temp: 
     wordList.append(token) 

결과 (하나 개의 거대한 목록 레코드 목록의 단어) :

['I', 'like', 'ham.', 'I', 'also', 'like', 'pineapple', '.', 'I', 'love', 'cheese.', 'I', 'enjoy', 'tomato', 'sauce', 'and', 'dough', 'too', '.', 'Hence', ',', 'I', 'dig', 'Hawaiian', 'pizza.', 'And', 'beer', '.'] 

여기에 내가 갇혀있다. 이 시점에서 벡터 라이 제이션을하면 28x18 매트릭스가되고, 필요한 것은 3x18 매트릭스입니다. 어떻게 든 각 레코드를 recordList의 레코드에 매핑하여 3x18 행렬을 제공해야하지만 어떻게해야할지 모르겠습니다. 나는 분명히 내가 빠진 것이 있다는 것을 알고있다.

저는 파이썬과 NLP에 익숙하지 않아 가능한 한 간단하게하려고 노력하고 있습니다. 즉, 목록 사용, 해당 목록에 대한 작업을위한 루프 작성 및 목록 작성을 의미합니다. 나는이 (scikit)을 할 수있는 다른 모듈과 함수가 있음을 알고 있지만 언어에 대한 나의 이해를 높이기 위해 기본적인 파이썬 데이터 구조를 사용하도록하고있다. 대단 할 기본 파이썬 데이터 구조를 사용하여 솔루션을 만드는 것이 가능하다면.

미리 감사드립니다.

답변

1

여기서 문제는 각 문서에 단어가 설정되어 있지 않다는 것입니다. 이것이 3x18 대신 28x18 매트릭스로 끝나는 이유입니다. 일부 단계의

In [22]: doc_words = [set() for _ in recordList] 
In [24]: for index, record in enumerate(recordList): 
    token_generator = word_tokenize(record) 
    for token in token_generator: 
     doc_words[index].add(token) 
In [28]: all_words = {word for doc_word_set in doc_words for word in doc_word_set} 
In [31]: all_words_list = list(all_words) 
In [32]: [[1 if word in doc_word_set else 0 for word in all_words_list] for doc_word_set in doc_words] 
Out[32]: 
[[0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1], 
[1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0], 
[0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0]] 
In [48]: all_words_list 
Out[48]: 
['enjoy', 
'cheese', 
'and', 
'love', 
'like', 
'Hawaiian', 
'I', 
'too', 
'dig', 
',', 
'.', 
'And', 
'also', 
'beer', 
'dough', 
'tomato', 
'pineapple', 
'Hence', 
'pizza', 
'sauce', 
'ham'] 

설명 - -

여기 당신이 시도 할 수있는 파이썬 기반의 접근 방식이다

22 : 우리는 각 문서에있는 단어를 추적 할 doc_words를 사용합니다. 우리는 그것을 세트 목록으로 초기화합니다. 각 문서는 하나의 문서에 대해 설정됩니다.

24 : 우리는 단어

세트

(28)를 채우는 : 우리는 모든 단어

(31)의 세트 수집 : 단어의 순서가 고정되도록 우리는리스트에 세트를 변환을

32 : 매트릭스를 인쇄합니다. 우리는 각 문서의 단어 집합을 반복하고 문서의 단어 집합에있는 각 단어의 존재를 테스트합니다.

출력에 단어의 순서가 all_words_list으로 표시됩니다. 더 깨끗한 출력을 위해 all_words_list를 31 개로 정렬하는 것을 고려할 수 있습니다.

1

이 그것을 수행해야합니다

from sklearn.feature_extraction.text import CountVectorizer 
cv = CountVectorizer() 
words_csm = cv.fit_transform(records) 
words_csm.todense() 

matrix([[1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 1, 0, 0, 0, 0], 
     [0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1], 
     [0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0]], dtype=int64) 
관련 문제