Apple (Inc.)에 대한 트윗과 사과 (과일)에 대한 트윗을 구분하는 모델을 구축하려면 어떻게해야합니까?


85

"apple"에 대한 50 개의 트윗은 아래를 참조하십시오. Apple Inc.에 대한 긍정적 인 일치 항목을 손으로 표시했습니다. 아래 1 개로 표시되어 있습니다.

다음은 몇 줄입니다.

1|“@chrisgilmer: Apple targets big business with new iOS 7 features http://bit.ly/15F9JeF ”. Finally.. A corp iTunes account!
0|“@Zach_Paull: When did green skittles change from lime to green apple? #notafan” @Skittles
1|@dtfcdvEric: @MaroneyFan11 apple inc is searching for people to help and tryout all their upcoming tablet within our own net page No.
0|@STFUTimothy have you tried apple pie shine?
1|#SuryaRay #India Microsoft to bring Xbox and PC games to Apple, Android phones: Report: Microsoft Corp... http://dlvr.it/3YvbQx  @SuryaRay

전체 데이터 세트는 다음과 같습니다. http://pastebin.com/eJuEb4eB

"Apple"(Inc)을 분류하는 모델을 구축해야합니다. 나머지에서.

저는 기계 학습의 일반적인 개요를 찾고있는 것이 아니라 코드에서 실제 모델을 찾고 있습니다 ( Python 선호).


18
: 당신은 기본적으로이 원하는 en.wikipedia.org/wiki/Bayesian_spam_filtering
EDDI

1
데이터에 레이블을 직접 지정하지만 확장 가능한 라이브러리를 원합니다. 감독 대상입니까, 아니면 감독 대상입니까?
dan

1
에디, 의견 주셔서 감사합니다. 메일 필터링 이메일이 내 뇌에서 뭔가 클릭하는 데 정말 도움이되었습니다. 저는 제가하려는 일의 실제 사례를 볼 수 있었고 다르게 적용했습니다.
SAL

5
명명 된 엔티티 인식 : nlp.stanford.edu/software/CRF-NER.shtml .
Neil McGuigan

1
매혹적인 @NeilMcGuigan. 데모 ( nlp.stanford.edu:8080/ner/process ) 에 일부 텍스트를 붙여 넣었고 여러 모델에서 단어를 분류하는 방법에 깊은 인상을 받았습니다.
Ryan

답변:


39

다음과 같이 할 것입니다.

  1. 문장을 단어로 나누고, 정규화하고, 사전을 만듭니다.
  2. 각 단어마다 회사에 대한 트윗에서 발생한 횟수와 과일에 대한 트윗에 나타난 횟수를 저장합니다.이 트윗은 사람이 확인해야합니다.
  3. 새 트윗이 들어 오면 사전에서 트윗의 모든 단어를 찾아 가중치가 부여 된 점수를 계산합니다. 회사와 관련하여 자주 사용되는 단어는 높은 회사 점수를 받게되고 그 반대의 경우도 마찬가지입니다. 드물게 사용되거나 회사와 과일 모두에서 사용되는 단어는 점수가별로 없습니다.

2
이에 대한 귀하의 답변에 감사드립니다. 위의 의견과 함께 귀하의 답변은 실제로 해결책을 찾는 데 도움이되었습니다. 이 솔루션을 개선하는 데 도움을 줄 수 있습니까?
SAL

10
베이지안 분류에 대한 비공식적 인 설명입니다.
sanityinc

1
나는 :) "베이지안 분류의 의사 코드 구현"을 선호
AMADANON Inc.가

73

당신이 찾고있는 것을 명명 된 엔티티 인식 이라고 합니다. 명명 된 엔터티에 대해 학습하도록 훈련 된 것을 기반으로 조건부 랜덤 필드 를 사용 하여 명명 된 엔터티를 찾는 통계 기법입니다 .

기본적으로 단어 의 내용과 문맥 을 살펴보고 (몇 단어 앞뒤로) 단어가 명명 된 개체 일 확률을 추정합니다.

좋은 소프트웨어는 길이나 모양과 같은 단어의 다른 기능을 볼 수 있습니다 (예 : "Vowel-consonant-vowel"로 시작하는 경우 "Vcv").

아주 좋은 도서관 (GPL)은 스탠포드의 NER입니다.

데모 : http://nlp.stanford.edu:8080/ner/

시도 할 몇 가지 샘플 텍스트 :

애플 본사에서 사과를 먹고 있었는데 Coldplay 남자의 딸인 Apple Martin에 대해 생각했습니다.

(3class 및 4class 분류 기가 올바르게 이해합니다)


