文本匹配的文本挖掘

数据挖掘 机器学习 Python 数据挖掘 nlp 文本挖掘
2022-03-01 07:50:45

我是文本分析的新手,需要你的建议来帮助医学生正确和正确地写作。学生们在观察时描述疾病;但是,他们必须使用“官方疾病描述”。我有从学生那里收集的数据和正确的数据。让我解释:

我有一个 csv table1 包含 300K 行/一列:每一行是学生写的健康状况描述(他们可能是多余的)。

我有另一个表 2 包含近 200K 行和 3 列 第 1 列:条件的正式名称(学生应该使用的正确名称) 第 2 列:代码(数字) 第 3 列:“正式名称的翻译”条件”用另一种语言。

这个想法是从 table1 开始,将每一行与 N 个官方名称(及其代码和翻译)匹配。假设有 5 个按距离计算排名的官方名称。

我很困惑:我应该选择推荐引擎还是搜索/排名算法?

您可以确定哪些步骤来完成此任务?

PS:最终的输出可能是一个 API,学生开始编写疾病描述并获得他们可以选择的选项/建议列表。我希望我很清楚!谢谢

3个回答

FuzzyWuzzy将是一个很好的 Python 库。来自 GitHub 自述文件的代码示例:

>>> choices = ["Atlanta Falcons", "New York Jets", "New York Giants", "Dallas Cowboys"]
>>> process.extract("new york jets", choices, limit=2)
    [('New York Jets', 100), ('New York Giants', 78)]
>>> process.extractOne("cowboys", choices)
    ("Dallas Cowboys", 90)

我想您想使用extract限制为 5 的函数,并将choices其设置为等于 table2 csv 文件中的所有“官方名称”。

有关安装和使用的详细信息,请参见上面的链接。

这个想法是从 table1 开始,将每一行与 N 个官方名称(及其代码和翻译)匹配。假设有 5 个按距离计算排名的官方名称。

我建议不要使用 ML 分类器,因为如果只返回 5 个选项,您可能会排除 200k 官方名称中的一些。

有许多模糊文本匹配算法可以将您的行与正式名称匹配。FuzzyWuzzy和其他几种算法基于Levenshtein距离。您可以使用 for 循环遍历 200k 官方名称。根据有多少文本,这可能需要一段时间。对得分较低的列表和切片/弹出值进行排序,您将获得前 5 个最匹配的官方名称。我猜你想对每个官方名称的频率进行排名,并返回排名最高的作为第一个结果。

因为学生给出的健康描述可能是多余的,您可能需要运行Zipf 排名算法来过滤更常见的单词。

这个答案远未完成。欢迎评论。

谢谢大家,我一定会测试 FuzzyWuzzy Lib。同时请看一下我昨天做的代码(它可以被增强,如果你能做得更好,请继续:-

#define function to read the CSV files
def GetDocument(link):
    dataframe = pd.read_csv(link, encoding = "ISO-8859-1", sep = ';')
    return dataframe
#define function convert text/CSV data to lists 
def ColumnToList(column):
    return column.tolist()
#read document csv 
document1 = GetDocument('C:/Users/smegrhi/Desktop/DOC1.csv')
document2 = GetDocument('C:/Users/smegrhi/Desktop/DOC2.csv')
#get columns into lists
list1 = ColumnToList(document1['DIA_LBL'])
list2 = ColumnToList(document2['ICD10_LBL_FR'])

#Data pre-processing

def ProcessText(sentence):

    #Convert to lower case
    sentence = sentence.lower()
    #Convert www.* or https?://* to URL
    sentence = re.sub('((www\.[^\s]+)|(https?://[^\s]+))','',sentence)
#Convert 
    sentence = re.sub('@[^\s]+','',sentence)
#Remove additional white spaces
    sentence = re.sub('[\s]+', ' ', sentence)
#Replace 
    sentence = re.sub(r'#([^\s]+)', r'\1', sentence)
    return sentence


#execute
for i,text in enumerate(list1):
    res = ProcessText(text)
    list1[i] = res

#vectorize the data
WORD = re.compile(r'\w+')
#function vectorize data
def text_to_vector(text):
    words = WORD.findall(text)
    return Counter(words)

#calculate similarity
def get_cosine(vec1, vec2):
    intersection = set(vec1.keys()) & set(vec2.keys())
    numerator = sum([vec1[x] * vec2[x] for x in intersection])

    sum1 = sum([vec1[x]**2 for x in vec1.keys()])
    sum2 = sum([vec2[x]**2 for x in vec2.keys()])
    denominator = math.sqrt(sum1) * math.sqrt(sum2)

    if not denominator:
        return 0.0
    else:
        return float(numerator) / denominator

# compare sentence from list 1 with list 2 : Choose Indication from Data/DOC1 

text1 = list1[1]
#text1 = shigellose à shigella dysenteriae
vector1 = text_to_vector(text1)
listCosine = []
for i,text in enumerate(list2):
    vector2 = text_to_vector(text)
    cosine = get_cosine(vector1, vector2)
    listCosine.append(cosine)

结果没有那么糟糕也没有那么好......你的建议?