<commit_before>\documentclass[conference]{IEEEtran}

\usepackage{pifont}
\usepackage{times,amsmath,color, balance,
amssymb,graphicx,epsfig,cite,psfrag,subfigure,algorithm,multirow,cases,balance,algorithmic,mathtools,booktabs}
\newtheorem{claim}{Claim}
\newtheorem{guess}{Conjecture}
\newtheorem{definition}{Definition}
\newtheorem{fact}{Fact}
\newtheorem{assumption}{\underline{Assumption}}
\newtheorem{theorem}{\underline{Theorem}}
\newtheorem{lemma}{\underline{Lemma}}
\newtheorem{ctheorem}{Corrected Theorem}
\newtheorem{corollary}{\underline{Corollary}}
\newtheorem{proposition}{Proposition}
\newtheorem{example}{\underline{Example}}
\newtheorem{remark}{\underline{Remark}}
\newtheorem{problem}{\underline{Problem}}
\def\Ei{\mathop\mathrm{Ei}}
\def\E{\mathop\mathrm{E}}
\def\tr{\mathop\mathrm{tr}}
\newcounter{mytempeqncnt}

% correct bad hyphenation here
\hyphenation{op-tical net-works semi-conduc-tor}

\begin{document}
%
% paper title
% can use linebreaks \\ within to get better formatting as desired
\title{Decoding Team Composition in MOBA \\ A Learning Approach}


% author names and affiliations
% use a multiple column layout for up to three different
% affiliations
\author{\IEEEauthorblockN{<NAME> (jiachenl)}
\IEEEauthorblockA{Language Technologies Institute \\
School of Computer Science \\ Carnegie Mellon University \\
Pittsburgh, PA, USA}
\and
\IEEEauthorblockN{<NAME> (yilinhe)}
\IEEEauthorblockA{Machine Learning Department\\
School of Computer Science \\ Carnegie Mellon University \\
Pittsburgh, PA, USA}
\and
\IEEEauthorblockN{<NAME> ()}
\IEEEauthorblockA{Language Technologies Institute \\
School of Computer Science \\ Carnegie Mellon University \\
Pittsburgh, PA, USA}}

% make the title area
\maketitle


\begin{abstract}
%\boldmath
In this report, we studied the impact of team composition in the massive online battle arena (MOBA) games
\end{abstract}
% IEEEtran.cls defaults to using nonbold math in the Abstract.
% This preserves the distinction between vectors and scalars. However,
% if the conference you are submitting to favors bold math in the abstract,
% then you can use LaTeX's standard command \boldmath at the very start
% of the abstract to achieve this. Many IEEE journals/conferences frown on
% math in the abstract anyway.

% no keywords




% For peer review papers, you can put extra information on the cover
% page as needed:
% \ifCLASSOPTIONpeerreview
% \begin{center} \bfseries EDICS Category: 3-BBND \end{center}
% \fi
%
% For peerreview papers, this IEEEtran command inserts a page break and
% creates the second title. It will be ignored for other modes.
%\IEEEpeerreviewmaketitle



\section{Introduction}

Multiplayer online battle arena (MOBA) is a rising force in online games that has features of fast paced, single round and team play. In the past few months, more than 27 million players fight with each other per day in one of such kind of game called League of Legends (LoL)\cite{Ian} while millions are attracted by another game called Defense of the Ancient 2 (DotA2). International MOBA tournaments are held over the world with a prize pool of over \$10 million\cite{Valve}.  Analysis on MOBA games will not only gain us experience of data analysis but will also be beneficial to players and game companies all over the world.

In MOBA games like LoL or DotA 2, two groups of five players are pitted against each other based on their level of game proficiency. In the beginning of a game, each player first picks an unique character out of over 100 options, and these 5 characters picked in a group finally forms a team. Given that the game server usually matches the players with similar levels within a game, then the result of a game should not be affected too much by the skill of each individual player, but depends on the characters combination of different teams, which is known as team composition.

An interesting questions to the online communities as well as professional teams is how to form a good team composition to achieve highest winning probability. The challenging part for this problem is the large number of possible team composition. Since each game contains more than 100 characters, there are more than $\binom{100}{10}\cdot\binom{10}{5}$ kinds of team composition in LoL or DotA 2.


\subsection{Goal and Progress}