5
정말 흥미로 웠습니다. 에 대한 코드를 볼 수 english.conll.4class.distsim.crf.ser.gz있습니까? 나는 이와 같은 것을 어떻게 만드는지보고 싶다.
Ryan

NER의 코드는 오픈 소스이지만 CONLL 회의에서 사용한 데이터는 아닙니다. 그러나 NIST에서 온라인으로 Reuters Corpus를 찾을 수 있습니다.
Neil McGuigan 2013

31

나는 scikit-learn을 사용하여 오픈 소스로이 문제를 해결하는 반 작업 시스템을 가지고 있으며, 내가하고있는 일을 설명하는 일련의 블로그 게시물을 가지고 있습니다. 내가 다루고있는 문제는 단어 감지 명확성 (여러 단어 감지 옵션 중 하나 선택)인데, 이는 Named Entity Recognition과 동일하지 않습니다. 내 기본 접근 방식은 기존 솔루션과 다소 경쟁적이며 (중요하게) 사용자 지정할 수 있습니다.

충분한 상업적 결과를 제공 할 수있는 기존의 상용 NER 도구 (OpenCalais, DBPedia Spotlight 및 AlchemyAPI)가 있습니다. 먼저 시도해보세요!

나는 이들 중 일부를 클라이언트 프로젝트에 사용했지만 (런던에서 NLP / ML을 사용하여 문의), 그들의 리콜 ( 정밀도 및 리콜 )에 만족하지 않았습니다 . 기본적으로 정확할 수 있지만 ( "This is Apple Inc"라고 말하면 일반적으로 정확함) 회상이 낮습니다 (사람에게 트윗이 Apple Inc에 대한 것이 분명하더라도 "This is Apple Inc"라고 거의 말하지 않음). 나는 트윗에 맞춘 오픈 소스 버전을 만드는 것이 지적으로 흥미로운 연습이라고 생각했습니다. 현재 코드는 다음과 같습니다. https://github.com/ianozsvald/social_media_brand_disambiguator

저는이 접근 방식으로 일반화 된 단어 의미 명확화 문제를 해결하려고하는 것이 아니라 이미 이름이있을 때 브랜드 명확성 (회사, 사람 등) 만 해결합니다. 이것이 바로이 간단한 접근 방식이 효과가 있다고 믿는 이유입니다.

6 주 전에 시작했으며 scikit-learn을 사용하여 Python 2.7로 작성되었습니다. 매우 기본적인 접근 방식을 사용합니다. 1-3 n-grams 로 이진 카운트 벡터 라이저를 사용하여 벡터화합니다 (단어가 나타나는지 여부 만 계산하고 몇 번은 계산하지 않음)  . 저는 TF-IDF로 확장하지 않습니다 (문서 길이가 가변적 일 때 TF-IDF가 좋습니다. 저에게 트윗은 한두 문장 일 뿐이며 테스트 결과는 TF-IDF로 개선되지 않았습니다).

매우 기본적이지만 놀랍도록 유용한 기본 토크 나이저를 사용합니다. @ #을 무시하고 (따라서 일부 컨텍스트를 잃음) 물론 URL을 확장하지 않습니다. 그런 다음 로지스틱 회귀를 사용하여 훈련하면 이 문제가 다소 선형 적으로 분리 될 수있는 것 같습니다 (한 클래스에 대한 많은 용어가 다른 클래스에 대해 존재하지 않음). 현재 나는 어떤 형태소 제거 / 청소를 피하고 있습니다 (나는 작동 할 수있는 가장 간단한 방법을 시도하고 있습니다).

코드에는 전체 README가 있으며, 상대적으로 쉽게 트윗을 수집 한 다음 테스트를위한 제 제안을 따를 수 있어야합니다.

이것은 사람들이 Apple 컴퓨터를 먹거나 마시지 않고 과일을 입력하거나 가지고 놀지 않기 때문에 Apple에 효과적입니다. 따라서 단어는 한 범주 또는 다른 범주로 쉽게 분리됩니다. 이 조건은 TV 쇼의 #definance (사람들이 아랍의 봄, 크리켓 경기, 시험 수정 및 음악 밴드와 관련하여 #definance를 사용하는 경우)와 같은 것을 고려할 때 유지되지 않을 수 있습니다. 여기에 더 영리한 접근 방식이 필요할 수 있습니다.

나는이 블로그 게시물의 일련의 난 (DataScienceLondon 140 명 짧은 프리젠 테이션으로 전환)을 BrightonPython의 사용자 그룹에 준 한 시간 동안 프리젠 테이션을 포함하여이 프로젝트를 설명합니다.

