자연어 텍스트 처리를 통한 검색 시스템 구축 [아파치 솔라, 루씬, OpenNLP 등 오픈소스 활용]
- 원서명Taming Text: How to Find, Organize, and Manipulate It (ISBN 9781933988382)
- 지은이그랜트 잉거솔(Grant Ingersoll), 토마스 모튼(Thomas Morton), 드류 패리스(Drew Farris)
- 옮긴이임혜연
- ISBN : 9788960776500
- 40,000원
- 2014년 12월 23일 펴냄
- 페이퍼백 | 456쪽 | 188*235mm
- 시리즈 : 데이터 과학
책 소개
요약
현대 웹 서비스에서 검색은 빼놓을 수 없는 기능이다. 사용자는 검색에 익숙하고, 검색 결과의 앞부분에서 곧바로 자신이 원하는 링크를 찾길 바란다. 사용자의 기준을 만족시키기는 어렵지만, 다행히 잘 만들어진 오픈 소스가 이미 존재한다. 이 책은 검색과 자연어 처리에 대한 기초적인 지식을 소개하고, 아파치 솔라, OpenNLP 등의 오픈 소스를 이용해서 실제로 기능을 사용하는 법을 알려준다. 이 책은 검색이나 자연어 처리를 서비스의 기능으로 제공해야 하는 개발자에게 좋은 길잡이가 되어줄 것이다.
한국어판에서는 솔라 7.5버전에서 달라진 점과 머하웃을 대체해서 사용할 수 있는 방법을 안내한다.
이 책에서 다루는 내용
삶에는 정보가 너무나 많고, 우리는 거기에 압도당해 있다. 다행히도 영리한 개발자에게 많이 필요한 구명줄을 던져줄 수 있는 구조화되지 않은 텍스트를 관리하기 위한 실용적인 도구와 기법들이 있다. 이 책에서 그 도구와 방법들을 찾아볼 수 있다. 이 책은 실제 애플리케이션에서 텍스트를 다루는 방법에 대한 실용적인 예제 중심의 안내서다. 전문(full-text) 검색, 고유명사 인식, 클러스터링, 태그 부착, 정보 추출, 요약 같은 유용한 기법을 소개한다. 독자는 실제 사용 사례의 기반 지식을 체계적으로 받아들이면서 다양한 사례를 탐구할 수 있다.
■ 텍스트 길들이기 기법
■ 솔라나 머하웃 등의 라이브러리
■ 텍스트 처리 애플리케이션을 구축하는 방법
이 책은 특수 용어를 피하고, 주제를 분명하고 간결하게 보여줘서 통계나 자연 언어 처리에 대한 배경 지식 없이도 이해할 수 있다. 예제는 자바로 돼 있지만, 개념은 어떤 언어에도 적용할 수 있다.
이 책에 쏟아진 찬사
“굉장히 복잡한 프로세스의 수수께끼 같은 면을 끄집어 냈다!
- 리즈 리디(Liz Liddy) / 시라큐즈 대학 정보학부 학과장
“텍스트 분석과 처리를 있는 그대로 보여준다. 분명하고, 실용적이며, 오픈소스를 사용해서 말이다!”
- 데이비드 바이스(David Weiss) / 캐럿 서치(Carrot Search) s.c.
“텍스트 문서에 갇혀 있는 정보를 어떻게 드러내고 활용하는지를 잘 보여준다.”
- 릭 바그너(Rick Wagner) / 레드 햇(Red Hat)
“텍스트 개념을 예제와 함께 익힘으로써, 텍스트 검색을 좀더 손쉬워진다.”
- 더그 워렌(Doug Warren) / 자바 웹 서비스(Java Web Services)
“텍스트 처리 도구와 기법에 대한 훌륭한 가이드”
- 줄리앙 니오슈(Julien Nioche) / 디지털페블(DigitalPebble, Ltd.)
추천의 글
고품질 텍스트 처리 능력에 대한 요구가 기하급수적으로 증가하는 이 시기에 어떤 식으로든 텍스트 정보에 의존하지 않는 분야나 산업을 생각하기는 어렵다. 급성장하는 웹 기반 경제는 극적으로 신속히 의존 정도를 늘렸다. 동시에 재능 있는 기술 전문가의 수요도 빠른 속도로 증가하고 있다. 이런 환경에 나온 훌륭하고 아주 실용적인 이 책은 실질적이고 현실적이며, 테스트된 지침과 설명을 제공해 준다.
몇 년간 나와 함께 일한 적이 있는 탁월하고 대단히 경험 많은 소프트웨어 엔지니어인 그랜트 잉거솔(Grant Ingersoll), 드류 패리스(Drew Farris)와 자연언어 처리 분야의 존경받는 기여자인 톰 모튼(Tom Morton)은 이 책에서 고도로 선별된 텍스트 처리자, 즉 자연언어 처리NLP 엔지니어 집단에 합류하는 데 관심이 있는 다른 기술 분야의 사람들을 안내하기 위한 현실적 과정을 제공한다.
내가 ‘세상을 위한, 세상 속에서의 학습’이라고 생각하는 것과 같은 방식으로 그랜트, 드류, 톰은 사실 아주 복잡한 프로세스에서 불가사의를 제거했다. 그들은 기존 도구, 구현된 예제, 잘 테스트된 코드에 집중해서 한 학기의 NLP 학습 과정을 수료하지 않고서도 이 책만으로도 가능하게 만들었다.
소프트웨어 엔지니어로서 독자가 예제와 코드 베이스, 여기서 참조한 오픈소스 도구를 자신의 것으로 익힐 수 있는 기초가 있다면, 예상한 것보다 더 빨리 진짜 전문가가 되고 실세계의 기회를 잡을 준비를 할 수 있을 것이다. - 리즈 리디(Liz Liddy) / 시라큐즈 대학 정보학부 학과장
이 책의 대상 독자
이 책이 당신을 위한 것일까? 어쩌면 그럴지도 모른다. 대상 독자는 검색, 자연언어 처리, 기계학습 배경 지식이 (거의) 없는 소프트웨어 현업 종사자다. 사실 이 책은 많은 회사에서 본 것과 같이 새 애플리케이션이나 기존 애플리케이션에 검색과 기타 기능을 추가하는 과제가 주어진 개발 팀이면서 극히 적은 개발자만 텍스트 작업에 대한 경험이 있거나 아예 없는 작업 환경에 있는 현업 종사자들을 목표로 한다. 그들에게는 불필요한 지식 때문에 꼼짝 못하는 일 없이 개념을 이해하는 데 도움이 될 만한 입문서가 필요하다.
많은 경우 위키피디아나 중대한 학술 논문처럼 쉽게 접근할 수 있는 자료에 대한 참고 문헌도 제공한다. 그렇게 해서 독자가 원한다면 더 상세한 내용을 탐구할 수 있는 도약대를 제공한다. 게다가 대다수 오픈소스 도구와 예제가 자바로 돼 있지만, 개념과 아이디어는 수많은 다른 프로그래밍 언어로도 옮길 수 있기 때문에 루비 사용자(Rubyist), 파이썬 사용자(Pythonista), 기타 언어 사용자들도 이 책을 편하게 느낄 수 있다.
이 책은 학생들이 교실과 더 학술 지향적인 책에서 배운 개념을 구현할 필요가 있을 때 도움이 될 것이지만, 이 시스템에 연관된 수학에 대한 설명이나 주제에 대한 학술적인 엄격함을 구하는 사람을 위한 책은 결코 아니다.
경험자들도 이 책 곳곳에서 책이 설명하는 오픈소스 패키지를 사용하는 데 대한 흥미로운 정보를 찾을 수도 있겠지만, 이 책은 다수의 텍스트 기반 애플리케이션을 구축한 적이 있는 경험 있는 현장 실무자를 대상으로 하지는 않는다. 그렇지만 한 명 이상의 경험 있는 실무자들은 이 책이 이 분야에 신참자인 팀 구성원들에게 텍스트 기반 애플리케이션을 작성하는 데 관련된 아이디어와 코드에 대해 속도를 높이게 해 주는 훌륭한 방식이라고 우리에게 말해줬다. 궁극적으로 이 책이 현대 프로그래머를 위한 최신 안내서이면서, 처음 텍스트 기반 애플리케이션 프로그래밍 경력을 시작했을 때 우리가 바라던 바로 그 안내서이기를 바란다.
이 책의 구성
1장, '텍스트 길들이기 시작'에서는 텍스트 처리가 중요한 이유와 이것이 무엇 때문에 도전적인지 설명한다. 텍스트를 길들이는 데 오픈소스 라이브러리를 활용하기 위한 준비를 하면서 사실 기반 질의응답QA 시스템을 간단히 소개한다.
2장, '텍스트 길들이기 기초'에서는 텍스트 처리의 구성 요소인 토큰화, 청크화, 구문 해석, 품사 태그 부착을 소개한다. 또한 아파치 티카(Apache Tika) 오픈소스 프로젝트를 사용해서 몇 가지 일반적인 파일 형식에서 텍스트를 추출하는 방법을 살펴본다.
3장, '검색'에서는 검색 이론과 벡터 공간 모델의 기본 지식을 탐구한다. 아파치 솔라 검색 서버를 소개하고, 솔라를 사용해서 콘텐츠를 인덱스로 만드는 방법을 보여준다. 수량과 품질이라는 검색 성능 요소를 어떻게 평가하는지 배운다.
4장, '유사 문자열 일치'에서는 접두사와 n그램을 사용한 유사 문자열 일치를 살펴본다. 두 개의 문자 중첩 척도, 자카드 척도와 자로 윙클러 거리를 자세히 알아보고, 솔라를 사용해서 일치 후보를 찾고 순위화하는 방법을 설명한다.
5장, '인명, 지명, 사물 식별'에서는 개체명 인식 너머의 기본 개념을 소개한다. 개체명을 찾기 위해 OpenNLP를 사용하는 방법을 보이고, 몇 가지 OpenNLP 성능 고려 사항을 설명한다.
6장, '텍스트 클러스터링'에서는 텍스트 클러스터링만을 다룬다. 여기서 일반적인 텍스트 클러스터링 알고리즘 너머의 기본 개념을 배우고, 텍스트 애플리케이션을 향상시키는 데 클러스터링이 어떤 도움을 줄 수 있는지에 대한 예제를 살펴본다. 또한 아파치 머하웃을 사용해 문서 컬렉션 전체를 클러스터링하는 방법과, Carrot2를 사용해 검색 결과를 클러스터링하는 방법도 설명한다.
7장, '분류, 카테고리 분류, 테깅'에서는 분류, 카테고리 분류, 태그 부착 너머의 기본 개념을 설명한다. 카테고리 분류가 텍스트 애플리케이션에서 어떻게 쓰이는지, 어떻게 오픈소스 도구를 사용해서 분류기를 구축하고, 훈련하고, 평가하는지 보여준다. 또한 문서 카테고리 분류기를 구축하기 위해 머하웃의 나이브 베이즈 알고리즘 구현체를 사용한다.
8장, '질의응답 시스템 예제 구축'에서는 QA 시스템 예제를 구축하기 위해 앞서 다른 장에서 배운 모든 것들을 모은다. 이 단순한 애플리케이션은 위키피디아를 지식 기반으로 사용하고, 솔라(Solr)을 기준 시스템으로 사용한다.
9장, '길들여지지 않는 텍스트: 다음 개척지 탐구'에서는 검색과 NLP 다음에 나올 주제와 의미론, 담론, 화용론의 역할을 탐구한다. 여러 언어에 걸친 검색과 콘텐츠에서의 감정 감지, 거기에 더해 최근 생겨난 도구, 애플리케이션, 아이디어를 다룬다.
목차
목차
- 1장. 텍스트 길들이기 시작
- 1.1 텍스트 길들이기가 중요한 이유
- 1.2 미리보기: 사실 기반 질의응답 시스템
- 1.2.1 안녕하세요, 프랑켄슈타인 박사님
- 1.3 텍스트를 이해하기는 어렵다
- 1.4 길들여진 텍스트
- 1.5 텍스트와 지능적인 앱: 검색과 그 너머
- 1.5.1 검색과 일치
- 1.5.2 정보 추출
- 1.5.3 정보 그룹화
- 1.5.4 지능적인 애플리케이션
- 1.6 정리
- 1.7 참고 자료
- 2장. 텍스트 길들이기 기초
- 2.1 언어의 기초
- 2.1.1 단어와 그 범주
- 2.1.2 구와 절
- 2.1.3 형태론
- 2.2 텍스트 프로세싱을 위한 일반적인 도구
- 2.2.1 문자열 조작 도구
- 2.2.2 토큰과 토큰 분리
- 2.2.3 품사 배정
- 2.2.4 어간 추출
- 2.2.5 문장 탐지
- 2.2.6 구문 분석과 문법
- 2.7.7 시퀀스 모델링
- 2.3 일반 파일 형식에서 콘텐츠의 전처리와 추출
- 2.3.1 전처리의 중요성
- 2.3.2 아파치 티카를 사용한 콘텐츠 추출
- 2.4 정리
- 2.5 참고 자료
- 3장. 검색
- 3.1 검색과 패싯 사례: 아마존
- 3.2 검색 개념 개론
- 3.2.1 콘텐츠로 색인 만들기
- 3.2.2 사용자 입력
- 3.2.3 벡터 공간 모델로 문서 순위화
- 3.2.4 결과 표시
- 3.3 아파치 솔라 검색 서버 소개
- 3.3.1 솔라 처음 실행
- 3.3.2 솔라 개념 이해
- 3.4 아파치 솔라를 사용한 콘텐츠 색인
- 3.4.1 XML을 사용한 인덱스
- 3.4.2 솔라와 아파치 티카를 사용한 콘텐츠 추출과 인덱스 작성
- 3.5 아파치 솔라로 콘텐츠 검색
- 3.5.1 솔라 질의 입력 파라미터
- 3.5.2 추출된 콘텐츠에 대한 패싯
- 3.6 검색 성능 요소 이해
- 3.6.1 품질 판단
- 3.6.2 수량 판단
- 3.7 검색 성능 개선
- 3.7.1 하드웨어 개선
- 3.7.2 분석 개선
- 3.7.3 질의 성능 개선
- 3.7.4 대안적인 채점 모델
- 3.7.5 솔라의 성능 개선을 위한 기법
- 3.8 검색 대안
- 3.9 정리
- 3.10 참고 자료
- 4장. 유사 문자열 일치
- 4.1 유사 문자열 일치에 대한 접근 방식
- 4.1.1 문자 겹침 척도
- 4.1.2 편집 거리 척도
- 4.1.3 n그램 편집 거리
- 4.2 유사 일치 문자열 검색
- 4.2.1 접두사를 사용한 일치 확인을 솔라로 수행
- 4.2.2 접두사 일치를 위한 트라이 사용
- 4.2.3 일치 확인을 위한 n그램 사용
- 4.3 유사 문자열 일치 애플리케이션 작성
- 4.3.1 검색에 사전 입력 추가
- 4.3.2 검색을 위한 질의 철자 검사
- 4.3.3 레코드 일치 확인
- 4.4 정리
- 4.5 참고 자료
- 5장. 인명, 지명. 사물 식별
- 5.1 개체명 인식에 대한 접근법
- 5.1.1 규칙을 사용한 이름 인식
- 5.1.2 이름 인식에 통계적 분류기 사용
- 5.2 OpenNLP를 사용한 기본적인 개체 인식
- 5.2.1 OpenNLP로 이름 찾기
- 5.2.2 OpenNLP로 식별된 이름 해석
- 5.2.3 확률 기반 이름 필터링
- 5.3 OpenNLP를 이용한 심도 있는 개체 식별
- 5.3.1 OpenNLP로 복수의 개체 유형 인식
- 5.3.2 후드 아래: OpenNLP가 이름을 식별하는 방법
- 5.4 OpenNLP의 성능
- 5.4.1 결과의 품질
- 5.4.2 실행 시간 성능
- 5.4.3 OpenNLP의 메모리 사용량
- 5.5 OpenNLP 개체명 식별을 새 도메인의 요구 사항에 맞추기
- 5.5.1 모델 훈련 이유와 방법
- 5.5.2 OpenNLP 모델 훈련
- 5.5.3 모델링 입력 바꾸기
- 5.5.4 이름을 모델로 만드는 새로운 방법
- 5.6 정리
- 5.7 추가 자료
- 6장. 텍스트 클러스터링
- 6.1 구글 뉴스 문서 클러스터링
- 6.2 클러스터링 기초
- 6.2.1 클러스터링의 대상인 세 가지 텍스트 유형
- 6.2.2 클러스터링 알고리즘의 선택
- 6.2.3 유사도 결정
- 6.2.4 결과에 라벨 붙이기
- 6.2.5 클러스터링 결과의 평가 방법
- 6.3 간단한 클러스터링 애플리케이션 설정
- 6.4 Carrot2를 사용한 검색 결과 클러스터링
- 6.4.1 Carrot2 API 사용
- 6.4.2 Carrot2를 사용한 솔라 검색 결과 클러스터링
- 6.5 아파치 머하웃을 사용한 문서 컬렉션 클러스터링
- 6.5.1 클러스터링용 데이터 준비
- 6.5.2 K 평균 클러스터링
- 6.6 아파치 머하웃을 사용한 주제 모델링
- 6.7 클러스터링 성능 분석
- 6.7.1 자질 선택과 축소
- 6.7.2 Carrot2 성능과 품질
- 6.7.3 머하웃 클러스터링 벤치마크
- 6.8 감사의 말
- 6.9 정리
- 6.10 참고 자료
- 7장. 분류, 커테고리 분류, 태깅
- 7.1 분류와 카테고리 분류 소개
- 7.2 분류 과정
- 7.2.1 분류 체계 선택
- 7.2.2 텍스트 카테고리 분류를 위한 자질 찾기
- 7.2.3 훈련 데이터의 중요성
- 7.2.4 분류기 성능 평가
- 7.2.5 분류기를 생산 환경에 배치
- 7.3 아파치 루씬으로 문서 카테고리 분류기 작성
- 7.3.1 루씬으로 텍스트 카테고리 분류
- 7.3.2 MoreLikeThis 카테고리 분류기에 사용할 훈련 데이터 준비
- 7.3.3 MoreLikeThis 분류기 훈련
- 7.3.4 MoreLikeThis 카테고리 분류기로 문서를 카테고리 분류
- 7.3.5 MoreLikeThis 카테고리 분류기 테스트
- 7.3.6 생산 단계에서의 MoreLikeThis
- 7.4 아파치 머하웃으로 나이브 베이즈 분류기 훈련
- 7.4.1 나이브 베이즈 분류 방식으로 텍스트를 카테고리 분류
- 7.4.2 훈련 데이터 준비
- 7.4.3 테스트 데이터 숨겨두기
- 7.4.4 분류기 훈련
- 7.4.5 분류기 테스트
- 7.4.6 부트스트래핑 프로세스 개선
- 7.4.7 솔라와 머하웃 베이즈 분류기 통합
- 7.5 OpenNLP로 문서 카테고리 분류
- 7.5.1 회귀 모델과 최대 엔트로피 문서 카테고리 분류
- 7.5.2 최대 엔트로피 문서 카테고리 분류기를 위해 훈련 데이터 준비
- 7.5.3 최대 엔트로피 문서 카테고리 분류기 훈련
- 7.5.4 최대 엔트로피 분류기 테스트
- 7.5.5 생산 시스템에서의 최대 엔트로피 문서 카테고리 분류
- 7.6 아파치 솔라를 사용하는 태그 추천기 작성
- 7.6.1 태그 추천을 위한 훈련 데이터 수집
- 7.6.2 훈련 데이터 준비
- 7.6.3 솔라 태그 추천기 훈련
- 7.6.4 추천 태그 생성
- 7.6.5 태그 추천기 평가
- 7.7 정리
- 7.8 참고 자료
- 8장. 질의응답 시스템 예제 구축
- 8.1 질의응답 시스템의 기초
- 8.2 QA 코드 설치와 실행
- 8.3 표본 질의응답 아키텍처
- 8.4 질문의 이해와 답변 생성
- 8.4.1 답변 유형 분류기 훈련
- 8.4.2 질의를 청크로 분리
- 8.4.3 답변 유형 계산
- 8.4.4 질의 생성
- 8.4.5 후보 패시지 순위화
- 8.5 시스템 개선을 위한 과정
- 8.6 정리
- 8.7 참고 자료
- 9장. 길들여지지 않는 텍스트: 다음 개척지 탐구
- 9.1 의미론, 담론, 화용론: 고수준 NLP 탐구
- 9.1.1 의미론
- 9.1.2 담화
- 9.1.3 화용론
- 9.2 문서와 컬렉션 요약
- 9.3 관계 추출
- 9.3.1 접근 방식 개요
- 9.3.2 평가
- 9.3.3 관계 추출을 위한 도구
- 9.4 중요한 콘텐츠와 인물 식별
- 9.4.1 전반적 중요도와 권위
- 9.4.2 개인적 중요도
- 9.4.3 중요성에 대한 자료와 포인터
- 9.5 정서 분석을 통해 감정 감지
- 9.5.1 역사와 비평
- 9.5.2 도구와 데이터 요구
- 9.5.3 기본적 극성 알고리즘
- 9.5.4 고급 주제
- 9.5.5 정서 분석을 위한 오픈소스 라이브러리
- 9.6 교차 언어 정보 검색
- 9.7 정리
- 9.8 참고 자료
관련 블로그 글
컴퓨터와 인간의 소통 방법, 자연어 처리
최근 핸드폰, 스피커, 리모콘
등 다양한 기계를 음성 인식으로 조작하는 모습을 쉽게 볼 수 있다.
단순한 기계 조작은 물론이고 실제 사람과 대화하듯이 궁금한 것을 묻고 답하는 것도 가능하다.
이외에도 기계 번역, 챗봇, 검색 엔진 등 다양한 분야에서 자연어 처리 기술을 쉽게 찾아볼 수 있다.
자연어: 일반 사회에서 자연히 발생하여 쓰이는 언어로, 인공적으로 만들어진 언어인 인공어와 구분하여 부르는 개념
인공어: 자연적으로 생성된 자연어와 달리 한 사람이나 여러 사람의 의도와 목적에 따라 만들어진 언어
자연어 처리란 사용자가 입력하는 자연어를 분석하고 처리해 컴퓨터가 이해할 수 있는 형태로 만드는 기술이다.
자연어 처리에는 사람들이 사용하는 다양한 단어와 각 단어가 사용되는 상황, 상호작용하는 방식 등 방대한 양의 언어 데이터가 필요하며, 사용자가 입력한 데이터의 형태, 구문, 의미 등의 분석을 통해 텍스트를 이해하고 적합한 결과를 출력한다.
지난해 10월 구글은 AI 언어 모델인 버트(BERT)를 발표했다.
버트는 구글의 딥러닝 아키텍처인 '트랜스포머'로 구성된 자연어 처리 모델로 대표적인 자연어 처리 평가 지표인 GLUE(General Language Understanding Evaluation)와 SQuAD(Stanford Question Answering Dataset) 중 일부 항목에서 인간보다 뛰어난 성적을 보이면서 많은 주목을 받기도 했다.
활용 사례 1.
태블로 소프트웨어(Tableau Software)는 자연어 질의를 지원하는 애스크 데이터(Ask Data)를 발표했다.
애스크 데이터를 사용해 확인하고 싶은 내용을 입력하면 그에 대한 답변을 시각화 자료로 보여준다.
활용 사례 2.
아시아나항공의 챗봇 서비스 아론(Aron)에서는 간단한 문의는 물론 항공권 예약과 구매까지 가능해졌다.
아론은 애저(Azure)와 루이스(LUIS)를 활용해 개발됐으며, 다양한 메신저와 애플리케이션을 통해 서비스를 제공하고 있다.
활용 사례 3.
퀄컴 테크놀로지는 아마존의 '알렉사 보이스 서비스' 개발 키트를 기반으로 개발한 퀄컴 스마트 오디오 플랫폼을 시연했다.
차량에 설치된 스마트 오디오 플랫폼을 통해 음성으로 길을 검색하거나 음악, 영상을 재상할 수도 있다.
자연어 처리 with 파이썬은 파이썬과 자연어 툴킷(NLTK)을 이용해 자연어 처리(NLP)를 수행하는 다양한 방법을 알려주는 독창적인 레시피가 담긴 책이다.
자연어 이해, 자연어 처리, 구문 분석 등 다양한 주제를 포함해 실용적인 감정 분석부터 최신 딥러닝 기술의 적용 방법까지 자연어를 다루는 데 사용할 수 있는 60여 개의 레시피를 접할 수 있다.
자연어 처리에 관심이 있는 독자라면 이 책을 통해 다양한 상황에서 자연어 처리를 어떻게 구현하는지 확인해보자.
크리에이티브 커먼즈 라이센스 이 저작물은 크리에이티브 커먼즈 코리아 저작자표시 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
도서 오류 신고
정오표
정오표
[p.114 : 본문 3행]
컬렉션을 받는 데만 SolrServer의 add 메소드를 사용하라.
->
간단히 컬렉션을 받는 SolrServer의 add 메소드를 사용하면 된다.