1つ、単語セグメンテーション(単語セグメンテーション)
1.単語セグメンテーションツール
- Jiebaの単語セグメンテーション:https://github.com/fxsjy/jieba
- SnowNLP:https://github.com/isnowfy/snownlp
- LTP:http://www.ltp-cloud.com/
- HanNLP:https://github.com/hankcs/HanLP/
- PKUseg
2.単語セグメンテーションアルゴリズム
単語セグメンテーションアルゴリズムは、既存の辞書ライブラリに基づいて文をセグメント化します
2.1フォワードマックスマッチング
短所:セマンティクスを考慮できない
2.2後方最大マッチング
前方最大一致と後方最大一致の確率は同じ90%です。
短所:セマンティクスを考慮できない
2.3セマンティクスの最大マッチングと考慮
最大マッチングアルゴリズムによって生成されたすべての単語セグメンテーション方法は、「言語モデル」を介して確率を計算するために使用されます。確率が高いほど、単語セグメンテーション方法は優れています。
- ステップ1:すべての単語セグメンテーション結果を生成する
- ステップ2:言語モデルから最適な単語セグメンテーション結果を選択する
短所:単語のセグメンテーションの組み合わせが多すぎるため、時間の複雑さが高くなります
2.4ビタビアルゴリズム(ビタビアルゴリズム)
ビタビアルゴリズム(ビタビアルゴリズム)は本質的に動的計画法(動的計画法)です
最短経路を計算する
2.スペル修正
1.距離を編集する
動的計画法に基づく
編集距離を使用して、2つの文字列の類似性を計算できます。これには多くのアプリケーションシナリオがあり、その1つがスペル修正です。編集距離の定義は、2つの文字列str1とstr2が与えられた場合、str1をstr2に変換するための最小コストを計算する必要があるということです。
例えば:
入力:str1 = "geek"、str2 = "gesek"
出力:1 「s」を
挿入してstr1をstr2に変換します
入力:str1 = "cat"、str2 = "cut"
出力:1a
をuに置き換えてstr2を取得します
入力:str1 = "日曜日"、str2 = "土曜日"
出力:3
3つの異なる操作を想定しています。1。新しい文字を挿入します。2。文字を置き換えます。3。文字を削除します。各操作のコストは1です。
# 基于动态规划的解法
def edit_dist(str1, str2):
# m,n分别字符串str1和str2的长度
m, n = len(str1), len(str2)
# 构建二维数组来存储子问题(sub-problem)的答案
dp = [[0 for x in range(n+1)] for x in range(m+1)]
# 利用动态规划算法,填充数组
for i in range(m+1):
for j in range(n+1):
# 假设第一个字符串为空,则转换的代价为j (j次的插入)
if i == 0:
dp[i][j] = j
# 同样的,假设第二个字符串为空,则转换的代价为i (i次的插入)
elif j == 0:
dp[i][j] = i
# 如果最后一个字符相等,就不会产生代价
elif str1[i-1] == str2[j-1]:
dp[i][j] = dp[i-1][j-1]
# 如果最后一个字符不一样,则考虑多种可能性,并且选择其中最小的值
else:
dp[i][j] = 1 + min(dp[i][j-1], # Insert
dp[i-1][j], # Remove
dp[i-1][j-1]) # Replace
return dp[m][n]
三、ストップワード削除
NLPアプリケーションの場合、通常、頻度の低いストップワードと語彙が最初に除外されます。
特徴選択のプロセスと同様
成熟したツールがあります:NLTKストップボキャブラリー
4.ステミング(単語の標準化)
成熟したツールがあります
https://tartarus.org/martin/PorterStemmer/java.txt
5、文の類似性(文の類似性)
1.ユークリッド距離
2.コサインの類似性
参考資料:
中国語の単語セグメンテーションエンジンのJava実装-順方向最大、逆方向最大、双方向最大マッチング方法
スペル修正とノイズの多いチャネル