LogisticRegression (각 분류에 대한 확률을 얻음)과 같은 것을 사용하는 경우 신뢰할 수있는 분류 만 선택할 수 있으며 그렇게하면 리콜과 거래하여 높은 정밀도를 강제 할 수 있습니다 (따라서 정확한 결과를 얻을 수 있지만 결과는 더 적음). 이를 시스템에 맞게 조정해야합니다.

다음은 scikit-learn을 사용하는 가능한 알고리즘 접근 방식입니다.

  • Binary CountVectorizer를 사용하십시오 (대부분의 단어가 한 번만 발생하므로 짧은 메시지의 용어 계수가 많은 정보를 추가한다고 생각하지 않습니다)
  • 의사 결정 트리 분류기로 시작하십시오. 설명 할 수있는 성능을 제공합니다 ( 예 는 의사 결정 트리과적 합 참조 ).
  • 로지스틱 회귀로 이동
  • 분류 자에 의해 생성 된 오류를 조사합니다 (DecisionTree의 내 보낸 출력을 읽거나 LogisticRegression의 계수를보고, Vectorizer를 통해 잘못 분류 된 트윗을 다시 작업하여 기본 Bag of Words 표현이 어떻게 생겼는지 확인합니다. 당신은 원시 트윗에서 시작했습니다-분류에 충분합니까?)
  • 이 접근 방식의 작동 버전은 https://github.com/ianozsvald/social_media_brand_disambiguator/blob/master/learn1.py의 예제 코드를 참조하십시오.

고려할 사항 :

  • 더 큰 데이터 세트가 필요합니다. 저는 2000 개의 레이블이있는 트윗을 사용하고 있습니다 (5 시간이 걸렸습니다). 최소한 클래스 당 100 개 이상의 균형 잡힌 세트를 원합니다 (아래의 과적 합 참고 참조).
  • tokeniser를 개선하여 (scikit-learn으로 매우 쉽게) # @ 토큰을 유지하고 대문자 브랜드 탐지기를 추가 할 수 있습니다 (사용자 @ user2425429가 메모 함).
  • 일이 더 어려워 질 때 비선형 분류기 (위의 @oiez의 제안과 같은)를 고려하십시오. 개인적으로 LinearSVC가 로지스틱 회귀보다 더 나쁘다는 것을 발견했습니다 (하지만 아직 축소하지 않은 고차원 기능 공간 때문일 수 있습니다).
  • 트윗 특정 부분의 음성 태거 (@Neil이 제안한 것처럼 Standford가 아닌 겸손한 의견으로는 내 경험상 트위터 문법이 좋지 않음)
  • 토큰이 많으면 차원 축소를 원할 것입니다 (아직 시도하지 않았습니다-LogisticRegression l1 l2 패널티에 대한 내 블로그 게시물 참조).

레. 과적 합. 2000 개의 항목이있는 데이터 세트에는 Twitter에서 'apple'트윗의 10 분 스냅 샷이 있습니다. 트윗의 약 2/3는 Apple Inc 용이고 1/3은 다른 사과 용입니다. 각 클래스의 균형 잡힌 하위 집합 (내 생각에는 약 584 행)을 추출하고 훈련을 위해 5 중 교차 검증을 수행합니다.

나는 10 분의 시간 창을 가지고 있기 때문에 동일한 주제에 대한 많은 트윗을 가지고 있으며 이것이 아마도 내 분류 기가 기존 도구에 비해 잘 작동하는 이유 일 것입니다. 도구는이 snapshop에서 성능이 더 나쁘지만 더 광범위한 데이터 세트에서 더 안정적입니다. 이후 작업으로이를 테스트하기 위해 시간 창을 확장 할 것입니다.


나는 당신의 코드를 살펴보고 복제 / 에뮬레이션 / 교육을 시도하는 즐거움을 얻지 못했지만, 현상금의 전체 50 점을주지 않은 것에 대해 사과 할 빚이 있습니다. 나는 주말 동안 SO에서 떨어져 있었고 그것을 수여하는 마감일을 놓쳤다. 고맙게도 SO 커뮤니티가 참여하여 25 점을받을 수 있습니다.
Ryan

1
문제 없습니다 :-) 코드, README 및 블로그 게시물을 통해 내 접근 방식에 대한 아이디어를 얻을 수 있습니다. 의도적으로 간단하지만 잘 작동하는 것 같습니다.
Ian Ozsvald

12

