Вот что я пытаюсь сделать. У меня есть CSV. файл со столбцом 1 с именами людей (например, «Майкл Джордан», «Андерсон Сильва», «Мухаммад Али») и столбцом 2 с этнической принадлежностью людей (например: англичане, французы, китайцы).
В моем коде я создаю фрейм данных pandas, используя все данные. Затем создайте дополнительные фреймы данных: один только с китайскими именами, а другой только с некитайскими именами. И тогда я создаю отдельные списки.
Функция three_split извлекает особенности каждого имени, разбивая их на подстроки из трех символов. Например, "Кэти Перри" в "кат", "ати", "ты", "у п"... и т.д.
Затем я тренируюсь с Наивным Байесом и, наконец, проверяю результаты.
При запуске моих кодов ошибок нет, но когда я пытаюсь использовать некитайские имена непосредственно из базы данных и ожидаю, что программа вернет False (не китайский), она возвращает True (китайский) для любого имени, которое я тестирую. Есть идеи?
import pandas as pd
from pandas import DataFrame, Series
import numpy as np
import nltk
from nltk.classify import NaiveBayesClassifier as nbc
from nltk.classify import PositiveNaiveBayesClassifier
# Get csv file into data frame
data = pd.read_csv("C:\Users\KubiK\Dropbox\Python exercises_KW\_Scraping\BeautifulSoup\FamilySearch.org\FamSearch_Analysis\OddNames_sampleData3.csv",
encoding="utf-8")
df = DataFrame(data)
df.columns = ["name", "ethnicity"]
# Recategorize different ethnicities into 1) Chinese or 2) non-Chinese; and then create separate lists
df_chinese = df[(df["ethnicity"] == "chinese") | (df["ethnicity"] == "Chinese")]
chinese_names = list(df_chinese["name"])
df_nonchinese = df[(df["ethnicity"] != "chinese") & (df["ethnicity"] != "Chinese") & (df["ethnicity"].notnull() == True)]
nonchinese_names = list(df_nonchinese["name"])
# Function to split word string into three-character substrings
def three_split(word):
word = str(word).lower().replace(" ", "_")
split = 3
return dict(("contains(%s)" % word[start:start+split], True)
for start in range(0, len(word)-2))
# Training naive bayes machine learning algorithm
positive_featuresets = list(map(three_split, chinese_names))
unlabeled_featuresets = list(map(three_split, nonchinese_names))
classifier = PositiveNaiveBayesClassifier.train(positive_featuresets, unlabeled_featuresets)
# Testing results
name = "Hubert Gillies" # A non-Chinese name from the dataset
print classifier.classify(three_split(name))
>>> True # Wrong output