To answer this question, we can translate it into a classic machine learning problem: given a team composition, predict the outcome for the game. Then we can interpret the parameters in our machine learning algorithm to understand how to form a team composition for MOpBA games.

In the midpoint, we have successfully fulfilled the goal defined in the proposal.
We collected and cleaned up data for both LoL and DotA 2.
We built a model to predict game outcome and evaluated it using logistic regression and support vector machine.
Using the simple model, we achieved an accuracy of *insert number* for LoL and *insert number* for DotA 2.


%\subsection{Related Work}
%Conley and Perry have previously worked on predicting win ratio based on heroes picked by the team in DotA 2. In their work, they have reported 69\% accuracy using logistic regression and K-NN.

\subsection{Organization of this Report}
The remaining of this report is organized as follows: Section II presents the collection of the data set, Section III introduces the learning model and assumptions,

\section{Data Set Preparation}
We have obtained two data sets for this study, one from the LoL and the other from DotA 2. The whole data set contains more than 80,000 independent game history records in total, which are adequate for our analysis in the first few steps.

\subsection{Data Collection}

The data set was collected through public APIs provided by the video game producers Riot and Steam respectively. The APIs can provide us with a given number of most recent completed games as well as the corresponding whole statistics. To make full use of the APIs, we ran our feature collection program on AWS Cloud Computing resources to collect these data in a $7\times24$ manner.


\subsection{Data Contents}

The contents of the original data collected from APIs are shown as follow:


\begin{itemize}
\item \textit{Game Id}: An Unique identifier for the game, used to avoid data redundancy;
\item \textit{Game duration}: how long the each game last, used for data cleaning;
\item \textit{Winner}: The winning team, used as labels;
\item \textit{Team composition}: the characters selected by each team, used as main features;
\item \textit{Skill levels}: the player's performance in his/her past history, used to evaluate the potential performance of this player;
\item \textit{KDA Statistics}: the character's performance in this game, i.e., how many other characters it killed (K), how many times it died (D) and how many times it assisted its teammate to kill the other characters (A).
\end{itemize}

\subsection{Data Cleaning}

As we all known that the performance of machine learning algorithms is heavily dependent on the quality of features. So before extracting features from raw data, we need to do some data cleaning.

Since the public APIs always return the most recent game records, we should first to check whether there is any redundancy in our data set. Besides, we need to make sure the data is useful, which can be verified from the game duration. For example, if the game duration is too short, then it is quite possible that some player leaves the game early, so that this record may not be able to support our learning goal and should be dropped. Finally, we will have a look at the KDA statistics, if some character's KDA is below a normal level, then this character may not fully participate into the game. Therefore, the corresponding record should also be dropped.

After finishing these procedures, we can then extract features from the data and train our models.

\section{Models and Assumptions}

In this section, we proposed two models for decoding team composition. The first model is based on ranking the performance of each character while the second model takes the group effect into consideration. We take the first model as the baseline, and mainly apply our ideas in the second model.


To start discussing the models,  let us first define the two teams in the game as $\mathcal{A}$ and $\mathcal{B}$, where each team contains five unique characters (i.e., $c_1,c_2\ldots,c_5$). Moreover, suppose that the game has $N$ characters, then all the characters can be encoded with an integer between $1$ and $N$.

\subsection{Model-I: Character Ranking Model}

In the character ranking model, what we really want to learn is the ``weight'' of different characters, which measures how important the characters to a team. To introduce the that, we may first need to make some assumption:

\begin{assumption}
We assume that players in both team all have high skills. Moreover, they are proficient with the characters they pick.
\end{assumption}

\begin{remark}
This assumption is reasonable because, during the data collection part, we only collected the records with a higher skill levels. Moreover, in order to win the game, players are not likely to pick the characters that they are not familiar with, especially for the high level player.
\end{remark}

With this assumption, we can further assume that the game result is independent of the players, then we can use the vector $\textbf{x}=\{x_1,x_2,\ldots,x_N\}$ to represent the training feature. The element $x_i$ indicates the presence of $i$th character in the game, and the detailed value for it is given by

\begin{equation}
x_i =
\begin{cases}
1 &  \text{if $i\in \mathcal{A},$} \\
-1 &  \text{if $i\in \mathcal{B},$} \\
0 & \text{otherwise.}
\end{cases}
\end{equation}
Of course, the winner team will work as the label of the feature.


\subsection{Model-II: Group Ranking Model}