다음을 수행 할 수 있습니다.

  1. 과일 및 회사 관련 트윗에서 발생 횟수를 포함하는 단어의 사전을 만드십시오. 이는 우리가 알고있는 성향을 가진 샘플 트윗을 제공함으로써 달성 할 수 있습니다.

  2. 충분한 이전 데이터를 사용하여 apple inc에 대한 트윗에서 단어가 발생할 확률을 알아낼 수 있습니다.

  3. 단어의 개별 확률을 곱하여 전체 트윗의 확률을 얻습니다.

간단한 예 :

p_f = 과일 트윗의 확률.

p_w_f = 과일 트윗에서 단어가 나올 확률.

p_t_f = 트윗에 포함 된 모든 단어가 과일 트윗을 올릴 확률의 결합 = p_w1_f * p_w2_f * ...

p_f_t = 특정 트윗이 ​​주어진 과일의 확률.

p_c, p_w_c, p_t_c, p_c_t 는 각 회사의 값입니다.

데이터베이스에없는 새로운 단어의 빈도가 0 인 문제를 제거하기 위해 값 1의 라플라시안 스무더가 추가되었습니다.

old_tweets = {'apple pie sweet potatoe cake baby https://vine.co/v/hzBaWVA3IE3': '0', ...}
known_words = {}
total_company_tweets = total_fruit_tweets =total_company_words = total_fruit_words = 0

for tweet in old_tweets:
    company = old_tweets[tweet]
    for word in tweet.lower().split(" "):
        if not word in known_words:
            known_words[word] = {"company":0, "fruit":0 }
        if company == "1":
            known_words[word]["company"] += 1
            total_company_words += 1
        else:
            known_words[word]["fruit"] += 1
            total_fruit_words += 1

    if company == "1":
        total_company_tweets += 1
    else:
        total_fruit_tweets += 1
total_tweets = len(old_tweets)

def predict_tweet(new_tweet,K=1):
    p_f = (total_fruit_tweets+K)/(total_tweets+K*2)
    p_c = (total_company_tweets+K)/(total_tweets+K*2)
    new_words = new_tweet.lower().split(" ")

    p_t_f = p_t_c = 1
    for word in new_words:
        try:
            wordFound = known_words[word]
        except KeyError:
            wordFound = {'fruit':0,'company':0}
        p_w_f = (wordFound['fruit']+K)/(total_fruit_words+K*(len(known_words)))
        p_w_c = (wordFound['company']+K)/(total_company_words+K*(len(known_words)))
    p_t_f *= p_w_f
    p_t_c *= p_w_c

    #Applying bayes rule
    p_f_t = p_f * p_t_f/(p_t_f*p_f + p_t_c*p_c)
    p_c_t = p_c * p_t_c/(p_t_f*p_f + p_t_c*p_c)
    if p_c_t > p_f_t:
        return "Company"
    return "Fruit"

9

외부 라이브러리를 사용하는 데 문제가 없다면 scikit-learn을 권장 합니다. 아마도 직접 코딩 할 수있는 것보다 더 빠르고 더 빠르게 할 수 있기 때문입니다. 나는 다음과 같이 할 것입니다.

말뭉치를 구축하십시오. 명확성을 위해 목록 이해를 수행했지만 데이터 저장 방법에 따라 다른 작업을 수행해야 할 수도 있습니다.

def corpus_builder(apple_inc_tweets, apple_fruit_tweets):
    corpus = [tweet for tweet in apple_inc_tweets] + [tweet for tweet in apple_fruit_tweets]
    labels = [1 for x in xrange(len(apple_inc_tweets))] + [0 for x in xrange(len(apple_fruit_tweets))]
    return (corpus, labels)

중요한 것은 다음과 같은 두 개의 목록으로 끝납니다.

([['apple inc tweet i love ios and iphones'], ['apple iphones are great'], ['apple fruit tweet i love pie'], ['apple pie is great']], [1, 1, 0, 0])

[1, 1, 0, 0]은 양수 및 음수 레이블을 나타냅니다.

그런 다음 파이프 라인을 만듭니다! Pipeline은 텍스트 처리 단계를 쉽게 연결할 수 있도록하는 scikit-learn 클래스이므로 학습 / 예측할 ​​때 하나의 객체 만 호출하면됩니다.

def train(corpus, labels)
    pipe = Pipeline([('vect', CountVectorizer(ngram_range=(1, 3), stop_words='english')),
                        ('tfidf', TfidfTransformer(norm='l2')),
                        ('clf', LinearSVC()),])
    pipe.fit_transform(corpus, labels)
    return pipe

