분류 전체보기

    [챗봇]. BERT 임베딩 벡터를(Embedding Vectors) RDBMS의 저장해야하는 이유

    챗봇을 개발하다 보면 정확도보다 속도가 더 중요하다는 생각을 하게 된다. 인공지능과 채팅을 하는데 허무맹랑한 소리를 하는 건 어느 정도 유저가 인용해 줄 수 있지만 인공지능이 답장을 느리게 하는 것은 사실상 하는 이유가 없기 때문이다. 검색 기반 챗봇 - 우리 서비스는 생성모델이 아닌 검색모델을 사용하여 챗봇을 개발하였음 위에서 말했듯이 챗봇은 정확도 보다 속도를 우선시하게 되는 데 그래서 우리는(Bi-Encoder) 방식을 채택하여 빠른 속도를 우선시했다. *Bi-Encoder : 임베딩 값을 미리 구해놓기 때문에 속도가 빠른 장점이 있지만 미리 구한 임베딩 값을 저장할 공간이 필요함. Bi-Encoder로 구현했지만 서버에서 실행을 했더니 임베딩 값(numpy)이 많은 메모리를 점유하고 있었다. (메..

    [NLP]. 도로명 주소 & 지번 주소 인식 정규표현식

    출처 : 당근마켓 블로그 https://medium.com/daangn/%EC%A3%BC%EC%86%8C-%EC%9D%B8%EC%8B%9D%EC%9D%84-%EC%9C%84%ED%95%9C-%EC%82%BD%EC%A7%88%EC%9D%98-%EA%B8%B0%EB%A1%9D-df2d8f82d25 import re input_text = "인천광역시 부평구 안남로 123 행복아파트 101동 101호" address = re.compile("(([가-힣A-Za-z·\d~\-\.]{2,}(로|길).[\d]+)|([가-힣A-Za-z·\d~\-\.]+(읍|동)\s)[\d]+)") address.search(input_text) 결과 :

    [NLP] Fine-tuning(파인튜닝)과 in-context learning(인컨텍스트 러닝)

    대규모 사전 학습 언어모델이 다운스트림 태스크를 학습하는 방식은 크게 3가지가 있습니다. Fine-tuning : 다운스트림 태스크 데이터 전체를 사용합니다. 다운 스트림 데이터에 맞게 모델 전체을 업데이트합니다. - 문서 분류 , 자연어 추론 , 질의응답 , 문장 생성 Prompt tuning : 다운스트림 태스크 데이터 전체를 사용합니다. 다운스트림 데이터에 맞게 모델 일부만 업데이트합니다. In-context learning : 다운스트림 태스크 데이터의 일부만 사용합니다. 모델을 업데이트하지 않습니다. 파인튜닝 방식으로 모델 전체를 업데이트 하려면 많은 비용이 듭니다. 파인튜닝 말고도 다른 방식이 주목받는 이유는 비용과 성능 때문입니다. 최근 언어 모델의 크기가 기하급수적으로 커지고 있고 파인튜닝..

    [ElasticSearch]. 엘라스틱 서치 서버 셋팅하기

    서버 셋팅 환경 : Linux(Centos) Wget 설치 : sudo yum install wget 엘라스틱 서치 다운로드 : wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.15.2-linux-x86_64.tar.gz 키바나 다운로드 : wget https://artifacts.elastic.co/downloads/kibana/kibana-7.15.2-linux-x86_64.tar.gz * 엘라스틱 서치와 키바나는 같은 버전이여야함. 압축해제 : tar xfz elasticsearch-7.15.2-linux-x86_64.tar.gz 이름 변경 : mv elasticsearch-7.15.2 /es-715 mv kiban..

    Ngrok 사용하여 내 PC를 서버로 사용하기

    로컬 네트워크 터널링 하기 https://brunch.co.kr/@bluearin/13 Ngrok 사용하여 개발하기 로컬 네트워크 터널링 하기 | 웹사이트나 API 서버를 개발할 때 일반적으로는 로컬 개발환경을 구축하고 개발을 진행합니다. 하지만 때에 따라서는 외부 서비스와 연동을 하거나 외부에서 접근 brunch.co.kr

    [챗봇]. 대화 텍스트 길이(length)에 대한 패널티(penalty)를 주는 방법

    Retrival 기반의 챗봇을 개발하다 보면 정확도(질문의 유사도)를 가지고 유사도가 가장 비슷한 질문을 찾아서 해당하는 답변을 리턴해주는 방식을 많이 사용하곤 한다. (유사도를 구하는 방법은 매우 다양함) 하지만 유사도가 높다고 해서 "좋은 답변"일까? 챗봇의 성능이 아무리 좋다고 하더라도 단답이나 장문의 답을 한다면 좋은 챗봇이 아니라고 생각한다. 챗봇이 아니라 일상 대화에서도 단답형 : Q : 너 밥 먹었어? A : 응.... , 네.... , 예~.... 장답형 : Q : 너 밥 먹었어? A : 밥을 먹었는데 밥은 현미밥이었고 반찬은 내가 좋아하는 ~~ 그런데 밥 먹다가 전화가 와서 전화를 받다가 다시 밥을 먹고~~ 주절주절 이렇게 얘기를 하면 대화가 단절되거나 어떻게 답해야 할지 모를 것이다. ..

    [annotation]. 텍스트 데이터 라벨링 꿀팁(2)

    https://unikys.tistory.com/307 [엑셀] 매크로로 선택영역의 특정 문자만 색 변환하기 * 목표: 엑셀에서 선택한 영역을 가져와서 각 문자열의 문자 중에 입력한 단어가 있으면 색을 변환하는 매크로 작성 * 작성 환경: 엑셀 2010 : 예를 들면 아래와 같은 엑셀이 있을 경우 'fer'를 빨간 unikys.tistory.com 전 포스팅에서 키워드들 통한 라벨링 진행 방법을 소개했다. 하지만 문장의 길이가 길 수록 해당 키워드가 어디에 위치하고있는지 찾기가 너무 힘들었다. 문장의 길이가 길면 그 만큼 라벨링 속도 저하 발생...ㅠㅠ 그렇다고 대충보기에는 모호한 데이터들이 많았다. "뒤지" 키워드의 경우 1) 너 뒤지고 싶냐? 2) 방을 다 뒤지고 나서도 찾을 수 없었어. 이런 키워드..

    [annotation]. 텍스트 데이터 라벨링 꿀팁(1)

    어노테이션은 머신러닝개발자에게는 숙명과도 같은 일이다. 가장 단순하지만 가장 중요한 작업 하지만 너무나도 지루한 건 사실이지만 정신줄을 놓으면 안된다. 그래서 텍스트 데이터를 라벨링할때 항상 효과적인 방법을 머리속으로 생각했다. (지루하니까 최대한 정확하고 빨리하는 방법 ) 나는 공격적인 단어를 필터링하는 검수작업을 맡게 되었는데. 먼저 키위드를 수집했다. 키워드 수집 키워드는 기존 딥러닝 모델의 예측 결과로 나온 것들 중 경계선에 있는 데이터들을 통해 수집했다. 이걸 Active Learning 이라고 한다. 위에서 경계선이 있는 데이터들은 즉 , 모델이 해깔려하는 데이터를 사용했다는 것이다. 경계선 라벨링 -> 데이터 추가 -> 학습 -> 예측 -> 경계선 라벨링 여기서 경계선 라벨링은 하지않고 경계..

    [NLP]. 한국어 맞춤법 검사기 사용하기 (feat. hanspell )

    오픈 소스 링크 : https://github.com/ssut/py-hanspell from hanspell import spell_checker 위 오픈소스는 네이버 맞춤법 검사기 API의 요청을 보내서 결과를 반환하는 오픈소스이다. 네이버 웹페이지에서 사용한 맞춤법검사기와 결과가 동일하다고 볼 수 잇다. 네이버 맞춤법 검사기의 오류로는 4가지가 있다. 오류 없음 .PASSED 맞춤법 검사 결과 문제가 없는 단어 또는 구절 맞춤법 오류 .WRONG_SPELLING 맞춤법에 문제가 있는 단어 또는 구절 띄어쓰기 오류 .WRONG_SPACING 띄어쓰기에 문제가 있는 단어 또는 구절 표준어 의심 오류 .AMBIGUOUS 표준어가 의심되는 단어 또는 구절 통계적 교정 오류 .STATISTICAL_CORREC..

    [pandas]. 사용자의 합계를 구해서 칼럼 추가하기 (feat. groupBy)

    예시 데이터 import pandas as pd df = pd.DataFrame({"name" : ["Lucas " , "Declan ", "Declan " , "Lucas " , 'Elliot' , 'Owen','Oskar','Oskar'] , "exercise_hour" : [1,2,1,3,4,1,1,2]} ) 이름 별로 합산 운동시간을 옆에 표시하고자함. exercise_sum = df.groupby(['name']).sum().sort_values('exercise_hour',ascending=False).reset_index() GroupBy 를 통해서 같은 이름별 합산을 구함. *reset_index()는 groupby를 하면 인덱스가 묶여서 풀어주기 위함. 이름과 시간을 Key , Value..