Unlike the character ranking model where we make the independent assumption between player skills and game results. The group ranking model not only considers the player skills, but also take the relationship of different character into account. For example, Fig. 1 shows all the aspect that may affect the final result of a game, and we can see that the performance of one specific character should affect all the other characters in the different team. This is not difficult to understand because all the characters in a team will work together to achieve their final goal, and 




\subsection{Logistic Regression}

\begin{table}[h]
\begin{tabular}{c c c c c}
\hline
\toprule
                       & \multicolumn{2}{c}{LoL}    & \multicolumn{2}{c}{Dota}   \\
\midrule
                       & Training Accuracy (\%) & Test Accuracy & Training Accuracy & Test Accuracy \\ \hline
Logistic Regression    & 62.55         & 60.62     & 63.06         & 64.48     \\ \hline
Neural Networks        & 72.63        & 70.77     & 65.12        &64.81     \\ \hline
Support Vector Machine &                &            &                &            \\
\bottomrule
\end{tabular}
\end{table}

\section{Performance Evaluation}

After that, we will first apply the models we get to perform prediction on the test set. Moreover, we will use these models to analyze the importance of team composition, and try to find out probably the best team. At last, we will also compare the performance of different model and draw the conclusion.


\section{Plans and Requirement}

During our analysis, we realized that linear regression with current feature vector does not accurately represent a team composition. In linear regression, the decision rule is:
\[
w_0 + \sum_i w_i x_i <>0
\]
which means the algorithm only consider individual characters in the group instead of their combination. For example, if character A has a high win ratio, it will have a higher weight. However, if character A and B are not particularly strong as individual characters, but they synchronize well when they are played together, our logistic regression algorithm can not reflect this fact using a linear decision boundary. Due to this limitation, we plan to generate a new feature vector based on line-ups for the characters.

In addition, we will also try assign each character a score, representing their in-game performance.
<commit_msg>Updated new<commit_after>\documentclass[conference]{IEEEtran}

\usepackage{pifont}
\usepackage{times,amsmath,color, balance,
amssymb,graphicx,epsfig,cite,psfrag,subfigure,algorithm,multirow,cases,balance,algorithmic,mathtools}
\usepackage{longtable}
\usepackage{booktabs}
\usepackage{adjustbox}
\newtheorem{claim}{Claim}
\newtheorem{guess}{Conjecture}
\newtheorem{definition}{Definition}
\newtheorem{fact}{Fact}
\newtheorem{assumption}{\underline{Assumption}}
\newtheorem{theorem}{\underline{Theorem}}
\newtheorem{lemma}{\underline{Lemma}}
\newtheorem{ctheorem}{Corrected Theorem}
\newtheorem{corollary}{\underline{Corollary}}
\newtheorem{proposition}{Proposition}
\newtheorem{example}{\underline{Example}}
\newtheorem{remark}{\underline{Remark}}
\newtheorem{problem}{\underline{Problem}}
\def\Ei{\mathop\mathrm{Ei}}
\def\E{\mathop\mathrm{E}}
\def\tr{\mathop\mathrm{tr}}
\newcounter{mytempeqncnt}

% correct bad hyphenation here
\hyphenation{op-tical net-works semi-conduc-tor}

\begin{document}
%
% paper title
% can use linebreaks \\ within to get better formatting as desired
\title{Decoding Team Composition in MOBA \\ A Learning Approach}


% author names and affiliations
% use a multiple column layout for up to three different
% affiliations
\author{\IEEEauthorblockN{<NAME> (jiachenl)}
\IEEEauthorblockA{Language Technologies Institute \\
School of Computer Science \\ Carnegie Mellon University \\
Pittsburgh, PA, USA}
\and
\IEEEauthorblockN{<NAME> (yilinhe)}
\IEEEauthorblockA{Machine Learning Department\\
School of Computer Science \\ Carnegie Mellon University \\
Pittsburgh, PA, USA}
\and
\IEEEauthorblockN{<NAME> (clian)}
\IEEEauthorblockA{Language Technologies Institute \\
School of Computer Science \\ Carnegie Mellon University \\
Pittsburgh, PA, USA}}

% make the title area
\maketitle


