The removal of stopwords is handled by the stop
token filter which can be used when creating a custom
analyzer (see Using the stop Token Filter). However, some out-of-the-box analyzers come with the stop
filter pre-integrated:
불용어의 제거는, 사용자 정의(custom)
analyzer(Using the stop Token Filter 참조)를 생성하는 경우 사용될 수 있는, stop
token filter에 의해 처리된다. 그러나, 몇몇 내장된 analyzer는 stop
filter가 이미 통합되어 들어 있다.
- Language analyzers
Each language analyzer defaults to using the appropriate stopwords list for that language. For instance, the
english
analyzer uses the_english_
stopwords list.각 language analyzer는, 해당 언어에 대해, 적절한 불용어 목록을 사용하는 것이 기본이다. 예를 들어,
english
analyzer는_english_
불용어 목록을 사용한다.standard
analyzerDefaults to the empty stopwords list:
_none_
, essentially disabling stopwords.비어 있는 불용어 목록
_none_
이 기본값이다. 기본적으로 불용어는 비활성화되어 있다.pattern
analyzerDefaults to
_none_
, like thestandard
analyzer.standard
analyzer와 마찬가지로,_none_
이 기본값이다.
Stopwords and the Standard Analyzeredit
To use custom stopwords in conjunction with the standard
analyzer, all we need to do is to create a configured version of the analyzer and pass in the list of stopwords
that we require:
standard
analyzer와 함께 사용자 정의 불용어를 사용하기 위해서, analyzer의 설정을 가진 버전을 생성하고, 필요한 불용어
의 목록을 넘겨야 한다.
PUT /my_index { "settings": { "analysis": { "analyzer": { "my_analyzer": { "type": "standard", "stopwords": [ "and", "the" ] } } } } }
이것은 | |
이 analyzer는 사용자 정의 설정을 가지는 | |
걸러낼 불용어는 |
This same technique can be used to configure custom stopword lists for any of the language analyzers.
이 같은 기술은, 사용자 정의 불용어 목록을 설정하기 위해, 모든 language analyzer에 사용될 수 있다.
Maintaining Positionsedit
The output from the analyze
API is quite interesting:
GET /my_index/_analyze?analyzer=my_analyzer The quick and the dead
{ "tokens": [ { "token": "quick", "start_offset": 4, "end_offset": 9, "type": "<ALPHANUM>", "position": 1 }, { "token": "dead", "start_offset": 18, "end_offset": 22, "type": "<ALPHANUM>", "position": 4 } ] }
The stopwords have been filtered out, as expected, but the interesting part is that the position
of the two remaining terms is unchanged: quick
is the second word in the original sentence, and dead
is the fifth. This is important for phrase queries—if the positions of each term had been adjusted, a phrase query for quick dead
would have matched the preceding example incorrectly.
기대했던 대로, 불용어는 걸러졌다. 그러나 흥미로운 부분은, 2개의 남아 있는 단어의 position
이 변하지 않았다는 점이다. 원래의 문장에서 quick
은 두 번째 단어이고, dead
는 다섯 번째 단어이다. 이것은 phrase query에서 중요하다. 각 단어의 위치가 보정된다면, quick dead
에 대한 phrase query는 이전의 예제와 올바르지 않게 일치할 것이다.
Specifying Stopwordsedit
Stopwords can be passed inline, as we did in the previous example, by specifying an array:
앞의 예에서 보았듯이, 불용어는 배열을 지정하여, inline으로 전달될 수 있다.
"stopwords": [ "and", "the" ]
The default stopword list for a particular language can be specified using the _lang_
notation:
특정 언어에 대한 기본 불용어 목록은 _lang_
표기법을 이용하여 지정할 수 있다.
"stopwords": "_english_"
The predefined language-specific stopword lists available in Elasticsearch can be found in the stop
token filter documentation.
Elasticsearch에서 이용할 수 있는, 미리 정의된 언어별 불용어 목록은 stop
token filter에서 찾을 수 있다.
Stopwords can be disabled by specifying the special list: _none_
. For instance, to use the english
analyzer without stopwords, you can do the following:
불용어는 특별한 목록 _none_
을 지정하여, 비활성화될 수 있다. 예를 들어, 불용어 없는 english
analyzer를 사용하려면, 아래와 같이 할 수 있다.
PUT /my_index { "settings": { "analysis": { "analyzer": { "my_english": { "type": "english", "stopwords": "_none_" } } } } }
Finally, stopwords can also be listed in a file with one word per line. The file must be present on all nodes in the cluster, and the path can be specified with the stopwords_path
parameter:
마지막으로, 불용어는 한 라인에 한 단어씩 작성된 파일에 나열할 수도 있다. 파일은 cluster의 모든 node에 있어야 한다. 그리고, 그 경로는 stopwords_path
매개변수에 지정할 수 있다.
Using the stop Token Filteredit
The stop
token filter can be combined with a tokenizer and other token filters when you need to create a custom
analyzer. For instance, let’s say that we wanted to create a Spanish analyzer with the following:
stop
token filter는, 사용자 정의(custom)
analyzer를 생성할 경우, tokenizer와 다른 token filter를 조합될 수 있다. 예를 들어, 다음과 같은 요구 사항을 가지는, 스페인어(Spanish) analyzer를 생성한다고 가정해 보자.
A custom stopwords list
사용자 정의 불용어 목록
The
light_spanish
stemmerlight_spanish
형태소 분석기The
asciifolding
filter to remove diacritics발음 구별 부호를 제거하기 위한
asciifolding
filter
We could set that up as follows:
아래처럼 설정할 수 있다.
PUT /my_index { "settings": { "analysis": { "filter": { "spanish_stop": { "type": "stop", "stopwords": [ "si", "esta", "el", "la" ] }, "light_spanish": { "type": "stemmer", "language": "light_spanish" } }, "analyzer": { "my_spanish": { "tokenizer": "spanish", "filter": [ "lowercase", "asciifolding", "spanish_stop", "light_spanish" ] } } } } }
| |
Algorithmic Stemmers를 참고하자. | |
token filter의 순서가 중요하다. 아래에서 설명하겠다. |
We have placed the spanish_stop
filter after the asciifolding
filter. This means that esta
, ésta
, and está
will first have their diacritics removed to become just esta
, which will then be removed as a stopword. If, instead, we wanted to remove esta
and ésta
, but not está
, we would have to put the spanish_stop
filter before the asciifolding
filter, and specify both words in the stopwords list.
asciifolding
filter 다음에 spanish_stop
filter를 두었다. 즉, esta
, ésta
그리고 está
는 먼저 발음 구별 부호가 제거되어, esta
가 된다. 그 다음에 불용어로 제거된다. esta
, ésta
는 제거되고 está
는 그렇지 않기를 원한다면, asciifolding
filter 전에 spanish_stop
filter를 두어야 한다. 그리고 두 단어 모두를 불용어 목록에 지정해야 한다.
Updating Stopwordsedit
A few techniques can be used to update the list of stopwords used by an analyzer. Analyzers are instantiated at index creation time, when a node is restarted, or when a closed index is reopened.
analyzer에 의해 사용되는 불용어 목록을 업데이트하기 위해, 몇 가지 기술이 사용될 수 있다. analyzer는 index 생성시에, node가 다시 시작되거나, index를 닫았다가 다시 열 때 인스턴스화 된다.
If you specify stopwords inline with the stopwords
parameter, your only option is to close the index and update the analyzer configuration with the update index settings API, then reopen the index.
불용어를 stopwords
매개변수에 inline으로 지정했다면, index를 닫고, update index settings API를 이용해 analyzer 설정을 업데이트하고, index를 다시 여는 것이 유일한 방법이다.
Updating stopwords is easier if you specify them in a file with the stopwords_path
parameter. You can just update the file (on every node in the cluster) and then force the analyzers to be re-created by either of these actions:
stopwords_path
매개변수를 이용해, 파일에 불용어를 지정했다면, 업데이트하는 것은 더 쉽다. (cluster의 모든 node에) 단지 파일을 업데이트하고, 아래 두 가지 방법 중 하나로, analyzer를 강제로 다시 생성하면 된다.
Closing and reopening the index (see open/close index), or
index를 닫았다가 다시 연다. (open/close index 참조), 또는
Restarting each node in the cluster, one by one
cluster의 각 node를 차례로 다시 시작한다.
Of course, updating the stopwords list will not change any documents that have already been indexed. It will apply only to searches and to new or updated documents. To apply the changes to existing documents, you will need to reindex your data. See Reindexing Your Data.
물론, 불용어 목록을 업데이트하는 것이 이미 색인된 document를 변경하는 것은 아니다. 그것은 검색이나 새로운 혹은 업데이트된 document에게만 적용된다. 기존 document에 변경 사항을 적용하기 위해서는, 데이터를 다시 색인 해야 한다. Reindexing Your Data을 참고하자.
'2.X > 3. Dealing with Human Language' 카테고리의 다른 글
3-5. Stopwords: Performance Versus Precision (0) | 2017.09.24 |
---|---|
3-5-1. Pros and Cons of Stopwords (0) | 2017.09.24 |
3-5-3. Stopwords and Performance (0) | 2017.09.24 |
3-5-4. Divide and Conquer (0) | 2017.09.24 |
3-5-5. Stopwords and Phrase Queries (0) | 2017.09.24 |