English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
본문은 Python 텍스트 특징 추출 및 벡터화의 구체적인 코드를 공유하여 참고하도록 합니다. 구체적인 내용은 다음과 같습니다
예를 들어, 노兰의 대작 《星际穿越》을 보고 나서, 기계가 관객들의 영화 평가가 “좋아”(positive)인지 “싫어”(negative)인지 자동으로 분석하는 방법을 상상해 봅니다.
이 문제는 감정 분석 문제에 속합니다. 이 문제를 처리하는 첫 번째 단계는 텍스트를 특징으로 변환하는 것입니다.
따라서 이 장에서는 첫 번째 단계인 텍스트에서 특징을 추출하고 벡터화하는 방법에만 집중합니다.
중국어 처리는 토큰화 문제와 관련이 있기 때문에, 본문은 Python의 기계 학습 라이브러리를 사용하여 영어를 특징 추출하는 방법을 단순한 예제로 설명합니다.
1、데이터 준비
Python의 sklearn.datasets가 디렉토리에서 모든 분류된 텍스트를 읽을 수 있습니다. 하지만 디렉토리는 각 폴더가 레이블 이름을 따라 정리되어야 합니다. 예를 들어, 본문에서 사용하는 데이터셋은2个标签,一个为“net”,一个为“pos”,每个目录下面有6个文本文件。目录如下所示:
neg
1.txt
2.txt
......
pos
1.txt
2.txt
....
12个文件的内容汇总起来如下所示:
neg: shit. waste my money. waste of money. sb movie. waste of time. a shit movie. pos: nb! nb movie! nb! worth my money. I love this movie! a nb movie. worth it!
2、텍스트 특징
이러한 영어에서 감정 태도를 추출하고 분류하는 방법은 무엇인가요?
가장 직관적인 방법은 단어를 추출하는 것입니다. 많은 키워드가 말하는 사람의 태도를 반영할 것이라고 일반적으로 생각됩니다. 예를 들어 위의 간단한 데이터셋에서 "shit"라고 말한 사람은 꼭 neg 종류에 속합니다.
물론, 위의 데이터셋은 설명을 쉽게 하기 위해 간단히 설계되었습니다. 현실에서는 단어가 흐릿한 태도를 가질 수 있습니다. 그러나 특정 단어가 neg 종류에서 더 많이 나타나면 그가 neg 태도의 확률이 더 높다는 믿을 만한 이유가 있습니다.
동시에 우리는 어떤 단어가 감정 분류에 무의미하다는 것에 주목했습니다. 예를 들어 위의 데이터에서 "of", "I"와 같은 단어. 이러한 단어는 이름이 있습니다.Stop_Word”(스톱워드)와 같은 단어는 완전히 무시할 수 있습니다. 이러한 단어를 무시하면 단어 빈도 기록의 저장 공간이 최적화되고 빠르게 구축될 수 있습니다.
각 단어의 단어 빈도를 중요한 특징으로 삼는 것도 문제가 있습니다. 예를 들어 위의 데이터에서 "movie"는12개의 샘플에 나타났습니다.5회, 그러나 양쪽 모두에서 출현 횟수가 거의 같아 구분도 없습니다. 그리고 "worth"는2회, 그러나 pos 종류에만 나타나며, 분명히 강한 정확한 색채를 가지고 있어 구분도 매우 높습니다.
따라서, 우리는TF-IDF(Term Frequency-Inverse Document Frequency,단어 빈도와 역 파일 빈도를 각 단어에 대해 추가로 고려합니다.
TF(단어 빈도)의 계산은 매우 간단합니다. 특정 파일 t에서 특정 단어 Nt가 해당 문서에 출현하는 횟수입니다. 예를 들어 문서 "I love this movie"에서 단어 "love"의 TF는1/4입니다. "I"와 "it"와 같은 스톱워드를 제거하면1/2。
IDF(역 파일 빈도)의 의미는, 특정 단어 t가 나타나는 문서 수 Dt가 전체 테스트 문서 D의 비율을 차지하고 자연 로그를 계산하는 것입니다.
예를 들어 단어 "movie"는 총5회, 그리고 문서 총 수는12،따라서 IDF는 ln(5/12)입니다.
물론, IDF는 출현이 적지만 강한 감정적 색채를 가진 단어를 강조하기 위해 있습니다. 예를 들어 "movie"와 같은 단어의 IDF=ln(12/5)=0.88,"love"의 IDF=ln(12/1)=2。48。
TF-IDF이 두 가지를 간단히 곱하면 됩니다. 이렇게 하면 각 문서에서 각 단어의 TF를 계산할 수 있습니다.-IDF는 우리가 추출한 텍스트 특징 값입니다.
3벡터화
이러한 기본을 바탕으로 문서를 벡터화할 수 있습니다. 먼저 코드를 보고 벡터화의 의미를 분석해 보겠습니다:
#}} -*- coding: utf-8 -*- import scipy as sp import numpy as np from sklearn.datasets import load_files from sklearn.cross_validation import train_test_split from sklearn.feature_extraction.text import TfidfVectorizer '''''데이터 셋 로드, 데이터 셋 분할80% 훈련,20% 테스트''' movie_reviews = load_files('endata') doc_terms_train, doc_terms_test, y_train, y_test\ = train_test_split(movie_reviews.data, movie_reviews.target, test_size = 0.3) '''''BOOL형 특징 하의 벡터 공간 모델, 주의, 테스트 샘플은 transform 인터페이스를 호출합니다''' count_vec = TfidfVectorizer(binary = False, decode_error = 'ignore',\ stop_words = 'english') x_train = count_vec.fit_transform(doc_terms_train) x_test = count_vec.transform(doc_terms_test) x = count_vec.transform(movie_reviews.data) y = movie_reviews.target print(doc_terms_train) print(count_vec.get_feature_names()) print(x_train.toarray()) print(movie_reviews.target)
실행 결과는 다음과 같습니다:
[b'시간 낭비.', b'쓰레기 영화.', b'좋은 영화.', b'이 영화를 사랑해!', b'쓰레기.', b'금액에 맞는 가치.', b'쓰레기 영화.', b'值得一试!']
['love', 'money', 'movie', 'nb', 'sb', 'shit', 'time', 'waste', 'worth']
[[ 0. 0. 0. 0. 0. 0. 0.70710678 0.70710678 0. ]
[ 0. 0. 0.60335753 0. 0. 0.79747081 0. 0. 0. ]
[ 0. 0. 0.53550237 0.84453372 0. 0. 0. 0. 0. ]
[ 0.84453372 0. 0.53550237 0. 0. 0. 0. 0. 0. ]
[ 0. 0. 0. 0. 0. 1. 0. 0. 0. ]
[ 0. 0.76642984 0. 0. 0. 0. 0. 0. 0.64232803]
[ 0. 0. 0.53550237 0. 0.84453372 0. 0. 0. 0. ]
[ 0. 0. 0. 0. 0. 0. 0. 1. ]]
[1 1 0 1 0 1 0 1 1 0 0 0]
python이 출력하는 것이 매우 혼란스럽습니다. 여기서는 다음과 같은 표를 만들었습니다:
위 표에서 다음과 같은 점을 발견할 수 있습니다:
1표준 단어 필터링.
초기화 count_vec 때, count_vec 생성 시 stop_words = 'english'를 전달하여 기본 영어 표준 단어를 사용했습니다. TfidfVectorizer가 내장한 모든 표준 단어를 확인하려면 count_vec.get_stop_words()를 사용할 수 있습니다. 물론, 여기서는 자신의 표준 단어 목록(예: 이곳의 'movie')을 전달할 수 있습니다.
2와 같은 기능을 포함하고 있습니다.-IDF 계산을 추가합니다.
여기서 단어 빈도 계산은 sklearn의 TfidfVectorizer를 사용합니다. 이 클래스는 CountVectorizer를 상속하며, 기본적인 단어 빈도 통계에 TF-IDF와 같은 기능이 있습니다.
여기서 계산된 결과는 이전에 계산한 것과 조금 다릅니다. 왜냐하면 이번에 count_vec을 구성할 때는 default으로 max_df=1따라서 TF-IDF 모두가 규격화되어, 모든 값이 [0,1] 사이에 있습니다.
3와 count_vec.fit_transform의 결과는 매우 큰 행렬입니다. 많은 0이 상표 표시되어 있으므로 sklearn은 내부적으로 희소 행렬을 사용합니다. 이 예제 데이터는 작습니다. 관심이 있다면, 콘넬 대학교에서 얻은 실제 데이터를 시도해 보세요:http://www.cs.cornell.edu/people/pabo/movie-review-data/이 웹사이트는 많은 데이터셋을 제공하며, 몇 가지 중에2M 규모의 데이터베이스, 양보7대략 00개입니다. 이 데이터 규모도 크지 않습니다.1분 내에 완료할 수 있습니다. 시도해 보세요. 하지만 이 데이터셋이 불법 문자 문제가 있을 수 있으므로 주의하세요. 따라서 count_vec에 decode_error = 'ignore'를 전달하여 이 불법 문자를 무시했습니다.
위 표의 결과는 훈련8샘플의8특징의 하나의 결과로, 이 결과는 여러 가지 분류 알고리즘을 사용하여 분류할 수 있습니다.
이것이 본문의 전체 내용입니다. 많은 도움이 되길 바랍니다. 또한, 나대호 튜토리얼을 많이 지지해 주시길 바랍니다.
고지: 본문은 인터넷에서 가져왔으며, 저작권은 원저자에게 있으며, 인터넷 사용자가 자발적으로 기여하고 업로드한 내용입니다. 이 웹사이트는 소유권을 가지지 않으며, 인공적인 편집을하지 않았으며, 관련 법적 책임을 지지 않습니다. 저작권 침해 내용이 발견되면 notice#w 이메일로 알려주시기 바랍니다.3codebox.com에 이메일을 보내서 (#을 @으로 변경하여) 신고하시고 관련 증거를 제공해 주시면, 사실이 확인되면 해당 내용이 즉시 삭제됩니다.