\begin{abstract}
%\boldmath
Team composition has been a interesting as well as challenging problem especially in the setting of competitive online games. A good team composition will strongly improve your chance for wining, while a bad team composition may probably ruin your game.
In this report, we studied the impact of team composition in the massive online battle arena (MOBA) games. We collected data from two most popular MOBA games, and then proposed two feature models to represent these data. Machine learning algorithms with different characteristics such as logistic regression and neural networks are used to evaluate our works, and results shows that 
\end{abstract}
% IEEEtran.cls defaults to using nonbold math in the Abstract.
% This preserves the distinction between vectors and scalars. However,
% if the conference you are submitting to favors bold math in the abstract,
% then you can use LaTeX's standard command \boldmath at the very start
% of the abstract to achieve this. Many IEEE journals/conferences frown on
% math in the abstract anyway.

% no keywords




% For peer review papers, you can put extra information on the cover
% page as needed:
% \ifCLASSOPTIONpeerreview
% \begin{center} \bfseries EDICS Category: 3-BBND \end{center}
% \fi
%
% For peerreview papers, this IEEEtran command inserts a page break and
% creates the second title. It will be ignored for other modes.
%\IEEEpeerreviewmaketitle



\section{Introduction}

Multiplayer online battle arena (MOBA) is a rising force in online games that has features of fast paced, single round and team play. In the past few months, more than 27 million players fight with each other per day in one of such kind of game called League of Legends (LoL)\cite{Ian} while millions are attracted by another game called Defense of the Ancient 2 (DotA2). International MOBA tournaments are held over the world with a prize pool of over \$10 million\cite{Valve}.  Analysis on MOBA games will not only gain us experience of data analysis but will also be beneficial to players and game companies all over the world.

In MOBA games like LoL or DotA 2, two groups of five players are pitted against each other based on their level of game proficiency. In the beginning of a game, each player first picks an unique character out of over 100 options, and these 5 characters picked in a group finally forms a team. Given that the game server usually matches the players with similar levels within a game, then the result of a game should not be affected too much by the skill of each individual player, but depends on the characters combination of different teams, which is known as team composition.

An interesting questions to the online communities as well as professional teams is how to form a good team composition to achieve highest winning probability. The challenging part for this problem is the large number of possible team composition. Since each game contains more than 100 characters, there are more than $\binom{100}{10}\cdot\binom{10}{5}$ kinds of team composition in LoL or DotA 2.


\subsection{Goal and Progress}

To answer this question, we can translate it into a classic machine learning problem: given a team composition, predict the outcome for the game. Then we can interpret the parameters in our machine learning algorithm to understand how to form a team composition for MOpBA games.

In the midpoint, we have successfully fulfilled the goal defined in the proposal.
We collected and cleaned up data for both LoL and DotA 2.
We built a model to predict game outcome and evaluated it using logistic regression and support vector machine.
Using the simple model, we achieved an accuracy of *insert number* for LoL and *insert number* for DotA 2.


%\subsection{Related Work}
%Conley and Perry have previously worked on predicting win ratio based on heroes picked by the team in DotA 2. In their work, they have reported 69\% accuracy using logistic regression and K-NN.

\subsection{Organization of this Report}
The remaining of this report is organized as follows: Section II presents the collection of the data set, Section III introduces the learning model and assumptions,

\section{Data Set Preparation}
We have obtained two data sets for this study, one from the LoL and the other from DotA 2. The whole data set contains more than 80,000 independent game history records in total, which are adequate for our analysis in the first few steps.

\subsection{Data Collection}

The data set was collected through public APIs provided by the video game producers Riot and Steam respectively. The APIs can provide us with a given number of most recent completed games as well as the corresponding whole statistics. To make full use of the APIs, we ran our feature collection program on AWS Cloud Computing resources to collect these data in a $7\times24$ manner.


\subsection{Data Contents}

The contents of the original data collected from APIs are shown as follow:


\begin{itemize}
\item \textit{Game Id}: An Unique identifier for the game, used to avoid data redundancy;
\item \textit{Game duration}: how long the each game last, used for data cleaning;
\item \textit{Winner}: The winning team, used as labels;
\item \textit{Team composition}: the characters selected by each team, used as main features;
\item \textit{Skill levels}: the player's performance in his/her past history, used to evaluate the potential performance of this player;
\item \textit{KDA Statistics}: the character's performance in this game, i.e., how many other characters it killed (K), how many times it died (D) and how many times it assisted its teammate to kill the other characters (A).
\end{itemize}

\subsection{Data Cleaning}

As we all known that the performance of machine learning algorithms is heavily dependent on the quality of features. So before extracting features from raw data, we need to do some data cleaning.