파이프 라인 내부에는 세 가지 처리 단계가 있습니다. CountVectorizer는 단어를 토큰 화하고, 분할하고, 개수를 세고, 데이터를 희소 행렬로 변환합니다. TfidfTransformer는 선택 사항이며 정확도 등급에 따라 제거 할 수 있습니다 (교차 검증 테스트 및 최상의 매개 변수에 대한 그리드 검색이 약간 관련되어 있으므로 여기서 다루지 않겠습니다). LinearSVC는 표준 텍스트 분류 알고리즘입니다.

마지막으로 트윗 카테고리를 예측합니다.

def predict(pipe, tweet):
    prediction = pipe.predict([tweet])
    return prediction

다시 말하지만 트윗은 목록에 있어야하므로 함수를 문자열로 입력한다고 가정했습니다.

그 모든 것을 수업이나 다른 것에 넣으면 끝납니다. 최소한이 아주 기본적인 예에서는.

이 코드를 테스트하지 않았으므로 복사하여 붙여 넣으면 작동하지 않을 수 있지만 scikit-learn을 사용하려면 시작 위치에 대한 아이디어를 제공해야합니다.

편집 : 단계를 더 자세히 설명하려고했습니다.


6

의사 결정 트리를 사용하면이 문제에 대해 매우 잘 작동하는 것 같습니다. 적어도 내가 선택한 기능을 가진 순진한 베이 분류기보다 더 높은 정확도를 생성합니다.

몇 가지 가능성을 가지고 놀고 싶다면 nltk를 설치해야하는 다음 코드를 사용할 수 있습니다. nltk 책은 또한 온라인에서 무료로 사용할 수 있으므로이 모든 것이 실제로 작동하는 방식에 대해 조금 읽어 볼 수 있습니다. http://nltk.googlecode.com/svn/trunk/doc/book/ch06.html

#coding: utf-8
import nltk
import random
import re

def get_split_sets():
    structured_dataset = get_dataset()
    train_set = set(random.sample(structured_dataset, int(len(structured_dataset) * 0.7)))
    test_set = [x for x in structured_dataset if x not in train_set]

    train_set = [(tweet_features(x[1]), x[0]) for x in train_set]
    test_set = [(tweet_features(x[1]), x[0]) for x in test_set]
    return (train_set, test_set)

def check_accurracy(times=5):
    s = 0
    for _ in xrange(times):
        train_set, test_set = get_split_sets()
        c = nltk.classify.DecisionTreeClassifier.train(train_set)
        # Uncomment to use a naive bayes classifier instead
        #c = nltk.classify.NaiveBayesClassifier.train(train_set)
        s += nltk.classify.accuracy(c, test_set)

    return s / times


def remove_urls(tweet):
    tweet = re.sub(r'http:\/\/[^ ]+', "", tweet)
    tweet = re.sub(r'pic.twitter.com/[^ ]+', "", tweet)
    return tweet

def tweet_features(tweet):
    words = [x for x in nltk.tokenize.wordpunct_tokenize(remove_urls(tweet.lower())) if x.isalpha()]
    features = dict()
    for bigram in nltk.bigrams(words):
        features["hasBigram(%s)" % ",".join(bigram)] = True
    for trigram in nltk.trigrams(words):
        features["hasTrigram(%s)" % ",".join(trigram)] = True  
    return features

def get_dataset():
    dataset = """copy dataset in here
"""
    structured_dataset = [('fruit' if x[0] == '0' else 'company', x[2:]) for x in dataset.splitlines()]
    return structured_dataset

if __name__ == '__main__':
    print check_accurracy()

1
어떻게 작동합니까? 코드에 "선택된 기능"이 표시되지 않습니다. 학습 세트에 따라 자동으로 기능을 선택합니까? 아니면 dict()다른 곳에 저장되어 있습니까? 훈련 세트가 충분히 크면 컴퓨터가 기능 자체를 파악할 수 있어야하지 않을까요? (감독되지 않습니까?)
Ryan

2
기능은 tweet_features 함수를 사용하여 추출됩니다. 기본적으로 트윗에서 URL을 제거한 다음 'hasBigram (foo, bar)'= True와 같은 항목을 읽는 기능 딕셔너리를 생성합니다.
Paul Dubs 2013

1
그래서 'hasBigram(foo,bar)' = True트윗 문자열은 어디에 포함 foo bar됩니까? 그래서 그것은 각 트윗에 대해 bigrams와 trigrams를 만들고 긍정적 인 기능에 플래그를 지정합니다 dict(). 따라서 트윗이 주어지면 "alpha beta gamma delta"dict () bigrams for alpha,beta; beta,gamma; and gamma,delta;and trigrams for alpha,beta,gammaand beta,gamma,delta? 그리고 주어진 포지티브 및 네거티브 바이 및 트라이 그램에서 결정 트리 또는 베이 분류 기가 마법을 수행 할 수 있습니까?
Ryan