Since the public APIs always return the most recent game records, we should first to check whether there is any redundancy in our data set. Besides, we need to make sure the data is useful, which can be verified from the game duration. For example, if the game duration is too short, then it is quite possible that some player leaves the game early, so that this record may not be able to support our learning goal and should be dropped. Finally, we will have a look at the KDA statistics, if some character's KDA is below a normal level, then this character may not fully participate into the game. Therefore, the corresponding record should also be dropped.

After finishing these procedures, we can then extract features from the data and train our models.

\section{Models and Assumptions}

In this section, we proposed two models for decoding team composition. The first model is based on ranking the performance of each character while the second model takes the group effect into consideration. We take the first model as the baseline, and mainly apply our ideas in the second model.


To start discussing the models,  let us first define the two teams in the game as $\mathcal{A}$ and $\mathcal{B}$, where each team contains five unique characters (i.e., $c_1,c_2\ldots,c_5$). Moreover, suppose that the game has $N$ characters, then all the characters can be encoded with an integer between $1$ and $N$.

\subsection{Model-I: Character Ranking Model}

In the character ranking model, what we really want to learn is the ``weight'' of different characters, which measures how important the characters to a team. To introduce the that, we may first need to make some assumption:

\begin{assumption}
We assume that players in both team all have high skills. Moreover, they are proficient with the characters they pick.
\end{assumption}

\begin{remark}
This assumption is reasonable because, during the data collection part, we only collected the records with a higher skill levels. Moreover, in order to win the game, players are not likely to pick the characters that they are not familiar with, especially for the high level player.
\end{remark}

With this assumption, we can further assume that the game result is independent of the players, then we can use the vector $\textbf{x}=\{x_1,x_2,\ldots,x_N\}$ to represent the training feature. The element $x_i$ indicates the presence of $i$th character in the game, and the detailed value for it is given by

\begin{equation}
x_i =
\begin{cases}
1 &  \text{if $i\in \mathcal{A},$} \\
-1 &  \text{if $i\in \mathcal{B},$} \\
0 & \text{otherwise.}
\end{cases}
\end{equation}
Of course, the winner team will work as the label of the feature.


\subsection{Model-II: Group Ranking Model}

\begin{figure}[t]
  \centering
    \includegraphics[width=65mm]{team_comp.pdf}
  \caption{An illustration of team composition and the aspects that may influences the game result.}
  \label{fig:team_comp}
\end{figure}

Unlike the character ranking model where we make the independent assumption between player skills and game results. The group ranking model not only considers the player skills, but also take the relationship of different characters into account. For example, Fig. \ref{fig:team_comp} has shown the factors that may have potential influence on the game result. It can be seen from the figure that the performance of one specific character should affect all the other characters in the different team. This is not difficult to understand because there are many times in the game that all the characters in a team will need to work together to achieve their goals. Therefore, to learn the team composition, we need also use such information.

To utilize these additional information, we first introduce the character matrix.
\begin{definition}
A matrix $A \in \mathbb{R}^{N\times N}$ is called the character matrix if the element $a_{i,j}$ indicates the probability that the team with character $j$ beats the team with character $j$, i.e. $a_{i,j}=\text{Pr}\{\text{team with $c_i$ beats team with $c_j$}\}$.
\end{definition}

The character matrix gives us an evaluation between different character pair that can be used for learning. However, to obtain a more complete feature we may also need to add the impact of the players (i.e., use a function $g(P_{\mathcal{A},i},P_{\mathcal{B},j})$ to evaluate the winning ratio between two players), so the final feature could be a matrix $F \in \mathbb{R}^{N\times N}$ based on this information. The element of feature matrix is defined as
\begin{equation}
f_{i,j}=a_{i,j} \cdot g(P_{\mathcal{A},i},P_{\mathcal{B},j}),
\end{equation}
where the $a_{i,j}$ is the element from character matrix, $g(P_{\mathcal{A},i},P_{\mathcal{B},j})$ is the function that measure the winning ratio between the player in group $\mathcal{A}$ using character $i$ and the player in group $\mathcal{B}$ using character $j$. Notice that we can multiply these two elements because they are independent.

\begin{remark}
There is no doubt that the feature matrix contains more information than the plain character feature in the character ranking model. However, one of the biggest challenge when applying the feature matrix is its high dimension (i.e. $N\times N$, which will also lead to the sparsity of the parameters). To solve this problem, we will use the clustering methods to cluster the $N$ characters into $K$ groups, so that the comparison between two individual characters will become the comparison between two clusters. Thus the dimension problem will be reduced. (This will be the one of the work during the second part of this semester.)
\end{remark}   



\section{Performance Evaluation}

\begin{table}[h]
\begin{adjustbox}{width=3.5in}
\begin{tabular}{|c |c |c |c |c |}
\hline
\toprule
                       & \multicolumn{2}{c|}{LoL}    & \multicolumn{2}{c|}{Dota}   \\
\midrule
Accuracy (\%)                       & Training   & Test  & Training  & Test  \\ \hline
Logistic Regression    & 62.55         & 60.62     & 63.06         & 63.48     \\ \hline
Neural Networks       & 72.63        & 70.77     & 65.12        &64.81     \\
\bottomrule
\end{tabular}
\end{adjustbox}
\\
\caption{performance of different algorithms}
\end{table}

\begin{figure}[t]
  \centering
    \includegraphics[width=90mm]{dota2_logreg_error.pdf}
  \caption{The error probability of logistic regression on the DotA 2 dataset.}
  \label{fig:dota2_log}
\end{figure}


\begin{figure}[t]
  \centering
    \includegraphics[width=90mm]{lol_logreg_error.pdf}
  \caption{The error probability of logistic regression on the LoL dataset.}
  \label{fig:lol_log}
\end{figure}



\subsection{Evaluation of logistic regression}

In Logistic Regression, We select a learning rate of $\alpha = 0.001$, where the proportion of test set is 30\%, which is randomly picked from the dataset. For each data set, the iteration time for gradient decent is 100 during the training. We plot the size of training size vs test/training error.
This figure represents the learning curve for logistic regression algorithm. With small number of training examples, we obtained a small training error and a large testing error. As we increase the number of training examples, the training error increase and testing error decreases. For DotA 2, both test error and training error converges to 0.365 after around 10,000 training points.

The weight vector we obtained in logistic regression represents each character's influence on game result. For character $i$, a positive weight $w_i$ implies having this character in team increases the chance of winning. Therefore, the prediction is based on individual characters and does not consider synergy between characters.

\subsection{Evaluation of neural network}
In neural networks model, we choose to use 3 layers: 1 hidden layer with 100 nodes. The input layer has p nodes and the output layer has 2 nodes. We implemented feedforward back propagation neural network. Sigmoid transform was applied and lambda in cost function was set to 0.5.

\subsection{Comparison of algorithms}
While we can not directly interpret the parameters we obtained from neural networks model, the high accuracy shows the importance of considering the relationship between selected characters. Since logistic regression has a linear decision boundary, it can only make prediction based on a linear combination of individual characters. Therefore, logistic regression can not capture the relationship between selected characters. On the other side, the learning process of Neural Network combines input feature in the hidden layer to take consideration of the relationship between selected characters.

\subsection{Comparison of data sets}
Logistic regression yield similar accuracy for LoL and DotA 2 while neural networks has better result on LoL than DotA 2. This result from logistic regression implies that in LoL and DotA 2, selection of individual characters have similar impact on game result. One possible explanation for higher accuracy in LoL data set when using neural networks is that the team composition in LoL focus more on the synergy between characters, thus considering more complicated relationship between characters gives better result.


\section{Plans and Requirement}

During our analysis, we realized that linear regression with current feature vector does not accurately represent a team composition. In linear regression, the decision rule is:
\[
w_0 + \sum_i w_i x_i <>0
\]
which means the algorithm only consider individual characters in the group instead of their combination. For example, if character A has a high win ratio, it will have a higher weight. However, if character A and B are not particularly strong as individual characters, but they synchronize well when they are played together, our logistic regression algorithm can not reflect this fact using a linear decision boundary. Due to this limitation, we plan to generate a new feature vector based on line-ups for the characters.

In addition, we will also try assign each character a score, representing their in-game performance.

{'fraction_non_alphanumeric': 0.061591672486614124, 'fraction_numerical': 0.006917423259835711, 'mean_word_length': 4.537753222836096, 'pattern_counts': {'":': 0, '<': 11, '<?xml version=': 0, '>': 11, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '6601421', 'n_tokens_mistral': 7662, 'n_tokens_neox': 7268, 'n_words': 4224}