2
바로 그거죠. bayes 분류기를 사용할 때 "show_most_informative_features ()"를 호출하여 가장 유용한 기능을 얻을 수도 있습니다.
Paul Dubs 2013-07-10

Paul, 나는 이것의 조잡한 PHP 버전을 만들었고 당신은 절대적으로 맞습니다. 이것은 가중 사전을 구축하는 매우 효율적인 방법입니다. 모든 키워드를 수동으로 작성하지 않고도 쉽게 확장 할 수 있다고 생각합니다. 표준 기계 학습 라이브러리 내에서이 작업을 수행하는 방법에 대해 더 많이 배우기를 기대합니다.
라이언

5

지금까지 의견을 보내 주셔서 감사합니다. 다음은 PHP로 준비한 작업 솔루션 입니다. 나는 여전히이 같은 솔루션에 대한보다 알고리즘적인 접근 방식을 다른 사람들로부터 듣는 데 관심이 있습니다.

<?php

// Confusion Matrix Init
$tp = 0;
$fp = 0;
$fn = 0;
$tn = 0;
$arrFP = array();
$arrFN = array();

// Load All Tweets to string
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://pastebin.com/raw.php?i=m6pP8ctM');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$strCorpus = curl_exec($ch);
curl_close($ch);

// Load Tweets as Array
$arrCorpus = explode("\n", $strCorpus);
foreach ($arrCorpus as $k => $v) {
    // init
    $blnActualClass = substr($v,0,1);
    $strTweet = trim(substr($v,2));

    // Score Tweet
    $intScore = score($strTweet);

    // Build Confusion Matrix and Log False Positives & Negatives for Review
    if ($intScore > 0) {
        if ($blnActualClass == 1) {
            // True Positive
            $tp++;
        } else {
            // False Positive
            $fp++;
            $arrFP[] = $strTweet;
        }
    } else {
        if ($blnActualClass == 1) {
            // False Negative
            $fn++;
            $arrFN[] = $strTweet;
        } else {
            // True Negative
            $tn++;
        }
    }
}

// Confusion Matrix and Logging
echo "
           Predicted
            1     0
Actual 1   $tp     $fp
Actual 0    $fn    $tn

";

if (count($arrFP) > 0) {
    echo "\n\nFalse Positives\n";
    foreach ($arrFP as $strTweet) {
        echo "$strTweet\n";
    }
}

if (count($arrFN) > 0) {
    echo "\n\nFalse Negatives\n";
    foreach ($arrFN as $strTweet) {
        echo "$strTweet\n";
    }
}

function LoadDictionaryArray() {
    $strDictionary = <<<EOD
10|iTunes
10|ios 7
10|ios7
10|iPhone
10|apple inc
10|apple corp
10|apple.com
10|MacBook
10|desk top
10|desktop
1|config
1|facebook
1|snapchat
1|intel
1|investor
1|news
1|labs
1|gadget
1|apple store
1|microsoft
1|android
1|bonds
1|Corp.tax
1|macs
-1|pie
-1|clientes
-1|green apple
-1|banana
-10|apple pie
EOD;

    $arrDictionary = explode("\n", $strDictionary);
    foreach ($arrDictionary as $k => $v) {
        $arr = explode('|', $v);
        $arrDictionary[$k] = array('value' => $arr[0], 'term' => strtolower(trim($arr[1])));
    }
    return $arrDictionary;
}

function score($str) {
    $str = strtolower($str);
    $intScore = 0;
    foreach (LoadDictionaryArray() as $arrDictionaryItem) {
        if (strpos($str,$arrDictionaryItem['term']) !== false) {
            $intScore += $arrDictionaryItem['value'];
        }
    }
    return $intScore;
}
?>

위의 출력 :

           Predicted
            1     0
Actual 1   31     1
Actual 0    1    17


False Positives
1|Royals apple #ASGame @mlb @ News Corp Building http://instagram.com/p/bBzzgMrrIV/


False Negatives
-1|RT @MaxFreixenet: Apple no tiene clientes. Tiene FANS// error.... PAGAS por productos y apps, ergo: ERES CLIENTE.

4

귀하가 제공 한 모든 예에서 Apple (inc)은 A pple 또는 apple inc 로 지칭 되었으므로 가능한 방법은 다음을 검색하는 것입니다.

  • Apple의 대문자 "A"

  • 사과 뒤에 "inc"

  • "OS", "운영 체제", "Mac", "iPhone", ...과 같은 단어 / 구문

  • 또는 이들의 조합


1
함수에서 대문자를 걸러 내기 위해 strtolower를 사용했습니다. 약간 조잡하지만 효과가있었습니다.
SAL '2013

@SAL 나는 그것이 매우 유용 할 것으로 기대하지만,하지 않았다 당신은, 다음 ... 시간 제한이있는 경우
user2425429을

4

조건부 랜덤 필드를 기반으로 답변을 단순화하려면 여기에서 컨텍스트가 엄청납니다. 당신은 애플에게 회사 대 사과 과일을 명확하게 보여주는 트윗에서 고르고 싶을 것입니다. 여기에서 시작하는 데 유용한 기능 목록을 간략히 설명하겠습니다. 더 자세한 정보는 명사구 청킹과 BIO 라벨이라고 불리는 것을 찾아보십시오. 참조 ( http://www.cis.upenn.edu/~pereira/papers/crf.pdf )

주변 단어 : 이전 단어와 다음 단어에 대한 특징 벡터를 구축하거나 이전 2 단어와 다음 2 단어에 대해 더 많은 특징을 원할 경우. 모델에 너무 많은 단어를 원하지 않거나 데이터와 잘 일치하지 않습니다. 자연어 처리에서 가능한 한 일반적으로 유지하고 싶을 것입니다.

주변 단어에서 얻을 수있는 다른 기능은 다음과 같습니다.

첫 번째 문자가 대문자인지 여부

단어의 마지막 문자가 마침표인지 여부

단어의 품사 (음성 태깅의 일부 조회)

단어의 텍스트 자체

나는 이것을 권하지 않지만, 특히 Apple을위한 기능의 더 많은 예를 제공합니다.

WordIs (애플)

NextWordIs (Inc.)

당신은 요점을 얻습니다. 명명 된 엔터티 인식을 시퀀스를 설명하는 것으로 생각하고 수학을 사용하여 컴퓨터에이를 계산하는 방법을 알려줍니다.

자연어 처리는 파이프 라인 기반 시스템입니다. 일반적으로 문장으로 나누고 토큰 화로 이동 한 다음 음성 태깅 또는 종속성 파싱의 일부를 수행합니다.

이것은 모델에서 찾고있는 것을 식별하기 위해 사용할 수있는 기능 목록을 얻기위한 것입니다.


3

자연 언어 텍스트 처리를위한 정말 좋은 라이브러리있다 파이썬 이라고는 nltk. 당신은 그것을보아야합니다.

시도 할 수있는 한 가지 전략은 "사과"라는 단어가 포함 된 n- 그램 (단어 그룹)을 보는 것입니다. 어떤 단어는 과일에 대해 이야기 할 때 "사과"옆에 더 많이 사용되며, 다른 단어는 회사에 대해 이야기 할 때 더 많이 사용되며,이를 사용하여 트윗을 분류 할 수 있습니다.


1
감사합니다 Manetheran. 나는 원래 포스터는 아니지만 대답에 관심이 있습니다. 현상금의 nltk경우 "hello world"기계 학습 작업을 올바른 방향으로 시작하는 데 도움이 될 수 있는 코드 (를 사용 하는 경우도 포함 )를 찾고 있습니다. 애플 (포함) 대 애플 (과일)은 완벽한 과제처럼 보입니다.
Ryan

3

LibShortText를 사용하십시오 . 이 Python 유틸리티는 이미 짧은 텍스트 분류 작업을 위해 작동하도록 조정되었으며 잘 작동합니다. 최대로해야 할 일은 플래그의 최상의 조합을 선택하는 루프를 작성하는 것입니다. 이메일에서 음성 행위 분류를 감독하는 데 사용했고 결과는 최대 95-97 % 정확했습니다 (5 겹 교차 검증 중!).

또한 sklearn 및 cran에서 지원 벡터 머신 (SVM) 구현을 사용 하는 LIBSVMLIBLINEAR 제조업체에서 제공 하므로 해당 구현이 버그가 아니라는 것을 합리적으로 확신 할 수 있습니다.


2

AI 필터를 만들어 Apple Inc (회사)와 사과 (과일)를 구분합니다. 이들은 트윗이기 때문에 140 개 필드의 벡터로 트레이닝 세트를 정의합니다. 각 필드는 위치 X (0 ~ 139)의 트윗에 기록 된 문자입니다. 트윗이 더 짧으면 공백 값을 제공하십시오.

그런 다음 (당신의 취향에 따라) 좋은 정확도를 얻을 수있을만큼 충분히 큰 훈련 세트를 만드십시오. 각 트윗에 결과 값을 할당하면 Apple Inc의 트윗은 1 (참)이되고 사과 트윗 (과일)은 0이됩니다. 이는 로지스틱 회귀 에서 지도 학습 의 경우입니다 .

그것은 기계 학습이며 일반적으로 코딩하기 쉽고 더 나은 성능을 발휘합니다. 그것은 당신이 제공 한 세트에서 배워야하며 하드 코딩되지 않았습니다.

저는 Python을 모르기 때문에 코드를 작성할 수 없습니다.하지만 기계 학습의 논리와 이론에 더 많은 시간을 할애한다면 제가 따르는 수업을보고 싶을 것입니다.

Andrew NgCoursera 과정 머신 러닝 을 사용 해보세요 . MATLAB 또는 Octave 에서 기계 학습을 배우게 되지만 기본을 익히면 간단한 수학 (로지스틱 회귀에서 간단 함)을 이해하면 모든 언어에 대한 기계 학습을 작성할 수 있습니다.

즉, 누군가로부터 코드를 받았다고해서 기계 학습 코드에서 진행되는 내용을 이해할 수 없습니다. 실제로 무슨 일이 일어나고 있는지보기 위해 주제에 몇 시간을 투자 할 수 있습니다.


감사합니다 Fawar. 나는 ML이 어떻게 작동하는지 배우기 위해이 정확한 목적을 위해이 "hello world"에 대한 몇 가지 코드를 원했습니다. 그래도 수업을 찾아 보겠습니다. 좋아 보인다.
Ryan

0

엔티티 인식을 제안하는 답변은 피하는 것이 좋습니다. 이 작업은 먼저 텍스트 분류이고 두 번째로 엔티티 인식이기 때문입니다 (엔티티 인식없이 수행 할 수 있음).

결과를 얻는 가장 빠른 경로는 공간 + 신동 이 될 것이라고 생각합니다 . Spacy는 영어 모델을 잘 생각했기 때문에 직접 만들 필요가 없습니다. prodigy를 사용하면 빠르게 훈련 데이터 세트를 만들고 필요에 맞게 공간 모델을 미세 조정할 수 있습니다.

샘플이 충분하면 하루 만에 괜찮은 모델을 만들 수 있습니다.


동시에 파이프 라인 구성 요소 spaCyner있는데이 분류에 도움이되지 않을까요? 나는 그들의 모델이 Apple(세계에서 가장 크고 가장 잘 알려진 회사 중 하나이기 때문에) 당신이 하루 만에 생각 해낼 수있는 모델보다 훨씬 더 잘 인식 할 수 있다고 생각 합니다.
Szymon Maszke 19

@Szymon : NER는 도움이 될 수도 있고 아닐 수도 있습니다. 내가 이해했듯이, 명명 된 엔티티 (텍스트에 존재한다는 사실)를 주요 분류 작업의 기능으로 사용하고 싶습니다. 분명히 NER는 높은 수준의 모호성이 있기 때문에 100 % 정확도를 갖지 않습니다. 따라서 주 분류 모델은이 기능을 신뢰할 수있는 상황을 결정합니다. 기본 분류 모델이 NER 모델의 결과에 매우 낮은 가중치를 부여 할 가능성이 매우 높습니다. 그리고 이것은 (거의) 사용되지 않는 NER에 시간을 할애한다는 것을 의미합니다.
Dim

내가 의미하는 바가 아닙니다. spacy.Doc각 텍스트에서 생성 하고 doc.entsNER를 반복하여 NER .textApple. 재미있는 사실 은 첫 번째 예가 Apple입니다.
Szymon Maszke

그리고 누군가가 모델을 만들고 싶다면, 아마도 RNN / CNN 등을 포함하고, 그에 따라 조정하고, 아키텍처, 셀 유형 등을 찾을 것입니다. 더 쉬운 모델이 명확성과 컨텍스트를 잘 처리한다고 생각하지 않습니다. 누군가가 이미 당신을 위해 해줬다면 왜 당신의 삶을 더 편하게 만드시겠습니까?
Szymon Maszke

@SzymonMaszke 모델은 더 복잡하고 훈련하기 더 어렵습니다. 모델이 언급 된 목적으로 작동하려면 NE를 찾을뿐만 아니라 올바른 위치 (토큰)에서도 찾아야합니다. 핵심 목표에 맞게 모델을 최적화 할 것을 제안하는 분류 모델을 사용하여 Apple 회사 또는 Apple 과일인지 식별하십시오. 훈련하기가 더 쉬우므로 더 정확할 것입니다.
Dim
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.